在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
用一个很简单的场景做为例子:在storyboard上,你有用 很多的例子会说写一个cusom的 下面就开始介绍这个很牛X的方法。首先创建一个single view的项目。名称可以叫做
下面分别为table view controller创建类 接下来给 class TDTableViewController: UITableViewController { var tableViewDataSource: [String]? override func viewDidLoad() { super.viewDidLoad() createDataSource() } func createDataSource() { if let _ = self.tableViewDataSource { return } self.tableViewDataSource = [String]() for i in 0..<100 { self.tableViewDataSource!.append("item :- [\(i)]") } } //............ } 打开storyboard,在 在 class TDViewController: UIViewController { @IBOutlet weak var dataLabel: UILabel! var singleData: String! override func viewDidLoad() { super.viewDidLoad() self.dataLabel.text = self.singleData } } 使用默认的segue,这里现在是show模式,跳转。并从table view controller出传递数据给view controller: // 使用segue跳转 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { self.dataItem = self.tableViewDataSource![indexPath.row] self.performSegueWithIdentifier("TDViewController", sender: nil) } // 传递数据 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier != "TDViewController" { return } let destinationController = segue.destinationViewController as! TDViewController destinationController.singleData = self.dataItem! } run一把来看看: Segue和Transitioncustom segue直接用代码把两种方式都实现出来,分别代替上面使用的默认的实现方式。 首先弄一个custom segue。要开发一个custom segue,首先需要创建一个类并继承自 import UIKit class DetailStoryboardSegue: UIStoryboardSegue { override func perform() { let sourceView = self.sourceViewController.view // 1 let destView = self.destinationViewController.view let window = (UIApplication.sharedApplication().delegate as! AppDelegate).window window?.insertSubview(destView, aboveSubview: sourceView) // 2 destView.alpha = 0.0 UIView.animateWithDuration(0.3, animations: { // 3 destView.alpha = 1.0 }) } }
实现完成后,在storyboard中把segue的Kind 设置为custom,然后给Class设置为类 其实很简单,运行起来看看。
这个错误其实引出了一个问题,但是这里我们暂时不做深入讨论。先看看Transitioning animtion动画是怎么运行的,然后我们讨论这个严肃的问题。 custom transitioning animation实现自定义的切换动画就需要实现 这个protocol有两个方法是必须实现的, import UIKit class DetailTransitioningAnimator: NSObject, UIViewControllerAnimatedTransitioning { let durationTimeInterval: NSTimeInterval // 1 init(duration: NSTimeInterval){ durationTimeInterval = duration } func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval { return self.durationTimeInterval } //2 func animateTransition(transitionContext: UIViewControllerContextTransitioning) { let containerView = transitionContext.containerView() let sourceController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) let destController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) let sourceView = sourceController!.view let destView = destController!.view containerView?.addSubview(destView) // 3 destView.alpha = 0.0 UIView.animateWithDuration(0.3, animations: { destView.alpha = 1.0 }, completion: {completed in let cancelled = transitionContext.transitionWasCancelled() transitionContext.completeTransition(!cancelled) }) } func animationEnded(transitionCompleted: Bool) { } }
下面把transitioning动画应用到代码中。在使用的时候需要实现 import UIKit class NavigationControllerDelegate: NSObject, UINavigationControllerDelegate { func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { return DetailTransitioningAnimator(duration: 0.3) } } 这里没有太多需要讲的。只要知道是这个方法就可以了。 下面在storyboard中把类
对上面的custom segue代码去掉,并稍作修改之后,运行起来。
这个问题不重要,但是还是要讨论一下:为什么custom segue会出现问题,而transitoning动画就没有问题呢?这里是因为实际上transitioning动画是在navigation controller的基础上改变的。Transitioning动画只是修改了navigation controller的push动画,改成了fade in的效果,而navigation controller的其他机制没有改动。custom segue则完全是两个view之间的动画。那么,这里就留下一个问题由读者去修改上面的custom segue代码来让这个navigation bar 出现出来。 但是什么情况下用custom segue,什么情况下用transition动画呢?Transitioning动画更加的灵活,不像custom segue是在storyboard里定死的。你可以根据不同的情况设定你自己想要的动画。 custom segue就是用来调用一些如: 最后补充一点。也是一个发挥custom segue的作用的地方。在多个storyboard的情况下可以使用custom segue。步骤:(假设你已经创建了另外一个storyboard,叫做Another.storyboard)
all code hereto be continued。。。
|
请发表评论