UISplitViewController学习笔记(iOS8)

UISplitViewController学习笔记(iOS8),第1张

概述UISplitViewController学习笔记(iOS8) UISplitViewController iOS8 iOS 转载至:https://www.zybuluo.com/zhangyuhangk/note/137390 Storyboard如下:    左边是split view controller  右上是master (或primary) view controller  右下是 UISplitVIEwController学习笔记(iOS8)

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默认是展开的状态,当应用以竖屏启动时,系统会在显示前就作一次合并的动作。

2. UIVIEwController

上面说到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展开回来

3. UINavigationController

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)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1088313.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)