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

来源:http://www.cnblogs.com/jiangllnew/archive/2016/02/16/5192422.html
-Advertisement-
Play Games

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在開發過程中,經常會需要處理一組不同類型的數據,比如學生的個人信息,由姓名、年齡、性別、身高等組成,因為這些數據是由不同數據類型組成的,因此不能用數組表示,對於不同數據類型的一組數據,可以採用結構體來進行存儲。當然,對於面向對象的語言來說,最好是用類來表示,但是C語言是面向過程的,因此選擇用結構體來
  • 在開始前我們在這先附一段最簡單的代碼 - (void)viewDidLoad { [super viewDidLoad]; UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; UICollec
  • 開通博客以來已經約莫1個月了。幾次想提筆寫寫東西,但總是由於各種各樣的原因並沒有開始。現在,年假剛結束,項目也還沒有開始,但最終促使我寫這篇博客的是,看了一篇博友寫的新年計劃,說是要在新的一年中寫50篇博客,我也心血來潮的定下了這樣的目標。把年前項目中用到的FragmentTabHost在這裡總結一
  • 需求:在一個數組裡面,將在這個數組中的並且在另一個數組裡面的元素過濾掉。 即:在一個數組dataArray裡面,將在dataArray數組中的並且在filteredArray數組裡面的元素過濾掉。 //iOS-篩選數組內的元素 //在dataArray中裡面,將在dataArray中的並且在filt
  • 今天早上同事說咱們的證書無法使用了,顯示“此證書的簽發者無效”。一開始以為誰誤操作了證書,查看後發現所有證書都無效了。查了會才發下原來是Apple Worldwide Developer Relations Certification Authority Intermediate Certifica
  • 嗷嗚嗷嗚嗷嗚 1 // 將視圖作為屬性方便後面執行多個不同動畫 2 _myView = [[UIView alloc] init]; 3 _myView.layer.position = CGPointMake(100, 100); 4 _myView.layer.bounds = CGRectMa
  • 今天用Xcode打包IPA文件給同事,結果提示import時,提示證書missing,找了半天沒發現問題,後來打開鑰匙串,發現證書全失效了!!!嚇死寶寶了~~~~(>_<)~~~~ 然後,處理它。 1.打開鑰匙串 2.進行如下圖操作,打開證書信息雙擊或右鍵均可 3.再次去打包,成功 註意:分享轉載請
  • Moshi 是一個現代化的JSON庫針對Android和Java。它可以很容易地解析JSON成Java對象: String json = ...; Moshi moshi = new Moshi.Builder().build(); JsonAdapter<BlackjackHand> jsonAd
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...