【发布时间】:2019-09-03 18:15:03
【问题描述】:
我编写了一个自定义 UIStoryboardSegue 子类来创建两个 UIViewController 之间的淡出/淡入、交叉溶解过渡。
视图控制器的主视图具有位于每个视图中心的按钮(标记为“视图控制器 1”和“视图控制器 2”,因此我假设当我交叉溶解一个到另一个时 - 将它们都设置为相同超级视图的子视图并使它们的框架相同——按钮也会对齐。
class SwapSegue: UIStoryboardSegue {
override func perform() {
fade()
}
func fade() {
destination.view.alpha = 0
source.view.superview?.addSubview(destination.view)
destination.view.frame = source.view.frame
UIView.animate(withDuration: 1, delay: 0, options: .curveEaseInOut, animations: {
self.destination.view.alpha = 1
}, completion: { success in
if var controllerStack = self.source.navigationController?.viewControllers {
controllerStack[controllerStack.firstIndex(of: self.source)!] = self.destination
self.source.navigationController?.setViewControllers(controllerStack, animated: false)
} else {
self.source.present(self.destination, animated: false, completion: nil)
}
})
}
}
这几乎可以工作,但它在过渡期间无法正确定位目标视图,因此当 segue 的动画完成时,最后会出现“pop”。对齐似乎偏离了导航栏的大致高度,所以我怀疑这是一个线索。
(注意:在这个循环的 GIF 中,您可以看到“View Controller 1”上的按钮按下,动画交叉淡入淡出,按钮未对齐,然后在动画完成和目标视图结束时出现“pop”控制器终于被正确放置了。)
我如何正确定位它,使其按原样对齐并且动画流畅?
【问题讨论】:
-
在视图控制器的属性检查器中显示您的设置。它们彼此不同。而且你使用两种不同的方式来呈现视图控制器,因此你得到了不同的动画和位置。
-
两个视图控制器的属性与检查器中显示的相同。事实上,它们是相同的,因为我复制了第一个控制器,只是将按钮的标题更改为“View Controller 2”。
-
我真的很想对你的问题投反对票,因为我很生气。但也许相反,我对您问题的批评可能会帮助您。究竟如何“对齐视图控制器”?你对齐视图,而不是控制器,对吧?所以也许你已经开始回答你自己的问题了? (请不要试图反对,只是指出一些可能对你有帮助的东西。祝你好运!)
-
是的,准确地说,我希望对齐两个视图控制器的主视图。如果我这样做,这些视图中的按钮将明显对齐。我认为这很明显,因为我在代码中设置了一个视图的框架与另一个视图的框架等效,但我会更新这个问题,这样它就很清楚了。关于答案的任何想法?
-
你是如何定位你的按钮的?自动布局?有什么限制?
标签: ios swift uiviewcontroller uinavigationcontroller uistoryboardsegue