我正在使用此布局的自动布局:
self.view with frame(0,80,320,488)
collectionView with frame(0,0,320,220)
underView with frame(0,220,320,268)
并尝试实现一个动画,该动画应调整大小,以放大其高度,以便underView部分覆盖从底部向上移动的collectionView。
Autolayout强制对这两个视图进行高度约束,因此我为underView高度约束创建了一个IBOutlet,我正在动画中进行调整:
NSLog(@"underView height %.2f", self.underView.frame.size.height);
NSLog(@"offset (%.2f, %.2f)", offset.x, offset.y);
heightConstraint.constant += offset.y;
NSLog(@"heightConstraint %.2f", heightConstraint.constant);
[self.underView setNeedsUpdateConstraints];
[UIView animateWithDuration:ANIMATION_DURATION
delay:ANIMATION_DELAY
options:UIViewAnimationOptionCurveEaseOut
animations:^{
[self.underView layoutIfNeeded];
NSLog(@"underView height %.2f", heightConstraint.constant);
} completion:nil];
在控制台中我可以看到:
2013-07-30 09:09:37.268 Cal[49611:a0b] underView height 268.00
2013-07-30 09:09:37.268 Cal[49611:a0b] offset (320.00, 144.00)
2013-07-30 09:09:37.269 Cal[49611:a0b] heightConstraint 412.00
2013-07-30 09:09:37.270 Cal[49611:a0b] underView height 412.00
但调整大小根本不会发生。
我能想到的这种行为的唯一原因是上面的collectionView的高度约束,但由于我不希望重新加载该集合,我无法对其进行操作。
我想知道如何在collectionView上实现underView放大?我尝试使用约束优先级,但它没有用......
答案 0 :(得分:2)
根据this answer尝试以下操作。确保在superview上调用layoutIfNeeded
:
[UIView animateWithDuration:ANIMATION_DURATION
delay:ANIMATION_DELAY
options:UIViewAnimationOptionCurveEaseOut
animations:^{
heightConstraint.constant += offset.y;
[self.view layoutIfNeeded];
}
completion:nil];
答案 1 :(得分:0)
所以,我找到了一个可能的问题解决方案,但不确定它是否是最好的解决方案。我错过了对self.collectionView的垂直空间约束的引用,因此最终的代码将是:
verticalSpace.constant -= shift;
heightConstraint.constant += shift;
[self.collectionView setNeedsUpdateConstraints];
[self.underView setNeedsUpdateConstraints];
[UIView animateWithDuration:ANIMATION_DURATION
delay:ANIMATION_DELAY
options:UIViewAnimationOptionCurveEaseOut
animations:^{
[self.view layoutIfNeeded];
} completion:nil
];
我会在一段时间内等待其他更好的解决方案,这样我就不会将自己的答案标记为已接受的答案。