UIView animateWithDuration递归导致抖动

时间:2013-01-13 21:32:33

标签: ios objective-c

我试图将属性设置为原子,但它似乎无论如何都不起作用。这是代码。它会移动一个标签,显示正在播放的歌曲名称。有时它开始抖动,好像标签应该同时在两个地方。任何线索?一些锁定属性可能......

- (void)animateSongLabel
    {
        if (!self.player.rate) {

            [UIView animateWithDuration:.5 animations:^{

                self.songLabel.left = 25.f;
            }];
            return;
        }

        [UIView animateWithDuration:.25 delay:0. options:UIViewAnimationOptionCurveLinear animations:^{

             self.songLabel.left -= 15.f;

        } completion:^(BOOL finished) {

            if (self.songLabel.right < -10.f) {

                self.songLabel.left = 320.f;
            }
            [self animateSongLabel];
        }];
    }

1 个答案:

答案 0 :(得分:1)

最简单的制作文本的方法就是显示动画UIImage或动画UIImageView - 尤其是前者,因为它可以永久地动画,这可能就是你想要的。通过每次稍微偏移文本来生成代码中的连续UIImage对象,并将它们传递给animatedImageWithImages:duration:。现在无论你在哪里展示这个图像,都会有动画效果。

这里有一些示例代码可以帮助您入门(调整以获得您想到的效果):

NSString* s = @"Mister Dobbalena, Mister Bob Dobbalena";
NSMutableArray* marr = [NSMutableArray array];
UIFont* f = [UIFont fontWithName:@"Helvetica" size:12];
float w = [s sizeWithFont:f].width;
for (int offset = 0; offset < w; offset++) {
    UIGraphicsBeginImageContextWithOptions(self.iv.frame.size, NO, 0);
    [s drawAtPoint:CGPointMake(10-offset,20) withFont:f];
    [marr addObject: UIGraphicsGetImageFromCurrentImageContext()];
    UIGraphicsEndImageContext();
}
UIImage* im = [UIImage animatedImageWithImages:marr duration:20];
self.iv.image = im;