##DAY3 自訂視圖、視圖控制器、視圖控制器指定視圖、loadView、 viewDidLoad、MVC、旋轉螢幕、記憶體警告,

來源:互聯網
上載者:User

##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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.