在 UIButton 动作的动画中间或结尾设置 UILabel 会取消动画
Setting a UILabel while in the middle or end of an animation from a UIButton action cancels the animation
正如标题所说,每当我想在标签移动的动画之后设置一个UILabel的文本时,它returns UILabel回到动画之前的原点。有趣的是,这仅在动画由 UIButton 操作触发时发生。
我已经在一个新项目中复制了它。复制下面的代码,看看会发生什么。
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (strong, nonatomic) IBOutlet UILabel *hello;
- (IBAction)move:(id)sender;
@end
ViewController.m
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.hello.text = @"Hello";
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)move:(id)sender {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
self.hello.text = @"Howdy";
});
[UIView animateWithDuration:1.0f animations:^{
self.hello.center = CGPointMake(self.hello.center.x + 50, self.hello.center.y + 50);
}];
}
@end
其中 self.hello 和移动链接到故事板中的 UILabel 和 UIButton。
玩这个我可以看到,当您使用 self.hello.transform = CGAffineTransformMakeTranslation(50, 50) 而不是 self.hello.center 时,不会发生此错误。为什么是这样?有什么方法可以继续使用 .center 还是我必须将所有动画更改为 .transform?
感谢您的帮助。
我不得不屈服于 .transform
请使用约束而不是修改标签的中心。当我们混合使用自动布局和坐标系处理时会发生此类问题。我觉得你应该做类似的事情:
[UIView animateWithDuration:1.0f animations:^{
self.xPos.constant = self.hello.center.x + 50;
self.yPos.constant = self.hello.center.y + 50;
[self.hello layoutIfNeeded];
} completion:^(BOOL finished) {
self.hello.text = @"Howdy";
}];
其中 xPos 和 yPos 是 UILabel
的 x 和 y NSLayoutConstraint
位置
正如标题所说,每当我想在标签移动的动画之后设置一个UILabel的文本时,它returns UILabel回到动画之前的原点。有趣的是,这仅在动画由 UIButton 操作触发时发生。
我已经在一个新项目中复制了它。复制下面的代码,看看会发生什么。
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (strong, nonatomic) IBOutlet UILabel *hello;
- (IBAction)move:(id)sender;
@end
ViewController.m
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.hello.text = @"Hello";
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)move:(id)sender {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
self.hello.text = @"Howdy";
});
[UIView animateWithDuration:1.0f animations:^{
self.hello.center = CGPointMake(self.hello.center.x + 50, self.hello.center.y + 50);
}];
}
@end
其中 self.hello 和移动链接到故事板中的 UILabel 和 UIButton。
玩这个我可以看到,当您使用 self.hello.transform = CGAffineTransformMakeTranslation(50, 50) 而不是 self.hello.center 时,不会发生此错误。为什么是这样?有什么方法可以继续使用 .center 还是我必须将所有动画更改为 .transform?
感谢您的帮助。
我不得不屈服于 .transform
请使用约束而不是修改标签的中心。当我们混合使用自动布局和坐标系处理时会发生此类问题。我觉得你应该做类似的事情:
[UIView animateWithDuration:1.0f animations:^{
self.xPos.constant = self.hello.center.x + 50;
self.yPos.constant = self.hello.center.y + 50;
[self.hello layoutIfNeeded];
} completion:^(BOOL finished) {
self.hello.text = @"Howdy";
}];
其中 xPos 和 yPos 是 UILabel
NSLayoutConstraint
位置