在滑动后调整超级视图大小时,UIPageViewController视图会跳转

时间:2014-05-06 09:39:55

标签: ios ios7 uipageviewcontroller

我有一个视图控制器,它以编程方式将UIPageViewController添加到子视图(让我们称之为#34; overlay")。由于页面视图控制器的页面每个都有不同的高度,我在" overlay"上添加了一个NSLayoutConstraint。子视图。

在每次滑动时,我会计算即将到来的视图控制器的高度,并相应地调整叠加视图的大小:

- (void)resizeOverlayToBottomOf:(UIView *)element {

   // resize overlay in parent view controller so it shows the element
   float bottomOfElement = element.frame.origin.y + element.frame.size.height + 20;
   [self.parentViewController.overlayHeightConstraint setConstant:bottomOfElement];

   [self.parentViewController.overlayView setNeedsUpdateConstraints];
   [self.parentViewController.overlayView setNeedsLayout];
   [self.parentViewController.overlayView layoutIfNeeded];
}

一切都按预期工作......直到我想用动画更改叠加尺寸 我用动画块包装了上面方法的最后两行:

[UIView animateWithDuration:0.25f animations:^{
   [self.parentViewController.overlayView setNeedsLayout];
   [self.parentViewController.overlayView layoutIfNeeded];
}];

现在,滑动完成后,叠加视图的高度会随动画而变化。

问题在于,当动画播放时,页面视图控制器的内容会快速切换回屏幕上的某个位置并重新滑入。我尝试添加约束以确保页面视图控制器内容的固定宽度,但是似乎没什么可做的。

有关如何在不影响页面视图控制器视图的情况下为父视图设置动画的任何提示都将受到高度赞赏!

2 个答案:

答案 0 :(得分:2)

我最近遇到了同样的问题。这显然有效:

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
    if (completed)
    {
        CGFloat height = [self calculateHeight];
        [CATransaction begin];
        [CATransaction setCompletionBlock:^{
            self.heightConstraint.constant = height;
            [UIView animateWithDuration: 0.25
                                  delay: 0
                                options: UIViewAnimationOptionCurveEaseInOut
                             animations:^{

                                 [self.view layoutIfNeeded];
                             }
                             completion:^(BOOL finished) {

                             }];
        }];
        [CATransaction commit];
    }
}

我的理解是一个动画会干扰另一个动画。
CATransaction截取当前动画,并在当前动画完成后执行完成。
这对我来说很好。

答案 1 :(得分:0)

嗯,这段代码完成了这个伎俩:

[UIView animateWithDuration:0.25f animations:^{
    // [self.parentViewController.overlayView setNeedsLayout];
    // [self.parentViewController.overlayView layoutIfNeeded];
    CGRect frame = self.parentViewController.overlayView.frame;
    frame.size.height = bottomOfElement;
    self.parentViewController.overlayView.frame = frame;
}];

有趣的是,对于frame.size.height我使用的值似乎并不重要,无论如何,约束似乎都放在了当前。

如果有人可以解释为什么会有效,我会很高兴。