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
方法中