animation约束更改,定位animation,但高度跳跃没有animation

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

当我点击UIView时,我改变了高度的常数值,并在5秒内animation布局。 然而,视图的高度立即跳转到新的值,但y位置也会改变,并立即跳转到一个新的值。 然后在5秒钟的animation中,y位置回到了原本应该保持的位置。

你可以在这里看到它的video: http : //inadaydevelopment.com/stackoverflow/Constraints0.mov

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


编辑:

我刚刚发现,如果我的子视图是UIViews,我的animation完全按照预期工作,但是作为UILabels,我可以获得跳跃大小和animation位置。

到底是怎么回事? 有没有办法让我的UILabelsanimation的大小?


这是我用来修改和animation布局的代码:

 self.constraintWhiteHeight.constant = secondaryHeight; [UIView animateWithDuration:5.0 animations:^{ [self layoutIfNeeded]; }]; 

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

 // ------ 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]; 

我不认为你做错了什么,这似乎是当你试图制作他们的身高时,标签的行为方式。 我知道过去我已经和这个问题纠缠在一起了,我不记得我是否曾经find过一个解决scheme,通过在animation块中animation约束来解决问题。 我已经得到它的工作方式是使用计时器或CADisplayLink来调整高度约束。

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

编辑后:

尽pipe定时器方法有效,但是它并不总是看起来很平滑,这取决于你使用的速度和增量。 另一种方法是使用一个较大的UIView(与电影中的黄色标签大小相同),并使用较小的UILabel,将centerX和centerY约束用于较大的视图。 然后,像animateWithDuration一样用animation效果处理黄色视图:animation:

在这里输入图像说明

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