实现复杂的自定义视图控制器的正确方法是啥
Posted
技术标签:
【中文标题】实现复杂的自定义视图控制器的正确方法是啥【英文标题】:What's the proper way to implement complex custom view controllers实现复杂的自定义视图控制器的正确方法是什么 【发布时间】:2013-11-29 05:55:24 【问题描述】:注意:我不是在谈论自定义视图控制器转换效果,它可以通过使用自定义视图控制器来完成,它是 ios 5+ API。
我说的是转换到另一个视图控制器,其中来自当前显示的视图控制器的视图被动画到要呈现的视图控制器的视图。
示例
-你有friendsViewController,它显示当前用户朋友的列表。每个表格视图单元格都有个人资料图片和名称。
-单击一个单元格,所有其他单元格消失,名称和图片动画到顶部。此时显示UserProfileViewComtroller。
理论
-我可以通过组合两个视图控制器轻松做到这一点,但 UserProfileViewComtroller 可以从应用程序的其他部分启动。
-如果 UserProfileViewControllers 视图被实例化,我可以使用 UIViews 方法转换坐标
我觉得这里有一个更合适/更清洁的解决方案,这就是我向社区寻求帮助的原因:)
【问题讨论】:
【参考方案1】:在我看来,您想要的正是 视图控制器转换,因为您想做的“某事”在用户看来就像您从旧 VC 获取视图并移动了把它交给新的 VC。
那么你很幸运,因为你被允许使用 [superview addSubview:view]
将 UIView
从一个视图控制器移动到另一个视图控制器,作为你想要执行的转换的一部分。 p>
这可以在任何 iOS 版本上完成,尽管现在更容易了,因为 在 iOS 7 中有一个您编写的委托(请参阅<UIViewControllerAnimatedTransitioning>
reference),它可以访问 VC 的两个视图层次结构并可以更改它们在过渡期间随意(移动一个视图,淡化其他视图)。
此外,在转换期间使新视图控制器透明(或使用旧控制器的快照)将帮助您隐藏 VC 已更改的事实。
【讨论】:
很好,我实际上只是在阅读新的 UIViewControlleRanimatedTransitioning 协议,它可以让您避免滚动自己的自定义视图控制器容器。让新 VC 的视图也变得透明的好建议!【参考方案2】:与其说是一个答案,不如说是一种可能激发解决方案的技术。我做了一个需要像这样的自定义转换的应用程序。原始应用程序自行安排然后拍摄快照,因此在最后一刻用户正在查看图像。创建第二个 viewController,给定坐标等,然后立即显示图像。它将图像放入其视图(具有相同边界的子视图)。
此时,第二个 vc 已完全控制,并且可以淡入其他一些内容等。相反,开始时或多或少 - 图像被使用、交换、被移除以显示真实的视图内容。
请注意,这需要一些时间才能使其正常工作而不会出现故障等。
编辑:如果您担心将整个原始视图转换为图像,请修改该技术。例如,在原始视图中,将除单元格以外的所有其他内容淡化为黑色,然后对一个单元格进行快照。第二个视图将以全黑背景开始,并将单元格图像放在其上方,然后从那里开始。
EDIT2:如 cmets 中所述,您当然会在没有动画的情况下推送第二个视图,因此它会立即发生。通过在第二个 vc 上设置一个小图像,并具有约定的背景,可以快速“传递接力棒”,让第二个控制器快速无缝地工作。
【讨论】:
那么延迟呢?在我注意到的旧设备上,截屏需要相当长的时间。您是否设法实现了一种效果,它可以很好地动画化并且同时 - 不会有任何明显的延迟? (延迟一切开始动画,或者当用户可以与第二个视图控制器上的内容交互时(因为当图像可见/第二个视图控制器准备就绪时 - 用户触摸将被忽略)...? 我们没有完美的解决方案。在我的情况下,使用 iPhone 4 进行延迟测试是可以接受的。我是两年前做的,所以细节很模糊。不幸的是,应用程序不再在商店中,或者您可能已经看到它在运行。我使用了非常慢的延迟,例如在您将照片添加到电子邮件的相机应用程序中。所以最初的延迟并不明显。 感谢分享。似乎是这样做的最佳方法,同时保持目标视图控制器在其他地方使用的灵活性,不需要花哨的转换是有一个指定位置的 init 参数。视图控制器来自。 David 的技术可以通过在没有动画的情况下推送目标视图控制器来应用,并将子视图移动到新的视图控制器并做你想做的事情:)以上是关于实现复杂的自定义视图控制器的正确方法是啥的主要内容,如果未能解决你的问题,请参考以下文章
Tableview 上下文菜单:从行到预览视图控制器的自定义动画