2015-03-19 39 views
1

我想从0到文本高度(UILabel)的高度进行动画处理。我正在使用自动布局,我不知道文本会有多高。我的方法是通过一个高度= 0约束设置为文本开始,和动画是这样的:动画到文本高度(自动布局)

//retrieves the height constrain of the clicked item 
NSLayoutConstraint *heightContraint = [heightConstraints objectAtIndex:sender.tag]; 
//activates/deactivates the constraint 
heightContraint.active = !heightContraint.active; 
//animates 
[UIView animateWithDuration:3 animations:^{ 
    [self layoutIfNeeded]; 
}]; 

我的问题是,用这种方法,文字高度不动画,它的高度变化0立即到达新的高度。只有包含视图的位置/大小改变是动画的。如何在不知道文本高度的情况下对文本高度变化进行动画处理?

+0

尝试调用layoutIfNeeded为内部块该特定视图 [weakSelf.sampleView layoutIfNeeded]; – erenkabakci 2015-03-19 10:00:12

+0

当您为约束设置一些确切的值时,动画是否会发生?只是为了区分度量和动画问题。 – VChemezov 2015-03-19 10:00:59

+0

@Akeara我试着调用'[heightContraint.firstItem layoutIfNeeded];'而不是,但我得到了同样的结果。我认为这个问题与这样一个事实有关,它动画一个BOOL'heightContraint.active',但它不能真正做到这一点,因为它的值只有YES和NO(类似于动画isHidden属性而不是使用不透明度) – Daniel 2015-03-19 10:06:13

回答

0

我找到了解决方案。我没有设置高度约束,而是设置了一个包含UILabel和上面视图的包含视图(裁剪)。然后,我创建了两个约束,将底部边缘固定到包含视图,一个与UILabel相关,另一个与上面的视图相关。我刚激活/禁用这些约束是这样的:

//get the constraints 
NSLayoutConstraint *viewAboveTextConstraint = 
     [viewAboveTextConstraints objectAtIndex:sender.tag]; 
NSLayoutConstraint *uilabelContraint = [uilabelContraints objectAtIndex:sender.tag]; 
//flip the active states 
viewAboveTextConstraint.active = !viewAboveTextConstraint.active; 
uilabelContraint.active = !uilabelContraint.active; 
//animate 
[UIView animateWithDuration:.3 animations:^{   
     [self layoutIfNeeded]; 
}];