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

标签 ios animation text uiview scroll

我在互联网上搜索了几个小时,但找不到好的解决方案。

我尝试在 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];


}

现在的问题是, View 不会更新 :( 我不确定这是否是此类动画的最佳方法。

最佳答案

我认为您的 View 没有更新,因为您永远不会中断递归,因此运行循环永远不会完成迭代。比递归方法更好的解决方案可能是使用 NSTimer 每隔 1/30 或 1/60 秒触发一次函数,使用 +[NSTimer timerWithTimeInterval:target :selector:userInfo:repeats:].

如果你想保留这里的递归结构,你可以使用 -[NSObject performSelector:withObject:afterDelay:] 在延迟后调用你的函数。只需使用类似 1/60.0 的延迟,并将您需要的任何信息打包到字典或数组中以传递给 withObject: 参数。

这些方法中的任何一个都会将您的方法注册到运行循环中,以便稍后调用。这允许运行循环开始新的迭代,这意味着可以进行 UI 更新。

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

关于ios - 滚动文本 - 自定义动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7897983/

相关文章:

animation - 将 animateColor 应用于多个 SVG 元素

html - 在 Moz (firefox 4) 中需要有关关键帧动画 css3 的帮助

c - 二进制文件和文本文件在存储方面的区别?

python - 检测就职演说语言中的典故(例如非常模糊的匹配)

未初始化实例变量的ios swift init

iphone - 关于弱引用和保留循环的说明

ios - 允许在没有标注附件 View 的情况下点击注释标注上的任意位置

javascript - 当在视口(viewport)上可见时,在链中延迟 CSS 动画

python - 从 txt 文件创建数组

iphone - 为什么后台任务10分钟后结束