代码之家  ›  专栏  ›  技术社区  ›  wh1t3cat1k

设置uibutton选择的动画

  •  1
  • wh1t3cat1k  · 技术社区  · 14 年前

    莫斯科之夜,大家好!

    我仍然不熟悉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. 什么可以解决这个问题?

    ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————---

    我试过这种代码,但也不管用:

    // ------------------------
    // --- 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 回复  |  直到 14 年前
        1
  •  2
  •   Daddy    14 年前
    //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];
    }
    
        2
  •  1
  •   Brad    14 年前

    不是 全部的 uiview的属性是可动画的-我不认为“突出显示”或“选定”是。

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

    试着调整alpha,你会发现它会起作用。

        3
  •  1
  •   Daddy    14 年前

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

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

    从苹果的文档中:

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

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

    动画ID

    包含可选应用程序提供的标识符的nsstring。这是传递给beginimations:context:method的标识符。这个论点可以是零。

    完成

    包含布尔值的nsnumber对象。如果动画在停止前运行到完成状态,则该值为“是”,否则为“否”。

    上下文

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

    动画完成后,将调用回调animationdIdStop并在字符串@“animatein”中传递。您可以使用该方法检查调用了哪个动画,并在那里处理它。