Swift: 是用Custom Segue还是用Transition动画
用一个很简单的场景做为例子:在storyboard上,你有用 很多的例子会说写一个cusom的 下面就开始介绍这个很牛X的方法。首先创建一个single view的项目。名称可以叫做 下面分别为table view controller创建类
segue
接下来给 class TDTableViewController: UITableViewController {
var tableViewDataSource: [String]?
override func viewDidLoad() {
super.viewDidLoad()
createDataSource()
}
createDataSource() {
if let _ = self.tableViewDataSource {
return
}
self.tableViewDataSource = [String]()
for i in 0..<100 {
self.tableViewDataSource!.append("item :- [(i)]")
}
}
//............
}
打开storyboard,在 在 TDViewController: UIViewController {
@IBOutlet weak var dataLabel: UILabel!
var singleData: String!
super.viewDidLoad()
self.dataLabel.text = self.singleData
}
}
使用默认的segue,这里现在是show模式,跳转。并从table view controller出传递数据给view controller: // 使用segue跳转
tableView(tableView: UITableView,didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.dataItem = self.tableViewDataSource![indexPath.row]
self.performSegueWithIdentifier("TDViewController",sender: nil)
}
// 传递数据
prepareForSegue(segue: UIStoryboardSegue,sender: AnyObject?) {
if segue.identifier != "TDViewController" {
let destinationController = segue.destinationViewController as! TDViewController
destinationController.singleData = self.dataItem!
}
run一把来看看: Segue和Transitioncustom segue直接用代码把两种方式都实现出来,分别代替上面使用的默认的实现方式。 首先弄一个custom segue。要开发一个custom segue,首先需要创建一个类并继承自 import UIKit
DetailStoryboardSegue: UIStoryboardSegue {
perform() {
let sourceView = self.sourceViewController.view // 1
let destView = self.destinationViewController.view
let window = (UIApplication.sharedApplication().delegate 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有两个方法是必须实现的, DetailTransitioningAnimator: NSObject,UIViewControllerAnimatedTransitioning {
let durationTimeInterval: NSTimeInterval
// 1
init(duration: NSTimeInterval){
durationTimeInterval = duration
}
transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
return self.durationTimeInterval
}
//2
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 = 1.0
},completion: {completed in
let cancelled = transitionContext.transitionWasCancelled()
transitionContext.completeTransition(!cancelled)
})
}
animationEnded(transitionCompleted: Bool) {
}
}
下面把transitioning动画应用到代码中。在使用的时候需要实现 NavigationControllerDelegate: UINavigationControllerDelegate {
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
here
to be continued。。。(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |