在 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 位置