Xcode5 - 自动切换按钮边框颜色

时间:2014-08-27 23:00:24

标签: ios objective-c

我是IOS编程新手。 我想在应用程序启动时自动切换按钮边框颜色以吸引用户注意, 我尝试了以下代码,但只选择了最终颜色。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.


    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDelay:0.0];
    [UIView setAnimationDuration:3.0];
    button.layer.borderWidth=2.5f;
    button.layer.borderColor=[[UIColor blueColor]CGColor];
    [UIView setAnimationDelay:3.0];
    button.layer.borderColor=[[UIColor clearColor]CGColor];
    [UIView setAnimationDelay:6.0];
    button.layer.borderColor=[[UIColor redColor]CGColor];
    [UIView commitAnimations];
}

2 个答案:

答案 0 :(得分:1)

您正在做的是链接动画的无效方式。因此,仅应用最后的更改。此外,您应该使用基于块的动画,这是Apple自iOS 4以来推荐的动画。应该是这样的:

[UIView animateWithDuration:3.0 animations:^{
    button.layer.borderWidth=2.5f;
    button.layer.borderColor=[[UIColor blueColor]CGColor];
} completion:^(BOOL finished) {
    [UIView animateWithDuration:3.0 animations:^{
        button.layer.borderColor=[[UIColor clearColor]CGColor];
    }  completion:^(BOOL finished) {
        [UIView animateWithDuration:3.0 animations:^{
            button.layer.borderColor=[[UIColor redColor]CGColor];
        }];
    }];
}];

答案 1 :(得分:1)

这个答案与 0x7fffffff 的答案相同,只不过它使用了块变量,所以它看起来更清晰,希望更有意义:

void (^animateToRed)(BOOL finished) = ^(BOOL finished) {
    [UIView animateWithDuration:3.0 animations:^{
        button.layer.borderColor=[[UIColor redColor]CGColor];
    } completion: nil];
}

void (^animateToClear)(BOOL finished) = ^(BOOL finished) {
    [UIView animateWithDuration:3.0 animations:^{
        button.layer.borderColor=[[UIColor clearColor]CGColor];
    }  completion:animateToRed];
}

[UIView animateWithDuration:3.0 animations:^{
    button.layer.borderWidth=2.5f;
    button.layer.borderColor=[[UIColor blueColor]CGColor];
} completion:animateToClear];

UIView' animateWithDuration:animations:completion:方法是随时间变化动画的最佳方式。

需要3个参数。

  • 作为CGFloat的持续时间,它是以秒为单位的动画长度的度量。
  • 动画块,用于说明要执行的动画。
  • 完成块,允许您在动画完成后执行代码。

此代码段创建两个完成块。

animateToRed完成块处理边框动画为红色。它的完成块是nil,此时我们已完成动画制作。

animateToClear完成块处理要清除边框的动画。它的完成块是我们刚刚定义的animateToRed

最后,我们调用animateWithDuration,将边框设置为蓝色,然后传递animateToClear块以完成(反过来调用animateToRed块)。

对于这个简单且没有重复动画的动画,以这种方式执行它可能看起来有点过分(尽管它稍微更具可读性)。然而,对于一系列更复杂的动画,特别是如果有任何重复性,创建像这样的块变量来使用和快速传递会变得非常有用。