gpt4 book ai didi

ios - 用动画替换segue?

转载 作者:行者123 更新时间:2023-11-29 10:56:23 25 4
gpt4 key购买 nike

我的一位同事刚刚向我展示了可用于我的 Split View Controller 的“替换转场”。它确实运作良好。

但我真的很想从旧 View “淡入淡出”到新 View 。我已经通过设置 View 的 alpha 属性完成了淡入淡出,但不确定这将如何使用 segues。

最佳答案

问题是转换动画需要一个容器 View ,但是当替换一个分割的细节时没有合适的容器 View ,整个右侧被替换(通常用一个包含细节的新导航 Controller )。 Split View有一个 View ,它将两侧添加为 subview ,如果它的每一侧都有一个容器 View ,那么这会很容易。或者,您可以使用它的 View 甚至窗口,但您需要转换框架。解决方法包括在以前的细节 Controller 消失之前对其进行快照,然后将其作为 subview 添加到新的细节 Controller 上并为其移除设置动画。这就是 Notes 所做的,以实现垃圾笔记动画,新笔记出现在后面(尽管它不使用 segues)。如果您希望相同的动画以纵向方式工作(如丢弃便条),那么因为使用了嵌套导航 Controller ,所以最好使用最外面的导航 Controller 的 View 作为动画的容器,这样即使导航栏也包含在淡入淡出中.

好消息是这一切都可以在 UIStoryboardSegue 子类中完成。在 prepareForSegue 中,暂时不要设置 self.detailViewController。在调用 super 之前的 perform 方法中使用 sourceViewController.detailViewController 对 View 进行快照。然后调用 super 执行。您不能使用目的地更新该属性(以便下次使用)。然后将此快照添加为目的地(或其导航 Controller )的 subview 。 CATransaction flush 然后执行 transitionWithView 以使用 [snapshot removeFromSuperView] 动画化屏幕截图。这是一些示例代码:

- (void)perform{
RootViewController *rootController = self.sourceViewController;
MasterViewController *previousMasterViewController = (MasterViewController *)rootController.collapseControllerForMaster.detailViewController;
UIView *snapshotView = [previousMasterViewController.navigationController._outermostNavigationController.view snapshotViewAfterScreenUpdates:NO];

MasterViewController *masterController = (MasterViewController *)[self.destinationViewController topViewController];
rootController.collapseControllerForMaster.detailViewController = masterController;

UIView *view = [previousMasterViewController.deleteBarButtonItem valueForKey:@"view"];
CGRect rect = [view convertRect:view.frame toView:masterController.view.window];

[super perform];
[masterController.navigationController._outermostNavigationController.view addSubview:snapshotView];

[CATransaction flush];

[UIView beginAnimations:@"delete" context:NULL];
[UIView setAnimationTransition:103 forView:masterController.navigationController._outermostNavigationController.view cache:YES];
[UIView setAnimationDuration:0.5f];
[UIView setAnimationPosition:CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect))];
[snapshotView removeFromSuperview];

[UIView commitAnimations];
}

很抱歉使用私有(private)方法,我讨厌不得不重新实现关键的缺失公共(public)方法。仅供引用,折叠 Controller 是我的 Split View Delegate Controller 对象。您也许可以只使用源 Controller 上的 detailViewController 属性。

这是纵向的样子:

enter image description here

关于ios - 用动画替换segue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18108317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com