- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我已经实现了一个按钮微动动画。按下一个按钮会摇晃,但问题是动画不会停止并且在 [self.layer removeAllAnimations] 中出现错误;下面是代码;
-(IBAction)button1Clicked:(id)sender
{
UIButton *no1 =sender;
output= [self answerCheck:no1.titleLabel.text];
self.label.text=output;
[self enableOptions:NO];
[self loadingView];
[self startJiggling:2];
}
- (void)startJiggling:(NSInteger)count
{
CGAffineTransform leftWobble = CGAffineTransformMakeRotation(degreesToRadians( kAnimationRotateDeg * (count%2 ? +1 : -1 ) ));
CGAffineTransform rightWobble = CGAffineTransformMakeRotation(degreesToRadians( kAnimationRotateDeg * (count%2 ? -1 : +1 ) ));
CGAffineTransform moveTransform = CGAffineTransformTranslate(rightWobble, -kAnimationTranslateX, -kAnimationTranslateY);
CGAffineTransform conCatTransform = CGAffineTransformConcat(rightWobble, moveTransform);
self.btnOption1.transform = leftWobble; // starting point
[UIView animateWithDuration:0.1
delay:(count * 0.08)
options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse
animations:^{ self.btnOption1.transform = conCatTransform; }
completion:nil];
[self stopJiggling];
}
-(void)stopJiggling
{
[self.btnOption1.layer removeAllAnimations];
self.btnOption1.transform = CGAffineTransformIdentity; // Set it straight
}
最佳答案
您正在 self.btnOption1
上设置动画,因此您需要将其从 self.btnOption1
中删除:
- (void)stopJiggling {
[self.btnOption1.layer removeAllAnimations];
self.btnOption1.transform = CGAffineTransformIdentity;
}
但实际上如果你只是设置transform
按钮的属性,在动画 block 之外,它将删除动画:
- (void)stopJiggling {
self.btnOption1.transform = CGAffineTransformIdentity;
}
(这在我的测试项目中有效。)
我注意到您延迟开始动画,并且您正在调用 stopJiggling
在您调用 animateWithDuration:...
后立即 .我不知道你为什么使用延迟或为什么你调用 stopJiggling
立即。
我创建了一个测试用例来匹配您的代码:
@implementation ViewController {
__unsafe_unretained IBOutlet UIButton *btnOption1;
}
- (IBAction)startJiggling {
btnOption1.transform = CGAffineTransformMakeRotation(-.1);
[UIView animateWithDuration:.1 delay:2 * 0.08 options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse animations:^{
btnOption1.transform = CGAffineTransformMakeRotation(.1);
} completion:nil];
[self stopJiggling];
}
- (void)stopJiggling {
[btnOption1.layer removeAllAnimations];
btnOption1.transform = CGAffineTransformIdentity;
}
@end
我连接了我的 btnOption1
ivar 到一个按钮,并将按钮连接到 startJiggling
方法。使用如图所示的代码,单击按钮不会执行任何操作,因为动画在添加后立即被删除。如果我注释掉 removeAllAnimations
消息,单击按钮会使按钮开始抖动并且永远抖动。我在 iPhone 4.3 模拟器、iPhone 5.0 模拟器、iPhone 5.1 模拟器和运行 iOS 5.1 的 iPhone 4S 上进行了测试。
因此,我无法重现您的问题。发送removeAllAnimations
删除我测试中的动画。
我怀疑您只是想让动画重复两次然后停止(因为您有一个名为 count
的参数并且您传递了 2)。如果那是你想做的,你可以这样做:
- (IBAction)startJiggling {
btnOption1.transform = CGAffineTransformMakeRotation(-.1);
[UIView animateWithDuration:.1 delay:2 * 0.08 options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse animations:^{
[UIView setAnimationRepeatCount:2];
btnOption1.transform = CGAffineTransformMakeRotation(.1);
} completion:^(BOOL completed){
btnOption1.transform = CGAffineTransformIdentity;
}];
}
您可以使用 +[UIView setAnimationRepeatCount:]
在动画 block 中设置重复计数,然后在完成 block 中恢复按钮的转换。
关于objective-c - Button Jiggle 算法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11499298/
我遇到过这个 html: 上面的html和这个有什么区别: 最佳答案 来自MDN page on the tag : 对于 type 的属性标签,可能的值是: 提交:按钮将表单数据提交给服务器
Button button= (Button) findViewbyID(R.id.button); 和 Button button = new Button(this); 有什么区别? 最佳答案 有
我是一名优秀的程序员,十分优秀!