animateWithDuration在viewWillAppear中无法工作9目标c

时间:2016-04-06 14:42:18

标签: ios objective-c animation viewwillappear animatewithduration

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

尝试将imageView从左侧(屏幕外)设置为右侧,并使动画重复。我知道动画在viewDidLoad中按照需要工作,但它并不理想,因为动画在呈现新控制器或应用程序已经到达背景并返回到前景时停止。我希望再次出现控制器时动画重新启动。当我将代码移动到viewwillappear时,动画永远不会发生。

我试过了:

  1. 以3秒的延迟添加performSelector - >没有动画
  2. 将animateWithDuration包装在dispatch_async中(dispatch_get_main_queue(),^ {...}); - >没有动画
  3. 覆盖viewDidLayoutSubviews方法并从那里调用动画代码 - >没有动画
  4. 从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

1 个答案:

答案 0 :(得分:2)

如上所述,如果在viewDidLoad中调用[self startAnimations];,但在viewDidAppear中调用[self.movingL2R_1_ImageView layoutIfNeeded];,则上述代码可以正常工作,但this answer helped me discover the subtle issue

要让它在viewDidAppear中运行,我需要替换

[self.view layoutIfNeeded];

BaseService

再一次对世界都是正确的。