使得VC變成window的RootVC的方法:
UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainscreen] bounds];
levelViewController = [[LevelViewController alloc] init];
window.rootViewController = levelViewController;
[window makekeyAndVisible];
Views是如何load和unload的:在vc對象里彻况,對于view的管理分為兩個循環(huán):load循環(huán)和unload循環(huán)蝶棋。Load循環(huán)出現(xiàn)在當(dāng)請求vc的view對象不存在與memory里時呵恢。 在unload循環(huán)中,vc試圖去release view對象并且返回vc初始且少view的狀態(tài)斩披。
Load循環(huán)如下所示:
a) VC會調(diào)用它的loadView方法。 LoadView的默認(rèn)方法會做這兩件事情:
i.如果vc是用storyboard來分配的,則從storyboard上load所有views
ii.如果vc不是由storyboard來分配的厕氨,那么將給view屬性分配一個空的view對象坝辫。
b) 會調(diào)用viewDidLoad方法篷就,去允許子類進行一些子對象的操作。
Unload循環(huán)會做如下步驟:
a) 接收 low-memory warning
b) 每一個view都會調(diào)用didReceiveMemoryWarning方法近忙。如果重寫這個方法竭业,需要去在里面release任何不再使用的vc對象和內(nèi)存。 千萬不要去釋放vc的view及舍。
c) Vc會調(diào)用viewWillUnload方法去通知子類views要被釋放未辆。覆蓋viewWillUnload方法一般來說是需要在view destroy之前去save一些變量。
d) 將view屬性置為nil
e) Vc調(diào)用了viewDidUnload方法去通知子類views已經(jīng)remove了锯玛。子類一般會在這個方法里去移除對這些views的strong引用咐柜。
如果想手工創(chuàng)建views,應(yīng)當(dāng)覆蓋loadView方法攘残。當(dāng)覆蓋loadView方法來創(chuàng)建view時拙友,不應(yīng)該call super。因為loadView應(yīng)當(dāng)實現(xiàn)所有需要繪制view的過程肯腕,而調(diào)用super會無謂的消耗cpu献宫。
去適應(yīng)屏幕旋轉(zhuǎn)可以參考以下步驟來做:
a) 覆蓋vc的shouldAutorotateToInterfaceOrientation:方法并且生命需要支持的方向。
b) 配置自己vc的view來自動適應(yīng)view的方向變化实撒。
旋轉(zhuǎn)過程解析:在基于iOS的設(shè)備旋轉(zhuǎn)時姊途,系統(tǒng)會send一個UIDeviceOrientationDidChangeNotification通知讓每個觀察者知道已經(jīng)發(fā)生變化了。一般來說知态,UIKit 框架會實現(xiàn)這個通知并自動完成了一些界面的旋轉(zhuǎn)捷兰。
旋轉(zhuǎn)時事件的順序:
a) Window檢測到設(shè)備方向變化
b) Window會尋找一個合適的vc并調(diào)用它的shouldAutorotateToInterfaceOrientation:方法去檢測它是否應(yīng)該支持新的旋轉(zhuǎn);
c) 如果新的旋轉(zhuǎn)被支持负敏,window調(diào)用vc的willRotateToInterfaceOrientation:durition:方法
d) Window會調(diào)整vc的view的bounds
e) Window會調(diào)用vc的didRotateFromInterfaceOrientation:方法贡茅。
旋轉(zhuǎn)處理時注意的Tips:
a) 在旋轉(zhuǎn)過程中禁止event傳遞。減少意外;
b) 存儲可見的Map區(qū)域顶考。使得Map盡可能和旋轉(zhuǎn)前保持一致赁还;
c) 針對復(fù)雜的view繼承關(guān)系,使用view截圖來替換視圖
d) 在旋轉(zhuǎn)后重新load任何可見的table
e) 使用旋轉(zhuǎn)通知去更新app狀態(tài)信息驹沿。
- 當(dāng)你定義了一個storyboard時艘策,iOS會自動做一些工作幫助你去構(gòu)建app。當(dāng)你的app調(diào)用了UIApplicationMain函數(shù)渊季,iOS平臺會做如下行為:
a) 它會初始化app的delegate朋蔫,基于你傳遞到UIApplicationMain的類名;
b) 會創(chuàng)建一個新的window并關(guān)聯(lián)到main Screen上却汉;
c) 如果你的app delegate實現(xiàn)了window屬性驯妄,iOS會將這個屬性到新window上;
d) 它會通過app的信息屬性list中相關(guān)聯(lián)的信息來加載主storyboard
e) 會初始化一個主storyboard的初始化vc
f) 會set window的rootViewController屬性去新的vc上
g) 會調(diào)用app delegate的application:didFinishLaunchingWithOptions:方法合砂。最好在你的app delegate去做初始化vc的一些操作
h) 調(diào)用了window的makeKeyAndVisible方法來顯示window - 為了讓自定義vc雷同時被顯示在edit和display內(nèi)容上青扔,覆蓋 setEdition:animated:方法。