一直想总结一下平时做过的功能、项目。苦于没有时间,所以一直也就搁下了。昨天把最近几天的工作任务都做完了,抽点时间来总结一下。
上个星期要做个类,实现label字的滚动功能。其实可以用scrollview, calayer等方法做,不过我由于实现的动画不复杂,且规定类必须继承于UILabel,所以我是这样做的,在label里嵌套一个label,让里面的label滚动。动画就用UIView动画。
具体需求如下:
1.类必须继承于UILabel
2.提供两种滚动方式,一种是循环向左滚动,另一种是向左滚到头再自动向右回滚。
3.提供一个方法接口,可以调用设置滚动模式和滚动速度。
4.当字超过外面Label的宽度时,显示为滚动,当不超过时,字居中显示,不滚动。
代码主要有以下几个部分:
1.根据传递的text计算并设置insideLabel的大小:
1 CGSize textSize= [insideLabel.text sizeWithFont:insideLabel.font constrainedToSize:CGSizeMake(9999,self.frame.size.height) lineBreakMode:UILineBreakModeWordWrap]; 2 [insideLabel setFrame:CGRectMake(0,0,textSize.width,self.frame.size.height)];
2.根据textsize的宽度分别进行动画设置,我是这样写的:
1 if (textSize.width > self.frame.size.width) 2 { 3 [insideLabel setFrame:CGRectMake(0,0,textSize.width,self.frame.size.height)]; 4 // insideLabel.textColor=[UIColor blackColor]; 5 [self addSubview:insideLabel]; 6 float textDuration; 7 8 scrollSpeed =speed; 9 textDuration =(insideLabel.frame.size.width+self.frame.size.width )/ scrollSpeed; 10 CGRect frame = insideLabel.frame; 11 frame.origin.x = self.frame.size.width; 12 insideLabel.frame = frame; 13 14 [UIView beginAnimations:@"testAnimation" context:NULL]; 15 [UIView setAnimationDuration:textDuration]; 16 [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 17 [UIView setAnimationDelegate:self]; 18 [UIView setAnimationRepeatAutoreverses:ScrollWhetherReverse]; 19 [UIView setAnimationRepeatCount:HUGE_VALF]; 20 21 frame = insideLabel.frame; 22 frame.origin.x = -(insideLabel.frame.size.width); 23 insideLabel.frame = frame; 24 [UIViewcommitAnimations];}
25 else
26 { 27 28 [insideLabel setFrame:CGRectMake(0,0,self.frame.size.width,self.frame.size.height)]; 29 insideLabel.textAlignment=self.textAlignment; 30 // insideLabel.textColor=[UIColor blackColor]; 31 [self addSubview:insideLabel]; 32 }
我做了个简单Demo测试了一下,是可以的。
但是当我在具体的项目中使用这个类,却出现了一个头疼的问题。一开始会是正常的,但是当text改变时,如果text长度大于外面的Label,那么接下来无论text长度是否大于外面的Label宽度,都会滚动显示,而不会居中不滚动了。于是我便在else里面重新写一个动画,设置动画的滚动速度为0,但是依旧没有用。后来才明白,动画已经上面启动了,所以下面else再怎么设置显然都是没有用处的。这样写就可以了实现对同一对象的不同控制了:
1 [UIView beginAnimations:@"testAnimation" context:NULL]; 2 [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 3 [UIView setAnimationRepeatAutoreverses:ScrollWhetherReverse]; 4 5 if (textSize.width > self.frame.size.width) 6 { 7 [insideLabel setFrame:CGRectMake(0,0,textSize.width,self.frame.size.height)]; 8 // insideLabel.textColor=[UIColor blackColor]; 9 [self addSubview:insideLabel]; 10 float textDuration; 11 12 scrollSpeed =speed; 13 textDuration =(insideLabel.frame.size.width+self.frame.size.width )/ scrollSpeed; 14 CGRect frame = insideLabel.frame; 15 frame.origin.x = self.frame.size.width; 16 insideLabel.frame = frame; 17 18 [UIView setAnimationDuration:textDuration]; 19 [UIView setAnimationRepeatCount:HUGE_VALF]; 20 21 frame = insideLabel.frame; 22 frame.origin.x = -(insideLabel.frame.size.width); 23 insideLabel.frame = frame; 24 } 25 else 26 { 27 [UIView setAnimationDuration:0]; 28 [UIView setAnimationRepeatCount:0]; 29 30 [insideLabel setFrame:CGRectMake(0,0,self.frame.size.width,self.frame.size.height)]; 31 insideLabel.textAlignment=self.textAlignment; 32 // insideLabel.textColor=[UIColor blackColor]; 33 [self addSubview:insideLabel]; 34 } 35 [UIView commitAnimations];
这个问题虽然不大,但是却耽误了我很久,在此做个总结,也希望大家不要犯我同样的错误。