Ios 设置约束动画会更改,位置会设置动画,但高度会在没有动画的情况下跳跃

Ios 设置约束动画会更改,位置会设置动画,但高度会在没有动画的情况下跳跃,ios,ios7,nslayoutconstraint,Ios,Ios7,Nslayoutconstraint,我有一个自定义视图。在该UIView中,我有一个带有黄色背景的UILabel,其中包含@“8”,名为labelWhite。我以编程方式为UILabel创建了4个约束:顶部、左侧、宽度和高度 当我点击UIView时,我会更改高度的恒定值,并在5秒内设置布局动画。但是,视图的高度会立即跳到新值,但y位置也会更改并立即跳到新值。然后在5秒钟的动画中,y位置将动画恢复到它应该一直停留的位置 您可以在此处看到它发生的视频: 它应该做的只是保持y=0并垂直收缩。我做错了什么 编辑: 我刚刚发现,如果我的子

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

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

您可以在此处看到它发生的视频:

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


编辑:

我刚刚发现,如果我的子视图是UIView,我的动画工作完全符合预期,但是作为UILabels,我得到了跳跃大小+动画位置

发生了什么事?有没有办法让UILabels设置其大小的动画


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

self.constraintWhiteHeight.constant = secondaryHeight;

[UIView animateWithDuration:5.0 animations:^{
    [self layoutIfNeeded];
}];
这是我用来创建约束的代码:

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

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

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

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

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


围绕这个问题的有趣方式。谢谢,我会稍微考虑一下。第二个,
layoutifneedd
方法是我在问题中使用的方法。它对UIView非常有效,但UILabel的绘制方式不同,对那些视图不起作用。@Kennyyland,但它在我的编辑中显示的设置中起作用,我正在设置外部(黄色)UIView的动画,较小的标签在视图收缩时保持正确居中。这不是您想要的吗?外部视图将保持相同的大小,但内部视图将移动并更改大小。当它改变大小时,我希望它的内容(“8”)也随之改变大小。问题是,UILabels在大小动画中不会更改文本的大小,因此它会跳转到新的结束大小字体,然后动画到所需的大小。@Kennyyland,好的,这不是你在电影中显示的内容,文本在那里保持不变的大小,所以我想这是你想要的。