iOS 7 自定义视图控制器转场期间闪烁问题

7
我试图实现一个非常简单的过渡:一个视图向左移动半个屏幕,而第二个(“to”)视图则向右移动半个屏幕。
我的动画已经在工作,但是当我反转动画时,我看到了闪烁。 "to"视图(即原始视图)在0,0的原点可见,尽管我设置了不同的框架。
我倾倒了视图层次结构。框架被正确设置(对于to视图,它是-100 0;320 480),但仍然显示在0,0处。该动画的视图截图是否被缓存到某个地方?
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toViewController   = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

UIView *container = [transitionContext containerView];

CGRect offsetCoverRect    = CGRectMake(-100.0, 0.0, 320, 480);
CGRect detailsRect        = CGRectMake(-100.0 + 320.0, 0.0, 320, 480);
CGRect detailsOutsideRect = CGRectMake(320.0, 0.0, 320, 480);

CGRect normalRect = CGRectMake(0.0, 0.0, 320, 480);


if (self.revealDetails)
{
    toViewController.view.frame = detailsOutsideRect;
    [container addSubview:toViewController.view];
}
else
{
    [container insertSubview:toViewController.view belowSubview:fromViewController.view];

    // reversing… set the frame to the original offset (shows at 0,0 for a moment)
    toViewController.view.frame = offsetCoverRect;
}

[UIView animateKeyframesWithDuration:2 delay:0 options:0 animations:^{

    if (self.revealDetails)
    {
        fromViewController.view.frame = offsetCoverRect;
        toViewController.view.frame = detailsRect;
    }
    else
    {
        fromViewController.view.frame = detailsOutsideRect;
        toViewController.view.frame = normalRect;
    }
} completion:^(BOOL finished) { [transitionContext completeTransition:finished]; }];
}

更新:

似乎与UIModalPresentationCustom有关。我需要使用它,以便在转换完成时不删除来自视图。但是,它似乎假定反向转换的来源视图控制器从0,0开始。

更新2:

使用以下代码非常容易重现:

UIView *snapshot = [containerView snapshotViewAfterScreenUpdates:NO];
[containerView addSubview:snapshot];

以上内容将显示在屏幕中心,无论我在动画之前设置的实际框架或中心点是什么。

这与 UIViewControllerContextTransitioning 实例的 initialFrameForViewController: 相关吗? - Mark
你是在使用设备时出现这个问题还是只有在模拟器中出现? - MatterGoal
@MatterGoal 也在设备上。无论我设置什么,似乎视图始终从0,0开始。 - Mark
2
你解决了这个问题吗?我也遇到了同样的问题。 - Rameez Hussain
@RameezHussain 目前还没有解决方案... - Mark
只有在屏幕更新之后进行快照时,我才会得到这个。尽管如此,我仍然希望有一个解决方案。 - jrturton
2个回答

2
我知道这是一个老问题,但我遇到了相同的问题,并在苦苦挣扎数小时后终于想出了解决方案:
在当前动画的完成块中,
  1. 创建fromViewController视图的快照
  2. 对快照执行帧更改/变换
  3. 将快照添加到容器视图中
  4. 从容器视图中删除fromViewController视图
  5. 在dismiss动画的完成块中(或任何其他地方,如果是dismiss的话),从容器中删除快照
通过从容器中删除fromViewController的视图,它不会重置到其初始位置,因为它不再位于容器视图内。

-2

这是因为你的animateTransition方法是从后台调用的。 以这种方式调用你的方法

dispatch_async(dispatch_get_main_queue(), ^
               {
                   [self animateTransition]; // your method goes here
               });

您不应该在后台线程上调用任何动画或UI相关的方法


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接