##DAY3 自訂視圖、視圖控制器、視圖控制器指定視圖、loadView、 viewDidLoad、MVC、旋轉螢幕、記憶體警告,
##DAY3 自訂視圖、視圖控制器、視圖控制器指定視圖、loadView、 viewDidLoad、MVC、旋轉螢幕、記憶體警告
#pragma mark ———————自訂視圖的步驟 ———————————
自訂視圖的步驟:
1)明確該視圖內部有什麼控制項,並且將所有控制項聲明成屬性
2)重寫LTView繼承UIView的布局方法(initWithFrame:),來建立子視圖,並且添加子視圖(定義label和textField的布局frame,並將其添加到LTView中)(注意開闢空間,一定要將子視圖加入到父視圖上)(這裡是 self = [super initWithFrame:frame];)
3)自訂初始化方法(定義label和textField的基本屬性)(這裡是 self = [self initWithFrame:frame];)
4)記憶體管理(label和textField在第二步建立時alloc增加的引用計數,或是使用setter方法增加的引用計數)
#pragma mark ———————視圖控制器 ———————————
視圖控制器:
視圖控制器概述:
1)視圖控制器是應用程式資料和視圖之間的重要橋樑,每個iOS應⽤程式只顯示一個使用者介面,顯示的內容是由控制器或一組視圖控制器協調管理。所以,視圖控制器提供了一個基本的架構來構建應用程式。
2)UIViewController是所有視圖控制器的父類。
3)iOS提供了許多內建的視圖控制器,以支援標準的使用者介面部分,比如導航控制器(UINavigationController), 標籤控制器(UITabBarController), 表視圖控制器(UITableViewController)等。
視圖控制器的功能:
1)控制視圖大小變換、布局視圖、響應事件.
2)檢測以及處理記憶體警告。
3)檢測以及處理旋轉螢幕。
4)檢測視圖的切換。
5)實現模組獨立性,提高複用性
設定window的根視圖控制器:
第一步:引入視圖控制器的標頭檔
第二步:在application:didFinishLaunchingWithOptions:方法中定義window的根視圖
視圖控制器的使⽤:
第一步:定義UIViewController的子類(建立視圖控制器類MyUIViewController)
第二步:在APPDelegate裡建立視圖控制器對象(myViewController),作為window的根視圖控制器(指定window的根視圖控制器self.window.rootView = myViewController;)
第三步:在視圖控制器類(MyUIViewController)的viewDidLoad方法中,使用預設建立好的視圖對象(self.view)(在viewDidLoad方法內部建立視圖,並且添加到根視圖(self.view)上面)
注意:無法改變視圖控制器上預設視圖(self.view)的布局(frame)
視圖控制器的預設視圖用 init 初始化即可:
UIView *view = [[UIView alloc] init];
view.backgroundColor = [UIColor redColor];
self.view = view;
#pragma mark ———————視圖控制器指定視圖 ———————————
視圖控制器指定視圖:
1)自訂視圖類繼承UIViw。在初始化方法中添加子視圖控制項。
2)重寫controller的loadView⽅法。建立自訂視圖對象(alloc),並指定為 controller的view。(注:loadView方法在控制器的view為nil的時候被調用,用於以編程的方式建立view。loadView是使用代碼產生視圖的時候,當視圖第一次載入的時候調用的⽅法,用於使用(寫)代碼來實現控制項。)
3)將子視圖控制項對象設定為自訂視圖類的屬性,在viewDidLoad方法中進行設定:添加action、設定delegate等等。
4)在controller中添加按鈕點擊事件實現和代理⽅法的實現。
#pragma mark ———————loadView、 viewDidLoad———————————
loadView 方法的注意事項:
1)loadView在每一次使用self.view這個property,並且self.view為nil的時候被調用,用以產生一個有效self.view(手工維護views,必須重寫該方法)
2)view 控制器收到didReceiveMemoryWarning的訊息時, 預設的實現是檢查當前控制器的view是否在使用。 如果它的view不在當前正在使用的view hierarchy裡面,且你的控制器實現了loadView方法,那麼這個view將被release, loadView方法將被再次調用來建立一個新的view。(註:iOS6.0以下 如果沒有實現loadView,記憶體警告時不會調用viewDidUnload)
重寫loadView 方法的注意事項:
1)載入根視圖的方法,我們通常在這個方法中,指定根視圖為我們想要的某個視圖
2)並且在一個視圖器生命週期中,這個方法只會走一次
3)在載入方法中不能使用self.view這個getter方法擷取根視圖,因為此時根視圖正在載入,並沒有真實存在
viewDidLoad方法的注意事項:
1)視圖控制器載入完畢的方法,預設視圖控制器是空白師徒,並且背景色是透明色clearColor
2)如果想要顯示內容,只需在此方法內部建立視圖,並且添加到根視圖(sefl.view)上面
3)一般我們會在這裡做介面上的初始化操作,比如往view中添加一些子視圖、從資料庫或者網路載入模型資料到子視圖中
#pragma mark ———————MVC———————————
MVC概述:
1)UIViewController是MVC設計模式的核心。
2)MVC是一個架構級的設計模式。
3)M是Model,主要用建⽴資料模型(即資料的結構)。
4)V是View,我們能看到的所有控制項都是view,view主要的功能是展示資料。
5)C是控制器,主要是控制M和V的通訊。
#pragma mark ———————旋轉螢幕———————————
旋轉螢幕:
檢測旋轉螢幕:
視圖控制器本身能檢測到螢幕的旋轉,如果要處理旋轉螢幕,需要重寫幾個方法:
1)supportedInterfaceOrientations(設定裝置支援旋轉的方向,如果不添加,視圖控制器將無法檢測螢幕的旋轉)。
2)willRotateToInterfaceOrientation:duration:(旋轉的時候,暫停音樂、關閉視圖互動等)。
3)willAnimateRotationToInterfaceOrientation:duration:(添加自訂動畫等)。
4)didRotateFromInterfaceOrientation:(播放音樂、開啟視圖互動等)。
視圖控制器的其他重要方法:
1)視圖控制器裡的視圖的大小發生改變的時候,視圖控制器會收到這個方法的通知(即這個方法會在此時自動執行):
viewWillTransitionToSize:withTransitionCoordinator:
2)設定旋轉螢幕時支援的方法,返回所有視圖控制器支援的方向(注意home鍵在上的情況預設不處理):
supportedInterfaceOrientations
/*
注意:在這個方法的API中可找到以下枚舉值,這裡不詳細介紹
//UIInterfaceOrientationMaskAll 橫屏和豎屏
//UIInterfaceOrientationMaskLandscape 橫屏
*/
視圖的處理:
1)注意視圖控制器會自動調整view的大小以適應旋轉螢幕,bounds被修改, 觸發view的layoutSubviews方法。
2)view重寫layoutSubviews方法,根據裝置方向,重新布局。
3)[UIApplication shareApplication].statusBarOrientation提供裝置當前方向(擷取應用程式的狀態列的方向)。
//只要視圖本身的bounds發生變化,此方法就會執行
- (void)layoutSubviews {
//擷取螢幕方向 UIInterfaceOrientation(枚舉類型)
UIInterfaceOrientation orientaion = [UIApplication sharedApplication].statusBarOrientation;
//判斷是否橫向
if (orientaion == UIInterfaceOrientationLandscapeLeft || orientaion == UIInterfaceOrientationLandscapeRight) {
self.getbackButton.frame = CGRectMake(300, 150, 100, 40);
}else {
self.getbackButton.frame = CGRectMake(150, 150, 100, 40);
}
}
#pragma mark ———————記憶體警告———————————
記憶體警告:
ios下每個app可用的記憶體是被限制的,如果一個app使用的記憶體超過了這個閥值,則系統會向該app發送Memory Warning訊息。收到訊息後,app必須儘可能多的釋放一些不必要的記憶體,否則OS會關閉app。
注意:
1)多用lazyCode(懶載入)
2)viewDidLoad由於在初次建立viewcontroller和重新恢複時都會調用,因此這個函數需要注意區分不同的情況,設定正確的狀態。
http://blog.sina.com.cn/s/blog_65c178a80101gb66.html