如何在 iOS8 和 Swift 中推送视图
Posted
技术标签:
【中文标题】如何在 iOS8 和 Swift 中推送视图【英文标题】:How to push a view in iOS8 and Swift 【发布时间】:2014-12-05 14:35:20 【问题描述】:我正在更新 ios5 之前的应用程序 - 因此需要进行很多更改。 在现有应用中,我们将视图(在 nib 中创建)推送到包含 UIPickerView/UIDatePicker 的屏幕上,以允许用户进行选择。
我这应该是迁移到 iOS8/Swift 的一件容易的事情,但我在过去的 24 小时里一直在尝试用 Storyboard/Segue、Container 视图、viewControllers、UIPopoverPresentationControler 等找到最好的方法,但几乎没有达成共识(甚至苹果的示例代码都将 UIDatePicker 推送到表格单元格中)
这似乎是一个常见的要求,如果其他人如何解决这个问题,我将不胜感激。
非常感谢
【问题讨论】:
你能提供更多细节吗?至少是您尝试转换的 obj-c 代码。 【参考方案1】:试试这个
self.performSegueWithIdentifier("你的segue标识符", sender: self)
【讨论】:
您能提供更多细节吗?【参考方案2】:感谢您寻求澄清的答案和问题。 经过一个周末的调查,我意识到我已经陷入了旧的 iOS 模式。
在 iOS8 中,一切都转移到 ViewController 演示中,允许开发人员控制动画并定义一系列设备(不同方向)上的行为。
我的问题的最终答案(我相信)如下:
-
使用 UIPresentationController 呈现所需的 UIViewController:
视图控制器是要显示的视图(使用代码、nib 或故事板来创建选择器视图)
展示控制器管理它的展示方式(例如尺寸、展示风格)
这也是处理透明/模糊视图以覆盖现有内容的地方
签出: func sizeForChildContentContainer(container: UIContentContainer, withParentContainerSize parentSize: CGSize) -> CGSize func frameOfPresentedViewInContainerView() -> CGRect
-
UIPresentationController 需要一个过渡委托来管理演示(符合 UIViewControllerTransitioningDelegate)
// We need to create a presentation controller to manage the presentation of VC
func presentationControllerForPresentedViewController(presented: UIViewController, presentingViewController presenting: UIViewController!, sourceViewController source: UIViewController) -> UIPresentationController?
let opc = OverlayPresentationController(presentedViewController: presented, presentingViewController: source)
return opc
// Get hold of an animation controller for presentation
func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning?
let animationController = OverlayAnimatedTransitioning()
return animationController
// Get hold of an animation controller for dismissal
func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning?
let animationController = OverlayAnimatedTransitioning()
return animationController
这又需要一个动画控制器 (UIViewControllerAnimatedTransitioning) 来处理动画(滑动、溶解或其他更冒险的东西):
func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval 返回 0.5
func animateTransition(transitionContext: UIViewControllerContextTransitioning)
let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!
let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
let containerView = transitionContext.containerView()
let animationDuration = self .transitionDuration(transitionContext)
containerView.addSubview(toViewController.view)
UIView.animateWithDuration(animationDuration, animations: () -> Void in
<<< Animation Here>>>)
) (finished: Bool) in
transitionContext.completeTransition(true)
构建块到位后,可以调用所需的 UIViewController(使用动作/选择器/segue),并通过设置所需视图的 transitioningDelegate 属性来调用所需的效果:
@IBAction func showOVC(sender: AnyObject)
let ovc = OverlayViewController()
let overlayTransitioningDelegate = OverlayTransitioningDelegate()
ovc.transitioningDelegate = overlayTransitioningDelegate
self.presentViewController(ovc, animated: true, completion: nil)
解雇的处理方式相同,只需调用:
dismissViewControllerAnimated(true, 完成: nil)
更多信息可以通过文档和优秀的 WWDC 视频获得,这让我明白了一切:A look inside presentation controllers
或查看苹果的示例代码:LookInside
底线 - 不像以前那么简单(假设单个设备在一个方向),但稍微复杂一点,对视图和动画的控制要大得多,并且能够扩展到多个设备。
我希望这对处于类似位置的人有所帮助 谢谢
【讨论】:
以上是关于如何在 iOS8 和 Swift 中推送视图的主要内容,如果未能解决你的问题,请参考以下文章
如何在swift中基于Json id从集合视图didSelectItemAt推送不同的视图控制器