需求项目中需要用到跑马灯来仅展示一条消息,长度合适则不滚动,过长则循环滚动。虽然不是我写的,但看了看代码,是在一个UIView里面放入两个UILabel,在前一个快结束的时候,另一个显示。然而点击处理的 确是UIView的点击事件。 然而看到比如地铁、公交里面 ...
需求
项目中需要用到跑马灯来仅展示一条消息,长度合适则不滚动,过长则循环滚动。
虽然不是我写的,但看了看代码,是在一个UIView里面放入两个UILabel,
在前一个快结束的时候,另一个显示。然而点击处理的 确是UIView的点击事件。
然而看到比如地铁、公交里面的跑马灯是分了很多段显示的。虽然说可以将多段合并为一段来显示,
但是如果各个需要点击事件又该如何处理呢?于是我来自己实现可点击的多段跑马灯。
所以这篇随笔我要实现的跑马灯包含下面这种效果:(图中有5段 点击不同文本可触发相应的事件)
弯路
还记得上一篇随笔【IOS】将字体大小不同的文字底部对齐 么?
虽然不能够做到多个UILabel的底部对齐,但是我们可以通过继承UILabel来改变文本竖直方向的位置。
所以呢,我最初的想法是继承UILabel,可以保持其继承性, 通过NSTimer来直接慢慢移动UILable里面的文本。
这里出现了两个问题:(以@"这是自定义跑马灯里面要移动的文本"为例)
1.移动是可以移动,但是在文本左移至快要看不见(只剩下"移动的文本")的时候, 如何让@"这是.."开始从右侧出现呢?
2.文本过长的时候,看不见的部分将被截断,所以在移动的时候,只有部分文本了。
第一种好像没有办法,UILabel只存在一个文本的bounds, 不可能让他一部分在左边, 一部分在右边。
第二种就因为存在默认的属性NSLineBreakMode:NSLineBreakByWordWrapping,就算不截断文本也只会变为省略号。
所以这种方法作罢。。。。
实现
首先要明确的是本跑马灯继承了UIView且需要两个UILabel、定时器NSTimer。
在初始化时,传入字符串数组,并计算各个字符串的自适应大小
CGRect textRect = [((NSString *)_textArray[i]) boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:kFont} context:nil];[_textRectArray addObject:[NSValue valueWithCGRect:textRect]];
//相关方法:
原标题:【IOS】自定义可点击的多文本跑马灯YFRollingLabel
关键词:IOS
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。