gpt4 book ai didi

objective-c - Button Jiggle 算法错误

转载 作者:搜寻专家 更新时间:2023-10-30 19:41:57 25 4
gpt4 key购买 nike

我已经实现了一个按钮微动动画。按下一个按钮会摇晃,但问题是动画不会停止并且在 [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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com