2010-01-20 107 views
0

我使用UIView的子類來(以編程方式)包含和管理多個子視圖(主要是UIImageViews),這些子視圖彼此相鄰,因此沒有任何子視圖重疊。假設子視圖的高度都相同(最初繪製時)是安全的,但是寬度是變化的。容器可能會調整大小,在這種情況下,我希望子視圖按比例縮放。此外,有時我需要添加/刪除/編輯任何給定的子視圖(可能會改變其寬度)。向/從UIView中添加/刪除子視圖時平滑縮放

我取得了一些成功使用:

[self setAutoresizesSubviews:YES]; 
[self setAutoresizingMask:(UIViewAutoresizingFlexibleLeftMargin | 
           UIViewAutoresizingFlexibleWidth  | 
           UIViewAutoresizingFlexibleRightMargin | 
           UIViewAutoresizingFlexibleTopMargin | 
           UIViewAutoresizingFlexibleHeight  | 
           UIViewAutoresizingFlexibleBottomMargin)]; 

有容器自動調整其子視圖時,其框架的變化。

不幸的是,當子視圖的內容發生變化導致它擴大或縮小時,我遇到了很多麻煩。簡單地設置'setNeedsLayout'併爲子視圖定義'layoutSubviews'似乎並沒有做到這一點,因爲在'layoutSubviews'開始時,子視圖的框架沒有被調整。如果我強迫它,那麼當前的內容被拉伸或收縮,這看起來很可怕。

如果有人能解釋如何在這種情況下使用sizeToFit,layoutSubviews,sizeThatFits:,setAutoresizesSubviews:,setAutoresizingMask :,和setContentMode:我肯定會很感激。我的意思是,如果我想調整一個子視圖的內容(並擴大它),然後我怎麼做這樣的:

  • 子視圖加寬(無不利拉伸或在其內部還有自動調整的任何東西)
  • 容器變寬成比例的量
  • 沒有其他子視圖的受影響

在此先感謝!

回答

1

我結束了去手動路線,使用sizeThatFits:和layoutSubviews明確控制如何重繪和組織。我發現setAutoresizesSubviews:和setAutoresizingMask:對簡單的佈局有所幫助,但是如果我嘗試了任何事情,即使有點不典型,也很難調試。

我的建議:首次嘗試編程式佈局時,爲所有(子)視圖定義sizeThatFits併爲每個視圖定義layoutSubviews。使用調試語句記錄所有內容的位置。一旦你快樂,考慮將自動調整大小簡單地代碼(如果可能的話)。

0

對於動畫視圖的調整大小做:

[UIView beginAnimations:@"resizeAnimation" context:nil]; 
youView.frame = newFrame; 
[UIView commitAnimations]; 

如果你不想元素自動調整,只設置了自動調整大小以UIViewAutoresizingNone

如果我正確地得到您的案例,您不希望包含器及其子視圖自動調整大小,除了您提到的子視圖。該視圖應該啓用一些自動調整選項(我不完全知道你想要的,只是嘗試一些,看看它們的效果)。該子視圖的子視圖也應該禁用。