第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我必須在viewDidLoad中手動設置視圖的框架?

為什么我必須在viewDidLoad中手動設置視圖的框架?

iOS
慕容3067478 2019-10-16 14:23:44
我在UITabBarController內部使用UINavigationController進行了非?;镜脑O置。我想以編程方式布局該navcontroller的rootViewController的視圖,但是當我查看viewDidLoad內的self.view.frame時,我得到了這一點(例如,在landscape中):1. view frame: {{20, 0}, {748, 1024}} // looks like an odd portrait mode然后我自動旋轉到Portrait,我得到了:2. view frame: {{0, 0}, {768, 911}}然后,當我回到風景時,框架現在是這樣的:3. view frame: {{0, 0}, {1024, 655}}進一步的自轉事件將在幀值#2和#3之間翻轉。為了避免#1的怪異,我目前正在viewDidLoad中執(zhí)行此操作:if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {    self.view.frame = CGRectMake(0, 0, 768, 911);} else {    self.view.frame = CGRectMake(0, 0, 1024, 655);}我覺得我顯然在這里缺少什么。當視圖的默認框架自動旋轉回相同方向時,為什么它與該框架不匹配?視框是否未設置為初始方向?很迷茫...我應該提到的是,以上所有內容(包括我的糊涂技巧)都無法在視覺上進行任何更改。我受到黑客攻擊的原因是,當我將子視圖布局到該視圖中時,它們將基于我期望的位置,即導航欄下方的左上角。我究竟做錯了什么?更新:關閉視圖上的所有自動調整大小的東西會將結果#1更改為:view frame: {{0, 0}, {748, 1024}}這似乎有點接近,但仍無法與#3相匹配。
查看完整描述

2 回答

?
MYYA

TA貢獻1868條經驗 獲得超4個贊

不能保證在viewDidLoad中該框架與最終顯示該視圖時的框架相同。UIKit會在顯示視圖上下文之前,先調整視圖控制器視圖的框架。大小是根據界面方向和任何可見的導航欄,標簽欄,工具欄或狀態(tài)欄(其本身的高度可以更改,例如在通話中)的大小確定的。

它有助于了解加載和顯示視圖控制器的視圖時發(fā)生的情況:

  1. 某些東西view首次訪問了視圖控制器的屬性。這可能發(fā)生在您自己的代碼中,也可能發(fā)生在UIKit中,以響應諸如選擇選項卡之類的用戶操作。

  2. UIKit通過調用(loadView如果已定義)或通過從中指定的NIB加載視圖來延遲加載視圖控制器的視圖initWithNibName:bundle:。如果兩者都不存在,則UIKit只會加載一個空視圖。

  3. viewDidLoad一旦視圖及其子視圖已完全加載,UIKit就會調用。 此時,視圖的框架將是在NIB或中設置的框架loadView。

  4. 需要UIKit來顯示視圖控制器的視圖。同樣,這可能是用戶操作,例如點擊選項卡,或者是代碼中的顯式方法調用,例如pushViewController:animated:presentModalViewController:animated:

  5. 如上所述,UIKit根據將在其中呈現的上下文調整視圖的大小。

  6. UIKit調用viewWillAppear:。 現在,框架應為將要顯示的尺寸。 (?)編輯:這可能不再正確。請參閱下面的評論。

  7. UIKit顯示視圖,帶有或不帶有動畫。

  8. UIKit調用viewDidAppear:。

如您所見,如果您需要在呈現視圖之前知道視圖框架的大小,則這viewWillAppear:是您唯一的機會。請記住,由于各種原因(包括旋轉事件或狀態(tài)欄高度的更改),視圖出現后此大小可能會更改。因此,為每個子視圖提供適當的autoresizingMask非常重要,以確保布局可以針對邊界的任何更改進行適當調整。

如果希望手動構建視圖層次結構,建議在loadView中進行構建。由于您可以使用此方法自行構造視圖,因此可以將其框架初始化為所需的任何形式。您選擇的大小無關緊要,因為UIKit可能會在您身上進行更改。只要確保您正確設置了autoresizingMask。


查看完整回答
反對 回復 2019-10-16
?
鳳凰求蠱

TA貢獻1825條經驗 獲得超4個贊

你班上會有一個方法


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

    // Return YES for supported orientations    return YES; }

用這種方法放置框架...這樣就可以正常工作。


例如:


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 

{

        // Return YES for supported orientations    

        if(interfaceOrientation == UIDeviceOrientationPortrait || UIDeviceOrientationPortraitUpsideDown)

                self.view.frame = CGRectMake(0, 0, FRAME.WIDTHinPOTRAIT, FRAME.HEIGHTinPOTRAIT);

        else if(interfaceOrientation == UIDeviceOrientationLandscapeRight || UIDeviceOrientationLandscapeLeft)

                self.view.frame = CGRectMake(0, 0, FRAME.WIDTHinLANDSCAPE, FRAME.HEIGHTinLANDSCAPE);


        return YES; 

}

FRAME.WIDTH>所需寬度FRAME.HEIGHT>所需高度


查看完整回答
反對 回復 2019-10-16
  • 2 回答
  • 0 關注
  • 425 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號