ios – 滚动文本 – 自定义动画

前端之家收集整理的这篇文章主要介绍了ios – 滚动文本 – 自定义动画前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在互联网上搜索了几个小时,我无法找到一个好的解决方案.

我尝试从左到右滚动我的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更新.

编辑:如果您的字符串在此动画期间未更改,请计算文本大小一次并将其存储在实例变量中.在每次调用方法期间计算字符串的大小可能很昂贵.

猜你在找的iOS相关文章