判断设备类型

 
1,分割视图控制器(UISplitViewController)

在iPhone应用中,使用导航控制器由上一层界面进入下一层界面。
但iPad屏幕较大,通常使用SplitViewController来实现导航(这个是iPad专用的视图控制器)。在横屏下,左侧显示一个导航列表,点击后右边显示对应的详情。竖屏情况下显示方式会有所不同,默认只显示详细面板,原来左侧的导航列表会通过浮动窗口隐藏,需要从边缘向内拖动来显示。
 
2,开发兼容的iOS应用
有时候需要开发兼容iPhone、iPod、iPad的应用,这时候需要判断设备类型,如果是iPhone、iPod就不应该使用SplitViewController。另外处理方式也会有变化,如点击列表项时,在iPad直接在右侧展示详情,而iPhone却需要导航到详细页。
iOS提供了UIDevice类来判断设备的类型,其userInterfaceIdiom属性返回设备类型枚举
 
3,样例效果图
  iPhone:
     
  iPad:
   

 

4,样例代码
--- AppDelegate.swift 应用入口 ---

 import UIKit

 @UIApplicationMain
 class AppDelegate: UIResponder, UIApplicationDelegate {

     var window: UIWindow?

     func application(application: UIApplication,
         didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> 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则显示分割面板
24         if (UIDevice.currentDevice().userInterfaceIdiom == .Phone) {
25             self.window!.rootViewController = nav
26         }
27         else {
28             //初始化分割面板
29             let split = UISplitViewController()
30             //设置分割面板的2个视图控制器
31             split.viewControllers = [nav, detail]
32
33             //分割面板作为window的主视图加载
34             self.window!.rootViewController = split
35         }
36
         return true
     }

     func applicationWillResignActive(application: UIApplication) {
     }

     func applicationDidEnterBackground(application: UIApplication) {
     }

     func applicationWillEnterForeground(application: UIApplication) {
     }

     func applicationDidBecomeActive(application: UIApplication) {
     }

     func applicationWillTerminate(application: UIApplication) {
     }
 }

--- MasterViewController.swift 列表页 ---

 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])

53         //如果是iPhone、iPod则导航到详情页
54         if (UIDevice.currentDevice().userInterfaceIdiom == .Phone) {
55             // 跳转到detailViewController,取消选中状态
56             //self.tableView!.deselectRowAtIndexPath(indexPath, animated: true)
57
58             // navigationController跳转到detailViewController
59             self.navigationController!.pushViewController(detailViewController!, animated:true)
60         }
     }
 }

--- DetailViewController.swift 详情页 ---

 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()
             label.text = "Hello, Hangge.com"
             self.view.addSubview(label)
         case "UIButton":
             var button = UIButton(frame: CGRectMake(,,,))
             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的二级导航功能)

iOS开发——设备篇Swift篇&判断设备类型的更多相关文章

  1. iOS开发——技术精华Swift篇&Swift 2.0和Objective-C2.0混编之第三方框架的使用

    swift 语言是苹果公司在2014年的WWDC大会上发布的全新的编程语言.Swift语言继承了C语言以及Objective-C的特性,且克服了C语言的兼容性问题.Swift语言采用安全编程模式,且引 ...

  2. iOS开发——新特性Swift篇&Swift 2.0 异常处理

    Swift 2.0 异常处理 WWDC 2015 宣布了新的 Swift 2.0. 这次重大更新给 Swift 提供了新的异常处理方法.这篇文章会主要围绕这个方面进行讨论. 如何建造异常类型? 在 i ...

  3. iOS开发——网络编程Swift篇&Alamofire详解

    Alamofire详解 预览图 Swift Alamofire 简介 Alamofire是 Swift 语言的 HTTP 网络开发工具包,相当于Swift实现AFNetworking版本. 当然,AF ...

  4. iOS开发——网络编程Swift篇&(八)SwiftyJSON详解

    SwiftyJSON详解 最近看了一些网络请求的例子,发现Swift在解析JSON数据时特别别扭,总是要写一大堆的downcast(as?)和可选(Optional),看?号都看花了.随后发现了这个库 ...

  5. ios开发——实用技术篇Swift篇&地址薄、短信、邮件

    //返回按钮事件 @IBAction func backButtonClick() { self.navigationController?.popViewControllerAnimated(tru ...

  6. iOS开发零基础--Swift篇:逻辑分支

    一. 分支的介绍 分支即if/switch/三目运算符等判断语句 通过分支语句可以控制程序的执行流程 二. if分支语句 和OC中if语句有一定的区别 判断句可以不加() 在Swift的判断句中必须有 ...

  7. ios开发——实用技术总结Swift篇&swift常用开发技术总结

    swift常用开发技术总结 懒加载:属性,数组(字典),控件... 数组(懒加载): lazy var shops:Array<Dictionary<String, String>& ...

  8. iOS开发——数据持久化Swift篇&(二)沙盒文件

    沙盒文件 //******************** 5.2 文件操作 func use_FileOperations() { //1.获取程序的Home目录 let homeDirectory = ...

  9. iOS开发——数据持久化Swift篇&文件目录路径获取(Home目录,文档目录,缓存目录等)

    文件目录路径获取(Home目录,文档目录,缓存目录等)   iOS应用程序只能在自己的目录下进行文件的操作,不可以访问其他的存储空间,此区域被称为沙盒.下面介绍常用的程序文件夹目录:   1,Home ...

  10. iOS开发——网络编程Swift篇&(七)NSURLSession详解

    NSURLSession详解 // MARK: - /* 使用NSURLSessionDataTask加载数据 */ func sessionLoadData() { //创建NSURL对象 var ...

随机推荐

  1. [转] arcgis Engine创建shp图层

    小生 原文 arcgis Engine创建shp图层 以创建点图层为例.首先要得到保存文件的地址. SaveFileDialog saveFileDialog = new SaveFileDialog ...

  2. [Everyday Mathematics]20150125

    试求极限 $$\bex \lim_{x\to 0^+}\int_x^{2x} \frac{\sin^m t}{t^n}\rd t\quad\sex{m,n\in\bbN}. \eex$$

  3. sublime text2中ctags安装问题的解决

    其实按照http://blog.csdn.net/xiao_qiang_/article/details/9074557基本可以安装好,不过我还是遇到了问题.说一下我如何解决在MAC上安装时的奇葩问题 ...

  4. 利用HTML 5中的Menu和Menuitem元素快速创建菜单

    原文:Introducing the HTML5 “Menu” and “Menuitem” Elements 译文:HTML 5中Menu和Menuitem的元素介绍 译者:dwqs 今天向你介绍H ...

  5. Ubuntu 软件包管理详解

    原文转载自:http://www.cppblog.com/jb8164/archive/2009/01/09/71583.html Ubuntu 方便宜用,最值得让人称道的便是其安装软件的方式, 一条 ...

  6. Camera图片特效处理综述(Bitmap的Pixels处理、Canvas/paint的drawBitmap处理、旋转图片、裁截图片、播放幻灯片浏览图片<线程固定时间显示一张>)

    一种是直接对Bitmap的像素进行操作,如:叠加.边框.怀旧.(高斯)模糊.锐化(拉普拉斯变换). Bitmap.getPixels(srcPixels, 0, width, 0, 0, width, ...

  7. 在阿里云linux下使用SVN访问VisualSVN出错:SSL handshake failed: SSL error: Key usage violation in certificate has been detected

    Subversion clients receive the following error message when attempting to connect to VisualSVN Serve ...

  8. OpenCV中IplImage和Mat间的相互转换

    OpenCV中做图像处理经常用到IplImage和Mat间的相互转换. 首先,cv::Mat是opencv2.0中的数据类型:IplImage是opencv1.0中的类型,两种类型并不相同. 1. I ...

  9. 20150913K-means聚类

    1.聚类的思想: 将一个有N个对象的数据集,构造成k(k<=n)个划分,每个划分代表一个簇.使得每个簇包含一个对象,每个对象有且仅属于一个簇.对于给定的k,算法首先给出一个初始的划分方法,以后通 ...

  10. mysql的登录密码带特殊符号登录不进去的问题

    eg : mysqldump -u root -p)P:9 ${dbname} > $dataPath$filename 当我将数据库的数据每天进行自动导出时,需要带上密码,但 ) 是一个特殊符 ...