1涌哲、前言
我們先來看一下這幾個概念的類繼承關(guān)系圖:
iOS 中胖缤,所有顯示在界面上的對象都是從 UIResponder 直接或間接繼承的。
2阀圾、應(yīng)用程序(UIApplication)
一個 UIApplication 對象就代表一個應(yīng)用程序哪廓。一個 iOS 程序啟動后創(chuàng)建的第一個對象就是 UIApplication 對象(只有一個),而且是單例的初烘。
如有需要涡真,可以通過如下代碼獲取該單例對象:
1. let app = UIApplication.sharedApplication()
利用 UIApplication 對象,可以進行一些應(yīng)用級別的操作肾筐。
(1)設(shè)置應(yīng)用圖標右上角的紅色提醒數(shù)字
app.applicationIconBadgeNumber = 3
(2)設(shè)置聯(lián)網(wǎng)指示器的可見性
app.networkActivityIndicatorVisible = true
(3)管理狀態(tài)欄
app.setStatusBarStyle(UIStatusBarStyle.Default, animated: true)
app.setStatusBarHidden(false, withAnimation: UIStatusBarAnimation.Fade)
(4)openURL 方法
// 發(fā)信息
app.openURL(NSURL(string: "sms://10010")!)
// 發(fā)郵件
app.openURL(NSURL(string: "mailto://jinnchang@126.com")!)
// 打開一個網(wǎng)頁
app.openURL(NSURL(string: "http://blog.csdn.net/jinnchang")!)
// 跳轉(zhuǎn)到 AppStore
app.openURL(NSURL(string: "https://itunes.apple.com/cn/app/qq/id444934666?mt=8")!)
3哆料、視圖(UIView)
UIView 的實例即視圖,負責在屏幕上定義一個矩形區(qū)域吗铐,同時處理該區(qū)域的繪制和觸屏事件东亦。視圖可以嵌套,也可以像圖層一樣進行疊加唬渗。
4典阵、窗口(UIWindow)
UIWindow 管理和協(xié)調(diào)應(yīng)用程序的顯示,雖然 UIWindow 繼承自 UIView谣妻,但通常不直接操作 UIWindow 對象中與視圖相關(guān)的屬性變量。
iOS 程序啟動完畢后卒稳,創(chuàng)建的第一個視圖控件就是 UIWindow(創(chuàng)建的第一個對象是 UIApplication)蹋半,接著創(chuàng)建控制器的 view,最后將控制器的 view 添加到 window 上充坑,于是控制器的 view 就顯示在屏幕上了减江。一般情況下染突,應(yīng)用程序只有一個 UIWindow 對象,即使有多個辈灼,也只有一個 UIWindow 可以接受到用戶的觸屏事件份企。
(1)自定義一個 myWindow
let myWindow = UIWindow(frame: UIScreen.mainScreen().bounds)
(2)設(shè)置 myWindow 為主窗口并顯示出來(view 不能憑空顯示,必須依賴 window)
myWindow.makeKeyAndVisible()
UIWindow 和 UIView 之間的關(guān)系也可以想象成這樣一個場景:首先會有一個空的畫框(UIWindow)巡莹,我們在畫框上放置一塊畫布(UIView)司志,然后可以在這個畫布上進行繪畫。畫布上可能會被畫上各種元素降宅,例如 UILabel骂远、UIButton 等,這些元素其實也是一個又一個 UIView腰根,它們會有一個層級關(guān)系管理激才,有點類似于 Photoshop 中圖層的概念,層級高的元素會覆蓋住層級低的元素额嘿,從而導(dǎo)致層級低的元素被部分或完全遮擋瘸恼。
5、屏幕(UIScreen)
通過這個類我們可以獲取一些關(guān)于屏幕的信息册养,通常用來獲取屏幕尺寸东帅。
// 返回帶有狀態(tài)欄的 Rect
let screenBounds = UIScreen.mainScreen().bounds
// 返回不含狀態(tài)欄的 Rect
let viewBounds = UIScreen.mainScreen().applicationFrame
6、視圖控制器(UIViewController)
視圖控制器管理 UIView 實例的生命周期及資源的加載與釋放捕儒、處理由于設(shè)備旋轉(zhuǎn)導(dǎo)致的界面旋轉(zhuǎn)冰啃、以及和用于構(gòu)建復(fù)雜用戶界面的高級導(dǎo)航對象進行交互。
下圖展示了 UIView刘莹、UIWindow阎毅、UIScreen、UIViewController 之間的層級關(guān)系:
想要完整了解 UIViewController 用法可以參考 Github 上關(guān)于 UIViewController 的示例:UIViewControllerSample
7点弯、導(dǎo)航控制器(UINavigationController)
在介紹 UINavigationController 之前先介紹另一個概念:容器(Container)扇调。一個 app 可能有很多的 UIViewController 組成,這時需要一個容器來對這些 UIViewController 進行管理抢肛。大部分的容器也是一個 UIViewController狼钮,如 UINavigationController、UITabBarController捡絮,也有少數(shù)不是 UIViewController熬芜,比如 UIPopoverController 等。
UINavigationController 繼承自 UIViewController福稳,通常我們新建的工程是直接將視圖控制器添加到 window 上的涎拉,如果添加了 navigation 以后就多了一層。
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
// 初始化 window
window = UIWindow(frame: UIScreen.mainScreen().bounds)
window?.backgroundColor = UIColor.grayColor()
// 初始化 navigationController
let viewController = ViewController(nibName: nil, bundle: nil)
let navigationController = UINavigationController(rootViewController: viewController)
// 設(shè)置 window 的根控制器為 navigationController
window?.rootViewController = navigationController
// 設(shè)置 window 為主窗口并顯示出來
window?.makeKeyAndVisible()
return true
}
以下是 UINavigationController 的結(jié)構(gòu)圖:
通過 UINavigationController 進行視圖切換的兩種常用方式:
(1)presentViewController
// 向上彈出視圖
let firstViewController = FirstViewController(nibName: nil, bundle: nil)
self.navigationController?.presentViewController(firstViewController, animated: true, completion: nil)
// 退出視圖
self.dismissViewControllerAnimated(true, completion: nil)
(2)pushViewController
// 向左推出視圖
let secondViewController = SecondViewController(nibName: nil, bundle: nil)
self.navigationController?.pushViewController(secondViewController, animated: true);
// 退出視圖
self.navigationController?.popToRootViewControllerAnimated(true)