我试图实现一个非常简单的过渡:一个视图向左移动半个屏幕,而第二个(“to”)视图则向右移动半个屏幕。
我的动画已经在工作,但是当我反转动画时,我看到了闪烁。 "to"视图(即原始视图)在0,0的原点可见,尽管我设置了不同的框架。
我倾倒了视图层次结构。框架被正确设置(对于to视图,它是-100 0;320 480),但仍然显示在0,0处。该动画的视图截图是否被缓存到某个地方?
以上内容将显示在屏幕中心,无论我在动画之前设置的实际框架或中心点是什么。
我的动画已经在工作,但是当我反转动画时,我看到了闪烁。 "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