在开发的过程中,我们经常会遇到这样的需求,label
显示的区域是一定的,但是内容text
是不固定的,可能很长,长到这个label
根本显示不下当前的内容,这种情况通常有两种处理方案:一是我们设置lineBreakMode
属性,这是个枚举,我们可以根据产品的设计进行不同的方式处理,如下图(处理后对应的格式可以参照图中的注释):
第二种处理方案就是让这个label
滚动显示,这就是今天要介绍的。 让label
滚动大致的思路就是创建一个UIView
,然后再这个UIView
上创建两个label
,让这个两个label
反复的显示。
下面我们具体的讲一下流程: 首先创建一个继承UIView
的子类LBScrollLabel
,考虑到label
有可能朝着上下左右四个方向滚动,所以在这里我定义了一个枚举:
1 2 3 4 5 6 typedef NS_ENUM (NSInteger ,LBScrollLabelDirection) { LBScrollLabelDirection_Top, LBScrollLabelDirection_Bottom, LBScrollLabelDirection_Left, LBScrollLabelDirection_Right, };
然后我们创建两个UILabel
,分别命名成aLabel
和bLabel
吧,初始化完成之后,我们把两个label
的frame
设置的和LBScrollLabel
的一样大并且添加到LBScrollLabel
上,具体默认的摆放,如下图:
然后我们可以给label
赋值,考虑到label.text
的文字可能很长,所以我们需要针对处理,具体的规则就是当text
的长度小于等于LBScrollLabel
的长度时候,我们把aLabel
和bLabel
的长宽设置和LBScrollLabel
相等就行了,如果text
的长度大于LBScrollLabel
的长度时候,我们需要按照text
的长度来设置aLabel
和bLabel
的长度,具体代码实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - (void )handelLabeltextLength { if (self .direction == LBScrollLabelDirection_Top || self .direction == LBScrollLabelDirection_Bottom) { _aLabel.frame = CGRectMake (_aLabel.frame.origin.x, _aLabel.frame.origin.y, width, height); _bLabel.frame = CGRectMake (_bLabel.frame.origin.x, _bLabel.frame.origin.y, width, height); }else if (self .direction == LBScrollLabelDirection_Left || self .direction == LBScrollLabelDirection_Right) { [_aLabel sizeToFit]; [_bLabel sizeToFit]; if (CGRectGetWidth (_aLabel.frame) <= width) { _aLabel.frame = CGRectMake (_aLabel.frame.origin.x, _aLabel.frame.origin.y, width, height); _bLabel.frame = CGRectMake (_bLabel.frame.origin.x, _bLabel.frame.origin.y, width, height); }else { _aLabel.frame = CGRectMake (_aLabel.frame.origin.x, _aLabel.frame.origin.y, CGRectGetWidth (_aLabel.frame), height); _bLabel.frame = CGRectMake (CGRectGetMaxX (_aLabel.frame), _bLabel.frame.origin.y, CGRectGetWidth (_aLabel.frame), height); } } }
然后我们在LBScrollLabel.h
文件中定义一个方法- (void)beginScrollWithDirection:(LBScrollLabelDirection)direction;
,来控制label
滚动