国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

ios–視圖控制器如何管理視圖?

2019-11-14 19:51:46
字體:
來源:轉載
供稿:網友

移動設備的屏幕有限,所有的東西都需要放到一個單一窗口組成的單一界面顯示,在ios中體現為視圖切換(在《ios – 視圖》中已經說明了視圖),當一個視圖替換掉另一個視圖的時候,會經常使用動畫效果,這個任務就是交給視圖管理器來完成的。

ios5之后應用程序窗口有一個根視圖控制器(rootViewController),當不為rootViewController賦值時,會出現“application windows are expected to have a root view controller at the end of application launch”警告。

1. 視圖控制器的實例化方式

視圖控制器的實例化也有幾種方式:
第一種: 代碼,也是我最喜歡的一種,不是因為它簡單,是因為使用代碼會使得程序的結構變得清晰簡單 更易懂。

[[ViewController alloc] init];[[ViewController alloc]initWithNibName:@"xibName" bundle:nil];

第二種:代理類加載xib

1 . xib文件里面需要一個ViewController,并將xib的 File's Owner的Identity inspector中的class設置為應用程序代理類。

2 . 代理類中添加一個ViewController插座變量并連接。

3 . 在application:didFinishLaunchingWithOptions:方法中加載xib文件。

第三種:串聯圖

2.視圖控制器如何創建視圖

UIViewController中有loadView這個方法,默認情況下,自己的視圖控制器并沒有重寫這個方法,本人測試過,當第一次訪問view這個屬性的時候,就會自動調用loadView這個方法,重寫這個方法,代碼如下:

- (void)loadView{    self.view = [[UIView alloc] init]; }

跟不重寫一樣的效果,所以本人就猜想UIViewController中loadView這個方法也是如此實現(沒有使用xib的情況下),歡迎指正。

3.view的生命周期

UIViewController中聲明如下方法:

//加載視圖- (void)loadView; //j將要卸載視圖- (void)viewWillUnload NS_DEPRECATED_IOS(5_0,6_0);//已經卸載視圖- (void)viewDidUnload NS_DEPRECATED_IOS(3_0,6_0); //已經加載- (void)viewDidLoad; //視圖將要顯示- (void)viewWillAppear:(BOOL)animated;    //視圖已經顯示- (void)viewDidAppear:(BOOL)animated;     //視圖將要隱藏- (void)viewWillDisappear:(BOOL)animated; //視圖已經隱藏- (void)viewDidDisappear:(BOOL)animated; //將要調用layoutSubviews- (void)viewWillLayoutSubviews NS_AVAILABLE_IOS(5_0);//已經調用layoutSubviews- (void)viewDidLayoutSubviews NS_AVAILABLE_IOS(5_0);

可以重寫這些方法進行生命生命周期的管理。

4.旋轉

視圖控制器的一個主要任務就是知道如何旋轉視圖,有兩種不同旋轉:

抵消旋轉

應用的旋轉是為了抵消設備方向的旋轉,從而應用可以根據用戶如何手持設備而正確的顯示。抵消旋轉的挑戰僅僅在于屏幕不是正方形,這意味著,如果應用旋轉90度,界面不再適合屏幕,必須做出改變進行抵消。

強制旋轉

當某個特定的視圖出現在上界面上時應用進行旋轉,或者在應用啟東時,為了告訴用戶需要旋轉設備才能正確顯示視圖。這是很常見的,因為界面是特地的設計的,而屏幕并不是正方形,所以事實上只能顯示某一特定的模式(豎屏或橫屏)。

為了支持旋轉,視圖控制器需要做的事就是重寫shouldAutorotateToInterfaceOrientation:,傳入的參數是當前設備的方向,是如下之一:

UIInterfaceOrientationPortrait  Home健在下方

UIInterfaceOrientationPortraitUpsideDown  Home健在下方

UIInterfaceOrientationLandscapeLeft  Home健在左邊

UIInterfaceOrientationLandscapeRight  Home健在右邊

返回YES允許所有方向旋轉,否則返回NO,如果沒有重寫這個方法,默認是對UIInterfaceOrientationPortrait  返回YES,而其他方向返回NO的,必須對某些方向返回YES。(沒有UIViewController屬性可以設置為視圖控制器可旋轉的方向,只能重寫這個方法)。

iOS 5有一個新特性,就是shouldAutorotateToInterfaceOrientation可以動態的實現, 使用attemptRotationToDeviceOrientation這個方法

該方法的使用場景是 interface orientation和device orientation 不一致,但希望通過重新指定 interface orientation 的值,立即實現二者一致;如果這時只是更改了支持的 interface orientation 的值,沒有調用attemptRotationToDeviceOrientation,那么下次 device orientation 變化的時候才會實現二者一致,關鍵點在于能不能立即實現。

舉個例子:

假設當前的 interface orientation 只支持 Portrait,如果 device orientation 變成 Landscape,那么 interface orientation 仍然顯示 Portrait;

如果這時我們希望 interface orientation 也變成和 device orientation 一致的 Landscape,以iOS 6 為例,需要先將 supportedInterfaceOrientations 的返回值改成Landscape,然后調用 attemptRotationToDeviceOrientation方法,系統會重新詢問支持的 interface orientation,已達到立即更改當前 interface orientation 的目的。

旋轉事件

可以通過視圖控制器的interfaceOrientation屬性知道當前界面的方向, UIViewController的子類可以重寫下列方法,以便在旋轉的前后收到通知:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 雷州市| 谢通门县| 大安市| 闻喜县| 海城市| 宁强县| 麻城市| 临沂市| 临城县| 饶阳县| 马鞍山市| 沙坪坝区| 建平县| 罗田县| 九龙城区| 克东县| 宣化县| 沛县| 手机| 商南县| 稻城县| 台州市| 宁陕县| 潜江市| 尉犁县| 保德县| 连山| 泸水县| 青冈县| 嵊州市| 西盟| 奉化市| 巫溪县| 巴彦县| 东乌珠穆沁旗| 凤台县| 琼中| 山东省| 宣汉县| 邵武市| 道孚县|