一直想總結一下平時做過的功能、項目。苦於沒有時間,所以一直也就擱下了。昨天把最近幾天的工作任務都做完了,抽點時間來總結一下。
上個星期要做個類,實現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];
這個問題雖然不大,但是卻耽誤了我很久,在此做個總結,也希望大家不要犯我同樣的錯誤。