动画约束更改,位置动画但高度跳变而没有动画

Ken*_*and 5 ios nslayoutconstraint ios7

我有一个自定义的UIView。在该UIView中,我有一个UILabel,背景为黄色,包含@“ 8”,称为labelWhite。我以编程方式为该UILabel创建4个约束:顶部,左侧,宽度和高度。

当我点击UIView时,我会更改高度的常量值并在5秒钟内为布局设置动画。但是,视图的高度立即跳到新值,但是y位置也改变并立即跳到新值。然后在5秒钟的动画中,y位置动画返回到应该一直停留的位置。

您可以在此处看到有关它的视频:http : //inadaydevelopment.com/stackoverflow/Constraints0.mov

它应该做的只是保持y = 0并垂直缩小。我究竟做错了什么?


编辑:

我只是发现,如果我的子视图是UIViews,我的动画将完全按照预期的方式工作,但是作为UILabel,我得到了跳转大小+动画位置。

到底是怎么回事?有没有办法让UILabel设置其大小的动画?


这是我用来修改和设置布局动画的代码:

self.constraintWhiteHeight.constant = secondaryHeight;

[UIView animateWithDuration:5.0 animations:^{
    [self layoutIfNeeded];
}];
Run Code Online (Sandbox Code Playgroud)

这是我用来创建约束的代码:

// ------ Top -----
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self
                                                              attribute:NSLayoutAttributeTop
                                                              relatedBy:NSLayoutRelationEqual
                                                                 toItem:self.labelWhite
                                                              attribute:NSLayoutAttributeTop
                                                             multiplier:1.0
                                                               constant:0];
[self addConstraint:constraint];

// ------ Left -----
self.constraintWhiteLeft = [NSLayoutConstraint constraintWithItem:self
                                                        attribute:NSLayoutAttributeLeft
                                                        relatedBy:NSLayoutRelationEqual
                                                           toItem:self.labelWhite
                                                        attribute:NSLayoutAttributeLeft
                                                       multiplier:1.0
                                                         constant:0];

// ------ Width -----
NSString *constraintString = [NSString stringWithFormat:@"H:[_labelWhite(==%.0f)]", self.bounds.size.width];
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:constraintString
                                                               options:0
                                                               metrics:nil
                                                                 views:NSDictionaryOfVariableBindings(_labelWhite)];
NSLog(@"constraints: %@", constraints);
self.constraintWhiteWidth = [constraints objectAtIndex:0];
[self.labelWhite addConstraints:constraints];

// ------ Height -----
constraintString = [NSString stringWithFormat:@"V:[_labelWhite(==%.0f)]", primaryHeight];
constraints = [NSLayoutConstraint constraintsWithVisualFormat:constraintString
                                                      options:0
                                                      metrics:nil
                                                        views:NSDictionaryOfVariableBindings(_labelWhite)];
self.constraintWhiteHeight = [constraints objectAtIndex:0];
[self.labelWhite addConstraints:constraints];
Run Code Online (Sandbox Code Playgroud)

rde*_*mar 2

我不认为你做错了什么,这似乎是当你尝试设置标签高度动画时标签的行为方式。我知道我过去一直在努力解决这个问题,但我不记得是否曾经找到过通过在动画块中对约束进行动画处理的解决方案。我让它工作的方法是使用计时器或 CADisplayLink 来调整高度约束。

-(void)shrinkLabel {
    self.constraintWhiteHeight.constant -= 1;
    if (self.constraintWhiteHeight.constant >= secondaryHeight)
    [self performSelector:@selector(shrinkLabel) withObject:nil afterDelay:.05];
}
Run Code Online (Sandbox Code Playgroud)

编辑后:

尽管计时器方​​法有效,但它看起来并不总是顺利,具体取决于您使用的速度和增量。另一种方法是使用一个大的 UIView(与电影中的黄色标签大小相同),其中包含一个较小的 UILabel,该 UILabel 对较大视图具有 centerX 和 centerY 约束。然后,像往常一样使用 animateWithDuration:animations 为黄色视图设置动画:

在此输入图像描述

-(void)shrinkLabel {
    self.yellowViewHeightCon.constant = secondaryHeight;
    [UIView animateWithDuration:5 animations:^{
        [self layoutIfNeeded];
    }];
}
Run Code Online (Sandbox Code Playgroud)