当UILabel添加到UIVabel时,UIView无法正确设置动画

时间:2014-05-10 15:34:00

标签: objective-c animation autolayout

我使用视图上边缘的约束为屏幕上的自定义视图设置动画。

观点是:

@implementation MyView

- (id)initWithFrame:(CGRect)frame
{
  self = [super initWithFrame:frame];
  if (self) {
    [self setBackgroundColor:[UIColor yellowColor]];

    _label = [UILabel new];
    [_label setTranslatesAutoresizingMaskIntoConstraints:NO];
    _label.text = @"text";
    [self addSubview:_label];

    [self updateConstraints];
  }
  return self;
}

- (void)updateConstraints
{
  NSDictionary *views = NSDictionaryOfVariableBindings(_label);
  [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[_label]"
                                                               options:NSLayoutFormatAlignAllLeft
                                                               metrics:nil
                                                                 views:views]];

  [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_label]"
                                                               options:NSLayoutFormatAlignAllCenterY
                                                               metrics:nil
                                                                 views:views]];
  [super updateConstraints];
}

@end

在其父视图上为myView设置动画的约束是:

_myViewTopConstraint = [NSLayoutConstraint constraintWithItem:_myView
                                                            attribute:NSLayoutAttributeTop
                                                            relatedBy:NSLayoutRelationEqual
                                                               toItem:self.view
                                                            attribute:NSLayoutAttributeBottom
                                                           multiplier:1.0
                                                             constant:-kMyViewVisibleHeight];

[self.view addConstraint:_myViewTopConstraint];

上边缘约束的动画是:

[UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
    self.myViewTopConstraint.constant = kScreenHeight;
    [self.myView layoutIfNeeded];
} completion:nil];

当MyView中的标签和约束被注释掉时,动画效果很好。但是当标签和约束存在时,动画显着加速,可能是5倍或更多。

为什么会这样?任何人都知道如何解决它?

1 个答案:

答案 0 :(得分:0)

想出来。必须在动画块中myView的父视图上调用layoutIfNeeded。

 [self.myView layoutIfNeeded];

更改为

[self.view layoutIfNeeded];