2010-09-18 55 views
7

首次發佈堆棧溢出。忽略UIView和AutoresizingMask

我花了好幾個小時搜遍了很多谷歌搜索,並且現在已經實際記住了UIView和UIViewController類的參考文檔。無論我做什麼,我的應用都忽略了我對改變方向更改(或其他任何其他幀大小修改)的看法所作的努力。

沒有涉及nib或xib;我以編程方式構建了所有視圖和viewcontrollers,並且它們(視圖控制器)都是我創建的三個自定義UIViewController子類之一的所有子類。這些超類在他們的loadView下面幾行:方法...

[self setView:[[[UIView alloc] initWithFrame:[self viewFrame]] autorelease]]; 
[[self view] setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; 
[[self view] setAutoresizesSubviews:TRUE]; 

在所有適當的setter方法(無論我加換句話說,一個子視圖),我反覆應用autoresizingMask的步驟。看起來,不管我做什麼,結果總是一樣的 - 我點擊構建,點擊調試,等待應用程序啓動,旋轉設備,並presto!視圖旋轉但根本不調整大小。

我在這裏錯過了什麼?這可能很明顯,我只是沒有看到。任何幫助真正感謝,提前感謝。

回答

33

呃,果然,這是我自己的錯。

教訓一:你是不是熬夜試圖修復破碎的代碼做自己任何好處。休息一下!多喝水!如果你一直試圖迫使你的大腦在超過睡覺時間執行復雜的算法策略和邏輯,你將只會使情況變得更糟。

原來我有一個流氓UIView朝向視圖層次結構的底部,根本沒有設置autoresize屬性。我以爲我看過所有東西,但事實證明我錯過了一個。 (只是一個小小的看法,一整天的拍攝!)

我可以說任何後來出現類似挫折的人,那Autoresizing確實按照記錄工作。如果你認爲「某些東西沒有被稱爲」,那麼你可能看錯了地方。另外,UIViewAutoresizingMask枚舉常量的使用與Interface Builder中的完全不同。在IB中,您「鎖定」了邊距,而在以編程方式設置它們時,默認情況下假定鎖定的邊距,並通過將其設置爲「靈活」來「解鎖」它們。例如,僅設置FlexibleWidth和FlexibleHeight位等同於啓用IB中的所有自動調整選項。通過投入任何保證金掩碼(即UIViewAutoresizingFlexibleLeftMargin),您將「取消選擇」IB中相應的保證金自動調整選項。 (我見過很多其他帖子在這裏漂浮,這似乎是一些人的一個主要困惑點)。

然而,在我的研究中,我注意到似乎沒有任何事件發生,消息,通知,否則當UIView得到調整大小,無論是否自動。雖然調整子視圖的大小並不是必需的,但如果發生在想要導致scrollView或tableView滾動時(如果幀大小發生變化),會很高興。我知道當彈出鍵盤時可以很容易地做到這一點,因爲有一個通知系統,以及方法的TextFielddelegate方法。所以也許一個主題爲另一個職位...

無論如何,謝謝大家誰參與StackOverflow!

+2

Overriding -setFrame:是一種非常可靠的方式來查看視圖的大小。 – aksommerville 2011-07-05 12:50:03

+0

哦,是的,當然!在調試保留計數時,我總是使用這種技術,但在其他情況下,我經常忽略這種做法。 (有趣的是,顯而易見的迴避可能是什麼。)爲了澄清你對其他人的評論,這是指覆蓋-setFrame,以吐出一些NSLog,告訴你視圖的名稱和一些幀值。 (如果你嘗試這樣,不要忘記調用super的實現。) – quickthyme 2011-07-25 05:47:08

+0

除此之外,我不會將該方法用於其他任何事情。在將代碼作爲生產發佈之前,我也會努力禁用覆蓋。 – quickthyme 2011-07-25 21:47:34