animateWithDuration 在 vi​​ewWillAppear ios 9 目标 c 中不起作用

Posted

技术标签:

【中文标题】animateWithDuration 在 vi​​ewWillAppear ios 9 目标 c 中不起作用【英文标题】:animateWithDuration not working in viewWillAppear ios 9 objective c 【发布时间】:2016-04-06 14:42:17 【问题描述】:

使用 Xcode 版本 7.2.1 (7C1002), SDK iOS 9.2

尝试从左(离屏)到右设置 imageView 的动画并让动画重复。我知道动画在 viewDidLoad 中按预期工作,但这并不理想,因为当出现新控制器或应用程序进入后台并返回前台时动画停止。当控制器再次出现时,我希望动画重新开始。当我将代码移动到 viewwillappear 时,动画永远不会发生。

我试过了:

    添加 performSelector 延迟 3 秒 -> 没有动画 将 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;
    ];

注意:在 Interface Builder 中,movingL2R_1_LeadingConstraint 设置为 -100,因此它是从这里开始的。

故事板入口点 --> MainController

【问题讨论】:

当你说从viewDidLoad 调用时它可以工作,你真的是指viewDidAppear 吗?因为这就是我在您发布的代码中看到的内容。 它应该在 viewDidAppear 中工作,但在 viewDidLoad 中不工作 @Gavin - 抱歉,为了澄清我发布了不起作用的代码。动画在 viewDidLoad 中调用 [self startAnimations] 时起作用(当然,在 viewDidAppear 中注释掉调用) 【参考方案1】:

如上所述,如果在 viewDidLoad 中调用了 [self startAnimations];,但不是在 viewDidAppear 中,而是在 this answer helped me discover the subtle issue 中调用,则上面的代码可以完美运行。

为了让它在 viewDidAppear 中工作,我需要替换

[self.movingL2R_1_ImageView layoutIfNeeded];

[self.view layoutIfNeeded];

世界再次一切正常。

【讨论】:

以上是关于animateWithDuration 在 vi​​ewWillAppear ios 9 目标 c 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 navigationItem 中停止 animateWithDuration

尝试使用 animateWithDuration 时找不到方法 '+animateWithDuration:delay:options:animations:'

UIView.animateWithDuration:animations:completion: 在 XCTest 中被取消

如何暂停和恢复 UIView.animateWithDuration

AnimateWithDuration 禁用 UIView 上的 userInteraction

暂停和恢复 AnimateWithDuration 动画 ios