自定義視圖,視圖控制器,視圖控制器指定視圖,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