UISplitVIEwController
iOS8
iOS 转载至:https://www.zybuluo.com/zhangyuhangk/note/137390
Storyboard如下:
左边是split vIEw controller
右上是master (或primary) vIEw controller
右下是detail (或secondary) vIEw controller 合并和展开(collapse & expand)
iOS8加入了size classes,并且允许iPhone上使用UISplitVIEwController。
当水平方向的size class为Compact时,split vIEw显示为合并
当水平方向的size class为Regular时,split vIEw显示为展开
可以使用iPhone6 Plus模拟器来运行,因为它竖屏的时候是Compact,横屏的时候是Regular。只要转一下就可以切换了,比较方便(以下均以iPhone6 Plus模拟器为例)。
合并和展开的时候会触发哪些事件或方法呢?
1. UISplitVIEwControllerDelegate先设置delegate
func application(application: UIApplication, dIDFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { splitVIEwControler.delegate = self return true}
实现UISplitVIEwControllerDelegate
extension AppDelegate: UISplitVIEwControllerDelegate { func splitVIEwController(splitVIEwController: UISplitVIEwController, collapseSecondaryVIEwController secondaryVIEwController: UIVIEwController, ontoprimaryVIEwController primaryVIEwController: UIVIEwController) -> Bool { if some_condition { return false // collapse } return true // do not collapse } func splitVIEwController(splitVIEwController: UISplitVIEwController, separateSecondaryVIEwControllerFromPrimaryVIEwController primaryVIEwController: UIVIEwController) -> UIVIEwController? { if some_condition { return MySecondaryVIEwController() } return nil }}
split vIEw controller合并时会调用splitVIEwController:collapseSecondaryVIEwController:ontoprimaryVIEwController函数。如果不实现该函数或者返回false,则secondary vIEw controller会合并到primary vIEw controller上去。若返回true,则表示你自己处理了这个合并的行为,系统就不会再合并了。
展开时则调用splitVIEwController:separateSecondaryVIEwControllerFromPrimaryVIEwController函数。若不实现该函数或返回nil,则将原来合并到primary vIEw controller上的secondary vIEw controller拆分出来。
split vIEw默认是展开的状态,当应用以竖屏启动时,系统会在显示前就作一次合并的动作。
上面说到split vIEw controller会将secondary vIEw controller合并到primary vIEw contrller上,但是怎么实现合并的呢?
如果primary vIEw contrller是个UINavigationController(大部分情况它都是),那secondary vIEw contrller就是直接被push上去(即使secondary vIEw contrller本身也是个UINavigationController)。
那如果primary vIEw controller只是个普通的UIVIEwController呢?
iOS8为UIVIEwController添加了两个函数来响应合并和展开:
func collapseSecondaryVIEwController(secondaryVIEwController: UIVIEwController, forSplitVIEwController splitVIEwController: UISplitVIEwController)func separateSecondaryVIEwControllerForSplitVIEwController(splitVIEwController: UISplitVIEwController) -> UIVIEwController?
行为和UISplitVIEwControllerDelegate的两个函数类似
默认的实现:
合并时,primary vIEw controller只保存secondaryVIEwController的引用,UI没变化,还是只显示primary vIEw controller
展开时,把secondaryVIEwController展开回来
UINavigationController重写了上述两个函数,相应地调用了pushVIEwController和popVIEwController
注意:如果primary和secondary vIEw controller都是UINavigationController。如下图:
横屏时,各自显示为navigation vIEw controller,并且 Title的值不同,navigation bar的TitleTextAttributes也不同
合并时,secondary vIEw controller显示在上面,包括Title。但是此时navigation bar的样式(比如tintcolor或TitleTextAttributes)用的是primary vIEw controller的!
如果希望合并后仍然使用secondary vIEw contrller的样式,就需要在代码中显式赋值了。
extension AppDelegate: UINavigationControllerDelegate { func navigationController(navigationController: UINavigationController, willShowVIEwController vIEwController: UIVIEwController, animated: Bool) { UIVIEw.animateWithDuration(0.25) { let secondaryNavigationController = vIEwController as? UINavigationController self.applycolorFromNavigationController(secondaryNavigationController, toNavigationController: navigationController) } } private func applycolorFromNavigationController(fromVC: UINavigationController?, toNavigationController toVC: UINavigationController) { toVC.navigationbar.TitleTextAttributes = fromVC?.navigationbar.TitleTextAttributes toVC.navigationbar.tintcolor = fromVC?.navigationbar.tintcolor }}
辅助函数applycolorFromNavigationController:toNavigationController函数中的fromVC如果传nil,则toVC.navigationbar的TitleTextAttributes和tintcolor均会被置为nil,效果相当于重置为系统默认样式。
此处选择在UINavigationControllerDelegate的navigationController:willShowVIEwController:animated函数中设置样式。该函数在合并和展开时都会被调用。vIEwController参数就是即将要成为topVIEwController的vIEw controller。
当然也可以在UISplitVIEwControllerDelegate中设置,只是这样实现会稍麻烦。
第一次写近似教程的笔记,感觉不太自然,文章结构也乱七八糟,不晓得别人能不能看得懂。希望这些文章能帮到其他在自学路上奋斗的人吧。我会再努力,争取写得像样一点^_^
总结以上是内存溢出为你收集整理的UISplitViewController学习笔记(iOS8)全部内容,希望文章能够帮你解决UISplitViewController学习笔记(iOS8)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)