1、分割视图控制器(UISplitViewController)
在iPhone应用中,使用导航控制器由上一层界面进入下一层界面。
但iPad屏幕较大,通常使用SplitViewController来实现导航(这个是iPad专用的视图控制器)。在横屏下,左侧显示一个导航列表,点击后右边显示对应的详情。竖屏情况下显示方式会有所不同,默认只显示详细面板,原来左侧的导航列表会通过浮动窗口隐藏,需要从边缘向内拖动来显示。
2、开发兼容的iOS应用
有时候需要开发兼容iPhone、iPod、iPad的应用,这时候需要判断设备类型,如果是iPhone、iPod就不应该使用SplitViewController。另外处理方式也会有变化,如点击列表项时,在iPad直接在右侧展示详情,而iPhone却需要导航到详细页。
iOS提供了UIDevice类来判断设备的类型,其userInterfaceIdiom属性返回设备类型枚举
效果:
image.png
iPad:(注:iPad要旋转成横屏,竖屏下一片空白)
代码:
SceneDelegate
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Override point for customization after application launch.
self.window!.backgroundColor = UIColor.white
//初始化列表面板
let master = MasterViewController()
//初始化详情面板
let detail = DetailViewController()
//设置列表面板引用详情面板,以便用户点击列表项时调用详情面板的相应方法
master.detailViewController = detail
//用导航包装master列表,显示导航条,如果是分割面板也不影响功能
let nav = UINavigationController(rootViewController: master)
// 如果是iPhone或iPod则只显示列表页,如果是iPad则显示分割面板
if (UIDevice.current.userInterfaceIdiom == .phone) {
self.window!.rootViewController = nav
}
else {
//初始化分割面板
let split = UISplitViewController()
//设置分割面板的2个视图控制器
split.viewControllers = [nav, detail]
//分割面板作为window的主视图加载
self.window!.rootViewController = split
}
guard let _ = (scene as? UIWindowScene) else { return }
}
MasterViewController
import UIKit
class MasterViewController: UIViewController {
// 表格加载
var tableView:UITableView?
// 控件类型
var ctrls = ["UILabel", "UIButton", "UIImageView", "UISlider"]
//
var detailViewController:DetailViewController?
override func viewDidLoad()
{
super.viewDidLoad()
self.title = "Swift控件演示"
self.tableView = UITableView(frame:self.view.frame, style:UITableView.Style.plain)
self.tableView!.delegate = self
self.tableView!.dataSource = self
self.tableView!.register(UITableViewCell.self, forCellReuseIdentifier: "SwiftCell")
self.view.addSubview(self.tableView!)
}
}
extension MasterViewController: UITableViewDelegate, UITableViewDataSource
{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.ctrls.count;
}
// UITableViewDataSource协议方法
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: "SwiftCell",
for: indexPath)
cell.accessoryType = UITableViewCell.AccessoryType.disclosureIndicator
cell.textLabel?.text = self.ctrls[indexPath.row]
return cell
}
// UITableViewDelegate协议方法,点击时调用
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
//调用DetailViewController的方法更新详细页
detailViewController!.loadControl(ctrl: self.ctrls[indexPath.row])
//如果是iPhone、iPod则导航到详情页
if (UIDevice.current.userInterfaceIdiom == .phone) {
// 跳转到detailViewController,取消选中状态
//self.tableView!.deselectRowAtIndexPath(indexPath, animated: true)
// navigationController跳转到detailViewController
self.navigationController!.pushViewController(detailViewController!, animated:true)
}
}
}
DetailViewController
import UIKit
class DetailViewController: UIViewController
{
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.white
let ctrl = self.title != nil ? self.title! : ""
loadControl(ctrl: ctrl)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func loadControl(ctrl:String) {
clearViews()
switch (ctrl) {
case "UILabel":
let label = UILabel(frame: self.view.bounds)
label.backgroundColor = UIColor.clear
label.textAlignment = NSTextAlignment.center
label.font = UIFont.systemFont(ofSize: 36)
label.text = "Hello, 小驴拉磨"
self.view.addSubview(label)
case "UIButton":
let button = UIButton(frame: CGRect(x:110,y:120,width:100,height:60))
button.backgroundColor = UIColor.blue
button.setTitleColor(UIColor.red, for: UIControl.State.normal)
button.setTitleColor(UIColor.white, for: UIControl.State.highlighted)
button.setTitle("点击我", for: .normal)
self.view.addSubview(button)
default:
print("clicked: \(ctrl)")
}
}
func clearViews() {
for v in self.view.subviews {
v.removeFromSuperview()
}
}
}