动画选择UIButton

时间:2010-11-09 16:25:52

标签: iphone objective-c animation uiview uibutton

好好的莫斯科晚会给大家!

我还不熟悉iPhone动画的原理(顺便说一下,有没有人知道关于这个的大而精彩的教程?),但是在我的项目中我想做按钮“突出显示 - 不突出显示”闪烁以通知用户它的标签已经改变了。

此代码不执行任何操作(它只是闪烁动画的一个片段):

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration: 0.5]; 

[button setHighlighted: YES];

[UIView commitAnimations];

这一个突出显示按钮,但不以动画形式显示:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration: 0.5]; 

[button setSelected: YES];

[UIView commitAnimations];

任何人都可以帮助我并说:

  1. 这段代码出了什么问题?
  2. 什么能解决问题?
  3. -----------------------------------更新----------- -------------------

    我试过那种代码,但它也不起作用:

    // ------------------------
    // --- animation ----------
    // ------------------------
    
    - (void)animateIn
    {
    [UIView beginAnimations: @"animateIn" context:nil]; 
    [UIView setAnimationDuration: 0.2];
    
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; 
    
    [control setBackgroundColor:[UIColor blackColor]];
    
    [UIView commitAnimations];
    }
    
    - (void)animateOut
    {
    [UIView beginAnimations: @"animateOut" context:nil];    
    [UIView setAnimationDuration: 0.2];
    
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; 
    
    [control setBackgroundColor:[UIColor whiteColor]];
    
    [UIView commitAnimations];
    }
    
    
    - (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
    {
    if([animationID isEqualToString: @"animateIn"])
    {
        [self animateOut];
        return;
    }
    else if ([animationID isEqualToString: @"animateOut"])
    {
        cycleCount++;
    
        if(cycleCount < 3)
            [self animateIn];
        else
            cycleCount = 0;
    
        return;
    }
    }
    
    @end
    

3 个答案:

答案 0 :(得分:2)

//isFlickerOn is declared in .h file as BOOL isFlickerOn;
//flickerTimer is declared in .h file as NSTimer *flickerTimer;
//flickerCount is declared in .h file as int flickerCount; 
//control is a UILabel, UIButton background color is really hard to notice
//especially the roundedRect UIButton, so I just flickered a UILabel's textColor

-(void)flickerOn {
    if (flickerCount < 5) 
    {
    flickerCount++;
         if (!isFlickerOn)
        {
            [control setTextColor:[UIColor yellowColor]];
            isFlickerOn = YES;
        } 
        else
        {
            [control setTextColor:[UIColor blueColor]];
            isFlickerOn = NO;   
        }
    }
    else 
    {
        [flickerTimer invalidate];
    }
}


-(void)flickerAnimation {
    flickerCount = 0;
    flickerTimer = [NSTimer scheduledTimerWithTimeInterval:0.3f target:self selector:@selector(flickerOn) userInfo:nil repeats:YES];
}

答案 1 :(得分:1)

不是 UIView的所有属性都是可动画的 - 我不相信“突出显示”或“选中”。

通常,它可用于非布尔值,例如“center”,“alpha”,“frame”和“bounds”。

尝试改为调整alpha,你会发现它会起作用。

答案 2 :(得分:1)

您需要创建一个在第一个动画结束时执行的回调方法。您使用该回调来创建取消选择的动画。请记住,没有像透明度那样渐进的“选择状态”。你必须使用

[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
[UIView beginAnimations:@"animateIn" context:NULL];

来自Apple的文档:

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {

您的方法必须采用以下参数:

animationID

包含可选应用程序提供的标识符的NSString。这是传递给beginAnimations:context:方法的标识符。这个论点可以是零。

完成

包含布尔值的NSNumber对象。如果动画在停止之前运行完成,则值为YES;如果动画没有,则返回NO。

上下文

可选的应用程序提供的上下文。这是传递给beginAnimations:context:方法的上下文数据。这个论点可以是零。

动画结束后,调用回调animationDidStop并传入字符串@“animateIn”。您可以使用该方法来检查调用哪个动画并在那里处理。