Swift - 判断设备类型开发兼容的iOS应用(iPad使用分隔视图控制器)

1,分割视图控制器(UISplitViewController)
在iPhone应用中,使用导航控制器由上一层界面进入下一层界面。
但iPad屏幕较大,通常使用SplitViewController来实现导航(这个是iPad专用的视图控制器)。在横屏下,左侧显示一个 导航列表,点击后右边显示对应的详情。竖屏情况下显示方式会有所不同,默认只显示详细面板,原来左侧的导航列表会通过浮动窗口隐藏,需要从边缘向内拖动来 显示。

2,开发兼容的iOS应用
有时候需要开发兼容iPhone、iPod、iPad的应用,这时候需要判断设备类型,如果是iPhone、iPod就不应该使用 SplitViewController。另外处理方式也会有变化,如点击列表项时,在iPad直接在右侧展示详情,而iPhone却需要导航到详细页。
iOS提供了UIDevice类来判断设备的类型,其userInterfaceIdiom属性返回设备类型枚举

3,样例效果图
  iPhone:
      
  iPad:(注:iPad要旋转成横屏,竖屏下一片空白)
   

4,样例代码
--- AppDelegate.swift 应用入口 ---
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import UIKit
 
@UIApplicationMain
class AppDelegate : UIResponder , UIApplicationDelegate {
                             
     var window: UIWindow ?
 
     func application(application: UIApplication ,
         didFinishLaunchingWithOptions launchOptions: [ NSObject : AnyObject ]?) -> Bool {
         self .window = UIWindow (frame: UIScreen .mainScreen().bounds)
         // Override point for customization after application launch.
         self .window!.backgroundColor = UIColor .whiteColor()
         self .window!.makeKeyAndVisible()
         
         //初始化列表面板
         let master = MasterViewController ()
         //初始化详情面板
         let detail = DetailViewController ()
         //设置列表面板引用详情面板,以便用户点击列表项时调用详情面板的相应方法
         master.detailViewController = detail
         //用导航包装master列表,显示导航条,如果是分割面板也不影响功能
         let nav = UINavigationController (rootViewController: master)
         // 如果是iPhone或iPod则只显示列表页,如果是iPad则显示分割面板
         if ( UIDevice .currentDevice().userInterfaceIdiom == . Phone ) {
             self .window!.rootViewController = nav
         }
         else {
             //初始化分割面板
             let split = UISplitViewController ()
             //设置分割面板的2个视图控制器
             split.viewControllers = [nav, detail]
         
             //分割面板作为window的主视图加载
             self .window!.rootViewController = split
         }
         
         return true
     }
 
     func applicationWillResignActive(application: UIApplication ) {
     }
 
     func applicationDidEnterBackground(application: UIApplication ) {
     }
 
     func applicationWillEnterForeground(application: UIApplication ) {
     }
 
     func applicationDidBecomeActive(application: UIApplication ) {
     }
 
     func applicationWillTerminate(application: UIApplication ) {
     }
}

--- MasterViewController.swift 列表页 ---
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import UIKit
 
class MasterViewController : UIViewController , UITableViewDelegate , UITableViewDataSource {
     
     // 表格加载
     var tableView: UITableView ?
     // 控件类型
     var ctrls = [ "UILabel" , "UIButton" , "UIImageView" , "UISlider" ]
     //
     var detailViewController: DetailViewController ?
     
     override func viewDidLoad() {
         super .viewDidLoad()
         // Do any additional setup after loading the view, typically from a nib.
         
         self .title = "Swift控件演示"
         self .tableView = UITableView (frame: self .view.frame, style: UITableViewStyle . Plain )
         self .tableView!.delegate = self
         self .tableView!.dataSource = self
         self .tableView!.registerClass( UITableViewCell . self , forCellReuseIdentifier: "SwiftCell" )
         self .view.addSubview( self .tableView!)
     }
     
     override func didReceiveMemoryWarning() {
         super .didReceiveMemoryWarning()
         // Dispose of any resources that can be recreated.
     }
     
     // UITableViewDataSource协议方法
     func tableView(tableView: UITableView , numberOfRowsInSection section: Int ) -> Int
     {
         return self .ctrls.count
     }
     
     // UITableViewDataSource协议方法
     func tableView(tableView: UITableView , cellForRowAtIndexPath indexPath: NSIndexPath )
         -> UITableViewCell
     {
         let cell = tableView.dequeueReusableCellWithIdentifier( "SwiftCell" ,
             forIndexPath: indexPath) as ! UITableViewCell
         cell.accessoryType = UITableViewCellAccessoryType . DisclosureIndicator
         cell.textLabel?.text = self .ctrls[indexPath.row]
         
         return cell
     }
     
     // UITableViewDelegate协议方法,点击时调用
     func tableView(tableView: UITableView , didSelectRowAtIndexPath indexPath: NSIndexPath )
     {
         //调用DetailViewController的方法更新详细页
         detailViewController!.loadControl( self .ctrls[indexPath.row])
         
         //如果是iPhone、iPod则导航到详情页
         if ( UIDevice .currentDevice().userInterfaceIdiom == . Phone ) {
             // 跳转到detailViewController,取消选中状态
             //self.tableView!.deselectRowAtIndexPath(indexPath, animated: true)
         
             // navigationController跳转到detailViewController
             self .navigationController!.pushViewController(detailViewController!, animated: true )
         }
     }
}

--- DetailViewController.swift 详情页 ---
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import UIKit
 
class DetailViewController : UIViewController {
     
     override func viewDidLoad() {
         super .viewDidLoad()
         // Do any additional setup after loading the view, typically from a nib.
         
         self .view.backgroundColor = UIColor .whiteColor()
         let ctrl = self .title != nil ? self .title! : ""
         loadControl(ctrl)
     }
     
     override func didReceiveMemoryWarning() {
         super .didReceiveMemoryWarning()
         // Dispose of any resources that can be recreated.
     }
     
     func loadControl(ctrl: String ) {
         clearViews()
         switch (ctrl) {
         case "UILabel" :
             var label = UILabel (frame: self .view.bounds)
             label.backgroundColor = UIColor .clearColor()
             label.textAlignment = NSTextAlignment . Center
             label.font = UIFont .systemFontOfSize(36)
             label.text = "Hello, Hangge.com"
             self .view.addSubview(label)
         case "UIButton" :
             var button = UIButton (frame: CGRectMake (110,120,100,60))
             button.backgroundColor = UIColor .blueColor()
             button.setTitleColor( UIColor .redColor(), forState: UIControlState . Normal )
             button.setTitleColor( UIColor .whiteColor(), forState: UIControlState . Highlighted )
             button.setTitle( "点击我" , forState: . Normal )
             self .view.addSubview(button)
         default :
             println ( "clicked: \(ctrl)" )
         }
     }
     
     func clearViews() {
         for v in self .view.subviews {
             v.removeFromSuperview()
         }
     }   
}
(注意:项目直接新建一个Master-Detail Application,就已经具有同上述一样的兼容iPhone、iPad的二级导航功能)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值