正文
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控制器的资料请关注代码网其它相关文章!
发表评论