Ios 在状态之间向UIButton添加动画

Ios 在状态之间向UIButton添加动画,ios,cocoa-touch,cocoa,Ios,Cocoa Touch,Cocoa,我有一个具有两种状态的按钮(我使用“选定”状态切换按钮)。我想动画之间的状态转换时,用户点击按钮 我有一个构成动画的图像列表-将动画添加到按钮的逻辑是什么?子类UIButton,通过以下方式覆盖setSelected方法: -(void)setSelected:(BOOL)selected{ self.enabled = NO; // disable btn until animation finished [self setBackgroundImage:nil forStat

我有一个具有两种状态的按钮(我使用“选定”状态切换按钮)。我想动画之间的状态转换时,用户点击按钮


我有一个构成动画的图像列表-将动画添加到按钮的逻辑是什么?

子类UIButton,通过以下方式覆盖
setSelected
方法:

-(void)setSelected:(BOOL)selected{
    self.enabled = NO; // disable btn until animation finished
    [self setBackgroundImage:nil forState:UIControlStateNormal];
    [self setBackgroundImage:nil forState:UIControlStateSelected];

    NSArray *imageNames;

    // hardcoded frames sequences is for clarity ofcourse =)
    if (selected){
        // direct frames sequence
        imageNames = @[@"normalBG", @"frame0", @"frame1", @"frame2", @"selectedBG"];
    } else {
        // reversed frames sequence
        imageNames = @[@"selectedBG", @"frame2", @"frame1", @"frame0", @"normalBG"];
    }
    NSTimeInterval animationDuration = (float)imageNames.count/YOUR_ANIMATION_FPS;

    NSMutableArray *imageBuffer = [NSMutableArray arrayWithCapacity:imageNames.count];
    NSMutableArray *timeBuffer = [NSMutableArray arrayWithCapacity:imageNames.count];

    [imageNames enumerateObjectsUsingBlock:^(NSString *name, NSUInteger idx, BOOL *stop) {
        [imageBuffer addObject:(__bridge id)[UIImage imageNamed:name].CGImage];
        [timeBuffer addObject:@( (float)(idx)/(imageNames.count-1) )];
    }];

    NSArray *images = [NSArray arrayWithArray:imageBuffer];
    NSArray *times = [NSArray arrayWithArray:timeBuffer];
    imageBuffer = nil;
    timeBuffer = nil;


    CAKeyframeAnimation *framesAnimation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
    framesAnimation.values = images;
    framesAnimation.keyTimes = times;
    framesAnimation.calculationMode = kCAAnimationLinear;
    framesAnimation.removedOnCompletion = YES;
    framesAnimation.fillMode = kCAFillModeForwards;
    framesAnimation.duration = animationDuration;


    [CATransaction begin];
    [CATransaction setCompletionBlock:^{
        [super setSelected:selected];
        if (selected){
            [self setBackgroundImage:[UIImage imageNamed:@"selectedBG"] forState:UIControlStateSelected];
            [self setBackgroundImage:nil forState:UIControlStateNormal];
        } else {
            [self setBackgroundImage:nil forState:UIControlStateSelected];
            [self setBackgroundImage:[UIImage imageNamed:@"normalBG"] forState:UIControlStateNormal];
        }
        self.enabled = YES;
    }];
    [self.layer addAnimation:framesAnimation forKey:@"contents"];
    [CATransaction commit];
}
不要忘记设置初始背景图像,即,
[self-setBackgroundImage:[UIImage-imageNamed:@“normalBG”]forState:uicontrolstateformal]在按钮的
init
方法中