当放置在固定大小的UIView下方时,使用autolayout调整UIView的大小

时间:2013-07-30 07:14:51

标签: ios autolayout nslayoutconstraint

我正在使用此布局的自动布局:

enter image description here

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放大?我尝试使用约束优先级,但它没有用......

2 个答案:

答案 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
 ];

我会在一段时间内等待其他更好的解决方案,这样我就不会将自己的答案标记为已接受的答案。