带有完成块和属性的自定义 segue 转换

Posted

技术标签:

【中文标题】带有完成块和属性的自定义 segue 转换【英文标题】:Custom segue transition with completion block & properties 【发布时间】:2014-08-21 17:05:20 【问题描述】:

我想在视图控制器之间进行自定义转换,从左到右滑动,就像 AppLaucher 中页面之间的 ios 基本转换效果一样,但会变暗。

我在 viewController 之间有一个自定义 segue(我们称它们为 FirstVC 和 SecondVC)。对于变暗,我有一个黑色视图,在动画过程中淡入(SecondVC 比 FirstVC 暗)。我有一个类 - UIStoryboardSegue 的子类 - 用于我的自定义 segue,实现了 -(void)perform 方法。在这个方法中,我已经实现了(有更多细节):

//...Initials frames

UIView *blackView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 568)];
blackView.backgroundColor = [UIColor blackColor];
blackView.alpha = 0;
[UIView animateWithDuration:0.3 animations:^
blackView.alpha = 0.5;
//...Animations

completion:^(BOOL finished)

];

我确切地说这两个视图控制器位于两个不同的导航视图控制器中。

对于变暗,我想在转场完成后修改SecondVC类中声明的“darkView”属性,以存储转场后的变暗。

为此,我想做以下选项之一(如果其中一个工作我不需要其他选项):

    在完成块中直接访问SecondVC的darkView属性并修改

    检测动画何时完成并在该点修改属性,在 SecondVC 类中实现的方法中

    在完成块中写入[dest.view addSubview:whiteView];(“dest”是目标视图控制器),并在SecondVC的另一种方法中访问这个子视图

我已经为这三种解决方案尝试了很多方法,但非常感谢您的帮助。谢谢

【问题讨论】:

【参考方案1】:

如果您实现了自定义 segue 类,那么获取即将被推送到导航堆栈上的 secondViewController 的实例应该很简单。

在你的 perform 方法中试试这个

FirstViewController *firstVC = self.sourceViewController;
SecondViewController *secondVC = self.destinationViewController;

您可能可以在您的 secondVC 上声明一个公共 UIView 属性并访问它,还可能公开一个方法并在动画完成后调用它。

【讨论】:

感谢您的帮助,但我的 segue 已在情节提要中声明,以编程方式创建实例不会干扰情节提要吗? 您可能已经在 StoryBoard 中实现了 segue,但您必须创建一个自定义 segue 类来实现自定义动画。创建 UIStoryboardSegue 的子类并在该类中实现您的 perform 方法。不要忘记在 StoryBoard 中将此类设置为您的自定义 segue 类 当我尝试FirstViewController *firstVC = self.sourceViewController firstVC 是 UINavigationController 类型。我想是因为segue是和secondVC的Navigation Controller链接的,所以segue.destinationViewController就是Navigation View Controller。我能做什么? 嗯,你为什么要使用两个导航控制器?理想情况下,您应该使用一个管理 FirstVC 和 SecondVC 的 NavigationController。并且您的 FirstVC 应该设置为导航控制器的 rootviewController。 我的应用程序中有 5 个视图控制器。第一个管理 2VC(使用 FirstVC -> 初始 VC),另一个管理 3VC(使用 SecondVC)。我使用 2 Navigation Controller 是因为我希望 3VC 是一种临时弹出窗口,但我不太了解 Navigation Controller,也许我不必这样做但我见过有人这样做。实际上,我在每个导航控制器内的视图控制器之间进行了推送 segue 转换,并且在更改导航控制器时进行了模态转换。我虽然有 2 个导航控制器更符合逻辑,但你说没有必要?

以上是关于带有完成块和属性的自定义 segue 转换的主要内容,如果未能解决你的问题,请参考以下文章

不使用 Storyboard segues 的自定义视图转换 (Swift)

没有segue的自定义关闭过渡

自定义 Segue 中的 CATransition

iOS - 自定义 segue 内存泄漏

使用自定义表格视图单元格中的故事板segue

在另一个视图控制器展开 segue 后重新加载 UIView 数据上的自定义 tableview