将 UILabel 添加到 UIView 时,它的动画效果不正确

Posted

技术标签:

【中文标题】将 UILabel 添加到 UIView 时,它的动画效果不正确【英文标题】:UIView not animating correctly when UILabel is added to it 【发布时间】:2014-05-10 15:33:59 【问题描述】:

我正在使用视图顶部边缘的约束为自定义视图设置动画。

观点是:

@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】:

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

 [self.myView layoutIfNeeded];

改为

[self.view layoutIfNeeded];

【讨论】:

以上是关于将 UILabel 添加到 UIView 时,它的动画效果不正确的主要内容,如果未能解决你的问题,请参考以下文章

将 UILabel 的层添加到另一个层(单独的 UIView)

UIView 中的自动布局 UILabel

如何以编程方式将 UILabel 和 UiImageView 添加到表视图单元格内的 UIView?

将 UILabel 粘贴到 UIView 或 UIImageView

使用 UIView 动画时处理、删除和添加 UILabel

无法让 UILabel 显示在 UIView 之上