正文
ios 界面开发最重要的是viewcontroller和view,viewcontroller是view的控制器,也就是一般的页面,用来管理页面的生命周期(它相当于安卓里的activity,两者很像,又有一些差异)。
viewcontroller的特点是它有好几种。一种最基本的uiviewcontroller,和另外三种容器:uinavigationcontroller、uitabbarcontroller、uipageviewcontroller。
所谓容器,就是它们本身不能单独用来显示,必须在里面放一个或几个uiviewcontroller。
不同容器有不同的页面管理方式和展示效果:
- uinavigationcontroller 用导航栏管理页面
- uitabbarcontroller 用底部tab管理页面
- uipageviewcontroller 用切换器管理页面
容器还可以嵌套,比如把uitabbarcontroller放进uinavigationcontroller里面,这样在tab页面里,可以用启动导航栏样式的二级子页面。
1 uiviewcontroller
这是最简单的页面,没有导航栏。
使用present方法展示,展示时从底部弹起,可以用下滑手势关闭,也可以多次启动叠加多个页面。
class viewcontroller: uiviewcontroller { override func viewdidload() { super.viewdidload() // do any additional setup after loading the view. title = "\(self.hash)" var label = uibutton(frame: cgrect(x: 10, y: 100, width: 300, height: 100)) label.settitle("present viewcontroller", for: .normal) view.addsubview(label) label.addtarget(self, action: #selector(presentvc), for: .touchupinside) label = uibutton(frame: cgrect(x: 10, y: 200, width: 300, height: 100)) label.settitle("present navigationcontroller", for: .normal) view.addsubview(label) label.addtarget(self, action: #selector(presentnc), for: .touchupinside) label = uibutton(frame: cgrect(x: 10, y: 300, width: 300, height: 100)) label.settitle("push viewcontroller", for: .normal) view.addsubview(label) label.addtarget(self, action: #selector(pushvc), for: .touchupinside) label = uibutton(frame: cgrect(x: 10, y: 400, width: 300, height: 100)) label.settitle("present tabbarcontroller", for: .normal) view.addsubview(label) label.addtarget(self, action: #selector(presenttc), for: .touchupinside) label = uibutton(frame: cgrect(x: 10, y: 500, width: 300, height: 100)) label.settitle("present pageviewcontroller", for: .normal) view.addsubview(label) label.addtarget(self, action: #selector(presentpc), for: .touchupinside) } @objc func presentvc() { let vc = viewcontroller() vc.view.backgroundcolor = .darkgray present(vc, animated: true) } @objc func presentnc() { let vc = viewcontroller() vc.view.backgroundcolor = .gray let nc = uinavigationcontroller(rootviewcontroller: vc) present(nc, animated: true) } @objc func presenttc() { let tc = mytabbarcontroller() tc.view.backgroundcolor = .blue let nc = uinavigationcontroller(rootviewcontroller: tc) present(nc, animated: true) } @objc func presentpc() { let pc = mypageviewcontroller() pc.view.backgroundcolor = .red let nc = uinavigationcontroller(rootviewcontroller: pc) present(nc, animated: true) } @objc func pushvc() { let vc = viewcontroller() vc.view.backgroundcolor = .purple if let nc = navigationcontroller { nc.pushviewcontroller(vc, animated: true) } else { print("navigationcontroller nil!") } } }
2 uinavigationcontroller
这是最常用的页面导航方式,顶部展示导航栏,有标题、返回按钮。
使用pushviewcontroller方法展示,展示时从右往左出现,可以用右滑手势关闭,也可以多次启动叠加多个页面。
注意:
uinavigationcontroller用来管理一组uiviewcontroller,这些uiviewcontroller共用一个导航栏。
一般来说,uinavigationcontroller能很好地控制导航栏上面的元素显示和转场效果。
如果需要定制导航栏元素,尽量修改uiviewcontroller的导航栏,不要直接修改uinavigationcontroller的导航栏。
3 uitabbarcontroller
这个一般用来做主页面的展示,下面配置多个tab,用来切换页面。
class mytabbarcontroller: uitabbarcontroller { init() { super.init(nibname: nil, bundle: nil) self.tabbar.backgroundcolor = .gray let vc1 = viewcontroller() vc1.tabbaritem.image = uiimage(named: "diamond") vc1.tabbaritem.title = "tab1" vc1.view.backgroundcolor = .red let vc2 = viewcontroller() vc2.tabbaritem.image = uiimage(named: "diamond") vc2.tabbaritem.title = "tab2" vc2.view.backgroundcolor = .blue let vc3 = viewcontroller() vc3.tabbaritem.image = uiimage(named: "diamond") vc3.tabbaritem.title = "tab3" vc3.view.backgroundcolor = .purple self.viewcontrollers = [ vc1, vc2, vc3, ] } required init?(coder: nscoder) { fatalerror("init(coder:) has not been implemented") } }
4 uipageviewcontroller
这个用来做翻页的页面,比如电子书或者广告banner。可以配置左右或上下翻译,翻页效果可以配置滚动或者模拟翻书。
用viewcontrollerbefore和viewcontrollerafter回调方法控制页面切换。viewcontrollerbefore方法是让我们给它提供当前页面的前一个页面,viewcontrollerafter方法是让我们给它提供当前页面的后一个页面。
注意:
uipageviewcontroller有预加载机制,它会提前加载当前页面的前后页面。
但是它没有实现页面缓存机制,需要我们在外部做缓存。
如果页面非常多,但又是同一个类的实例,那么一般创建三个实例就够了,然后在viewcontrollerbefore和viewcontrollerafter方法里循环使用这三个。
class mypageviewcontroller: uipageviewcontroller, uipageviewcontrollerdatasource { lazy var vcs = [ viewcontroller(), viewcontroller(), viewcontroller(), viewcontroller(), viewcontroller(), ] init() { super.init(transitionstyle: .scroll, navigationorientation: .horizontal) self.datasource = self let vc1 = viewcontroller() vc1.view.backgroundcolor = .red let vc2 = viewcontroller() vc2.view.backgroundcolor = .blue let vc3 = viewcontroller() vc3.view.backgroundcolor = .purple let vc4 = viewcontroller() vc4.view.backgroundcolor = .gray vcs = [vc1,vc2,vc3,vc4 ] self.setviewcontrollers([vcs[0]], direction: .forward, animated: false) } required init?(coder: nscoder) { fatalerror("init(coder:) has not been implemented") } func pageviewcontroller(_ pageviewcontroller: uipageviewcontroller, viewcontrollerbefore viewcontroller: uiviewcontroller) -> uiviewcontroller? { let i = (vcs.firstindex(of: viewcontroller as! viewcontroller) ?? 0) - 1 if i < 0 { return nil } return vcs[i] } func pageviewcontroller(_ pageviewcontroller: uipageviewcontroller, viewcontrollerafter viewcontroller: uiviewcontroller) -> uiviewcontroller? { let i = (vcs.firstindex(of: viewcontroller as! viewcontroller) ?? 0) + 1 if i >= vcs.count { return nil } return vcs[i] } }
以上就是ios各种viewcontroller控制器使用示例完整介绍的详细内容,更多关于ios viewcontroller控制器的资料请关注代码网其它相关文章!
发表评论