我在互联网上搜索了几个小时,我无法找到一个好的解决方案.
我尝试从左到右滚动我的UIView上的文本,反之亦然.我不想使用CoreAnimations,因为我需要控制动画.
该运动遵循正弦曲线,0到pi或0-> 1-> 0.
实现该自定义动画的最佳方法是什么?
经过一些研究后我想出的是一种递归算法,它将其称为自我并经历循环,直到完成.
- (void) scrollText:(id)sender timeConstant:(float) _timeconstant timeOffset:(NSDate*) _timeoffset direction:(int)_direction { float p = [[NSDate date] timeIntervalSinceDate:_timeoffset] / _timeconstant * _direction; float ps = sinf( p * M_PI); CGSize txtsize = [msg_text sizeWithFont:font]; float offset = txtsize.width / 2; float screenwidth = self.view.frame.size.width; float screenheight= self.view.frame.size.height; int virtualwidth = txtsize.width; [ivText setFrame:CGRectMake(screenwidth/2 - offset + (virtualwidth / 2 * ps),100,txtsize.width,txtsize.height)]; //redraw [[self view] setNeedsDisplay]; //keep going if (ps * _direction > 0) [self scrollText:self timeConstant:_timeconstant timeOffset:_timeoffset direction:_direction]; }
现在的问题是,视图不会更新:(我不确定这是否是这种动画的最佳方法.
解决方法
我认为你的视图没有更新,因为你永远不会打破递归,因此运行循环永远不会完成迭代.比递归方法更好的解决方案可能是使用NSTimer,使用[NSTimer timerWithTimeInterval:target:selector:userInfo:repeats:]每隔一次,例如1/30或1/60秒触发您的函数.
如果你想保留你在这里的递归结构,你可以使用 – [NSObject performSelector:withObject:afterDelay:]在延迟后调用你的函数.只需使用1 / 60.0之类的延迟,并将所需的任何信息打包到字典或数组中以传递给withObject:参数.
这些方法中的任何一个都使用运行循环注册您的方法以便稍后调用.这允许运行循环开始新的迭代,这意味着可以发生UI更新.
编辑:如果您的字符串在此动画期间未更改,请计算文本大小一次并将其存储在实例变量中.在每次调用方法期间计算字符串的大小可能很昂贵.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。