animateWithDuration 在 viewWillAppear 中不起作用 ios 9 objective c
animateWithDuration not working in viewWillAppear ios 9 objective c
使用 Xcode 版本 7.2.1 (7C1002),
SDK iOS 9.2
尝试从左(屏幕外)到右为 imageView 设置动画并使动画 重复。我知道动画在 viewDidLoad 中按预期工作,但它并不理想,因为动画会在呈现新控制器或应用程序进入后台并返回前台时停止。我希望动画在控制器再次出现时重新启动。当我将代码移动到 viewwillappear 时,动画永远不会发生。
我试过:
- 添加延迟 3 秒的 performSelector -> 不设置动画
- 将 animateWithDuration 包裹在 dispatch_async(dispatch_get_main_queue(), ^{ ... }); -> 没有动画
- 覆盖 viewDidLayoutSubviews 方法并从那里调用动画代码 -> 不设置动画
动画唯一起作用的时间是从 viewDidLoad 调用时。任何帮助,将不胜感激。我一定错过了一些非常明显的东西。这是代码(不起作用)...
MainViewController.h
@property (nonatomic, strong) IBOutlet UIImageView *movingL2R_1_ImageView;
@property (nonatomic) IBOutlet NSLayoutConstraint *movingL2R_1_LeadingConstraint;
MainViewController.m
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self startAnimations];
}
-(void) startAnimations{
[self animateMovingL2R_1_ImageView];
// other animations will go here...
}
-(void) animateMovingL2R_1_ImageView {
NSTimeInterval animateInterval = 15;
[UIView animateWithDuration:animateInterval delay:0 options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionRepeat animations:^{
self.movingL2R_1_LeadingConstraint.constant = 500;
[self.movingL2R_1_ImageView layoutIfNeeded];
} completion:^(BOOL finished) {
// back to original position
self.movingL2R_1_LeadingConstraint.constant = -100;
}];
}
注意:movingL2R_1_LeadingConstraint 在 Interface Builder 中设置为 -100,因此这是它的起点。
故事板入口点 --> MainController
如前所述,如果在 viewDidLoad 中调用 [self startAnimations];
,但在 viewDidAppear 中不调用,但在 this answer helped me discover the subtle issue.
中调用,则上述代码可以完美运行
为了让它在 viewDidAppear 中工作,我需要替换
[self.movingL2R_1_ImageView layoutIfNeeded];
和
[self.view layoutIfNeeded];
世界又恢复正常了。
使用 Xcode 版本 7.2.1 (7C1002), SDK iOS 9.2
尝试从左(屏幕外)到右为 imageView 设置动画并使动画 重复。我知道动画在 viewDidLoad 中按预期工作,但它并不理想,因为动画会在呈现新控制器或应用程序进入后台并返回前台时停止。我希望动画在控制器再次出现时重新启动。当我将代码移动到 viewwillappear 时,动画永远不会发生。
我试过:
- 添加延迟 3 秒的 performSelector -> 不设置动画
- 将 animateWithDuration 包裹在 dispatch_async(dispatch_get_main_queue(), ^{ ... }); -> 没有动画
- 覆盖 viewDidLayoutSubviews 方法并从那里调用动画代码 -> 不设置动画
动画唯一起作用的时间是从 viewDidLoad 调用时。任何帮助,将不胜感激。我一定错过了一些非常明显的东西。这是代码(不起作用)...
MainViewController.h
@property (nonatomic, strong) IBOutlet UIImageView *movingL2R_1_ImageView;
@property (nonatomic) IBOutlet NSLayoutConstraint *movingL2R_1_LeadingConstraint;
MainViewController.m
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self startAnimations];
}
-(void) startAnimations{
[self animateMovingL2R_1_ImageView];
// other animations will go here...
}
-(void) animateMovingL2R_1_ImageView {
NSTimeInterval animateInterval = 15;
[UIView animateWithDuration:animateInterval delay:0 options:UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionRepeat animations:^{
self.movingL2R_1_LeadingConstraint.constant = 500;
[self.movingL2R_1_ImageView layoutIfNeeded];
} completion:^(BOOL finished) {
// back to original position
self.movingL2R_1_LeadingConstraint.constant = -100;
}];
}
注意:movingL2R_1_LeadingConstraint 在 Interface Builder 中设置为 -100,因此这是它的起点。
故事板入口点 --> MainController
如前所述,如果在 viewDidLoad 中调用 [self startAnimations];
,但在 viewDidAppear 中不调用,但在 this answer helped me discover the subtle issue.
为了让它在 viewDidAppear 中工作,我需要替换
[self.movingL2R_1_ImageView layoutIfNeeded];
和
[self.view layoutIfNeeded];
世界又恢复正常了。