首先感谢cocoa china的划向彼岸(http://www.cocoachina.com/bbs/read.php?tid-15816-keyword-%C5%DC%C2%ED%B5%C6.html)的sample
因为我的需求不同,需要多个view的跑马灯,那么就得修改,首先是多个view的问题,大概思路是两个动画,先让所有的view先从各自的初始位置开始移动,当origin.x到320就让它从0-width开始,第一个动画需用到结束函数,根据animationID取出view,再进行第二个动画,具体如下:
第一个动画,即从初始位置移动至320,animationID保存index,只一次动画
for(int i=0;i<320/originWidth+1;i++){ UIView *paomaView=[[UIView alloc] initWithFrame:CGRectMake(0-originWidth+i*originWidth, 0, originWidth, self.view.frame.size.height)]; paomaView.backgroundColor=[UIColor clearColor]; paomaView.userInteractionEnabled=YES; [self.view addSubview:paomaView]; [paomaViewArray addObject:paomaView]; UILabel *lab=[[UILabel alloc] initWithFrame:paomaView.bounds]; lab.text=[titleArray objectAtIndex:i]; lab.textColor=[UIColor whiteColor]; lab.font=[UIFont systemFontOfSize:15]; lab.backgroundColor=[UIColor clearColor]; lab.userInteractionEnabled=YES; [paomaView addSubview:lab]; [UIView beginAnimations:[NSString stringWithFormat:@"%d",i] context:NULL]; [UIView setAnimationDuration:speed*(320-paomaView.frame.origin.x)]; [UIView setAnimationCurve:UIViewAnimationCurveLinear]; [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector:@selector(animDone:finished:context:)]; frame = paomaView.frame; frame.origin.x = 320; paomaView.frame = frame; [UIView commitAnimations]; [paomaView release]; }
第二个动画,无限循环
-(void)animDone:(NSString*)animationID finished:(NSNumber*)finished context:(void*)context { UIView *paomaView=[paomaViewArray objectAtIndex:[animationID intValue]]; CGRect frame = paomaView.frame; frame.origin.x = 0-originWidth; paomaView.frame = frame; [UIView beginAnimations:@"animation1" context:NULL]; [UIView setAnimationDuration:speed*(320+originWidth)]; [UIView setAnimationCurve:UIViewAnimationCurveLinear]; [UIView setAnimationDelegate:self]; [UIView setAnimationRepeatAutoreverses:NO]; [UIView setAnimationRepeatCount:999999]; frame = paomaView.frame; frame.origin.x = 320; paomaView.frame = frame; [UIView commitAnimations]; }
以上作为显示信息是没问题的,但是用户需求一般不会仅限于此...他们会想--点击,好吧,把label换成button,问题就来了:在animation中button的初始和结尾的位置其实从开始就确定了,它只是加了一个duration来执行动画,这个运动的过程button的touch点击是不响应的...多次换关键词google,找到stack overflow上有人也有同样的问题(cocoa touch - iPhone UIView Animation Disables UIButton Subview - Stack Overflow),上面说make animation yourself...
好吧,就用NSTimer模拟animation:
UIButton *btn=[UIButton buttonWithType:UIButtonTypeRoundedRect]; btn.frame=paomaView.bounds; btn.tag=i; [btn addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; [paomaView addSubview:btn]; [NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(moveViewByTimer:) userInfo:paomaView repeats:YES];
timer的执行:
-(void)moveViewByTimer:(NSTimer *)timer{ UIView *view=[timer userInfo]; CGRect frame=view.frame; if(frame.origin.x>=320){ frame.origin.x=0-originWidth; view.frame=frame; } frame.origin.x+=1;//0.005/speed; view.frame=frame; NSLog(@"origin x is %f",view.frame.origin.x); }
值得注意的是timer的时间间隔和速度,发现:当TimeInterval小于0.01的时候运动会有问题,button不会平行运动,他们会不断贴近,重叠...估计是for循环时timer是先后创建的,
这之间有间隔,当TimeInterval小于这个间隔的时候,timer就不能看作是平行的了,当然这只是估计.另外文档上"貌似"也这样说:
Because of the various input sources a typical run loop manages, the effective resolution of the time interval for a timer is limited to on the order of 50-100 milliseconds(不知道咋翻译才对...)
跑起来是没问题了,就某些细节还不能很好的理解(TimeInterval...),姑且用之吧