2014-09-26 196 views
1

我在界面生成器中有一個UICustomButton(UIButton的子類)。我想在UICustomButton裏面改變這個按鈕的框架。如何以編程方式更改UIView子類內的UIView框架?

我嘗試下面的代碼:

// make it 10 points wider and higher 
CGRect newFrame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width + 10, self.frame.size.height + 10); 
self.frame = newFrame; 

awakeFromNib:, drawRect:

他們沒有工作,其結果是不變的。

+0

不清楚_when_(=在哪個事件之後)要更新幀,但是如果它與init過程相關,那麼'-initWithFrame:'或'-didMoveToSuperview'方法可能是更好的地方這樣的事情 - 請記住,自動佈局功能可能會覆蓋您的幀值。 – holex 2014-09-26 15:39:47

+0

@holex我想在視圖啓動過程中只更新一次框架。 'initWithFrame:'不起作用,因爲只有'initWithCoder:'被調用。另外,如何禁用此特定視圖的自動佈局? – DavidLiu 2014-09-26 19:06:59

+0

您需要禁用特定視圖的_superview_中的自動佈局 - 這可能對您有所幫助。 – holex 2014-09-27 13:20:41

回答

2

awakeFromNibdrawRect:都不合適。

您可以更改其框架layoutSubviews,但如果您的應用使用自動佈局,則可能會遇到麻煩。

+0

如果您的應用使用自動佈局,請查看'updateConstraints'方法。 – atreat 2014-09-26 15:35:08

+0

剛試過'layoutSubviews',它不起作用。我正在使用故事板,但沒有明確設置自動佈局約束。 – DavidLiu 2014-09-26 15:36:02

0

我把它放在viewDidLoad中。如果您將其置於循環方法中,則每次調用時它的大小都會增加。

+1

UIView沒有'viewDidLoad',它屬於'UIViewController' – DavidLiu 2014-09-26 15:36:48

+0

在viewDidLoad中的大小是不好的。沒有辦法對屏幕尺寸變化做出反應。例如:旋轉! – fat 2014-09-26 15:40:28

+0

您的自定義按鈕是UIView的子類,它是viewController的UIView的子視圖。這通常是顯示視圖時進行最後一分鐘更改的地方。按鈕通常不會在旋轉時調整大小,只是重新定位,但如果您需要在旋轉時調整大小,則可以在旋轉代碼中執行此操作。你所擁有的代碼不會進行輪換,因爲每次調用它都會使按鈕變大。 – 2014-09-26 15:52:44

2

不要這樣做!這是糟糕的建築!

視圖不應該改變它自己的框架。它始終是調整其子級的父視圖。 如果您檢測到視圖內需要另一個框架:向父視圖發送委託調用並更改其中的框架。委託方法可能看起來像這樣

- customButton:(UIButton *)button requestNewFrame:(CGRect)frame 
{ 
    button.frame = newFrame; 
    // some storing method so you remember the frame on rotations and stuff 
} 

正如一個提醒:孩子的觀點總是在

- (void)layoutSubviews //UIView 
- (void)viewDidLayoutSubviews //UIViewController 

使您的代碼安全的不同UIInterfaceOrientations和不同的設備調整。

+0

誰說視圖不能改變自己...?沒有人,所以...爲什麼它會是一個糟糕的建築? – holex 2014-09-26 15:49:05

+1

@胖子的權利。爲了調整自己的觀點,它需要了解一些關於視圖外的情況 - 這是不好的區隔,這就是我們使用對象的原因。對象應該做他們知道該怎麼做的事情,而不是從外面獲取信息。 – 2014-09-26 15:55:50

+0

@OwenHartnett,如果你想通知對象之外的任何類,就有_delegates_的模式,通過_notification center_發送一個簡單的nofitication,或者在類的某個屬性上使用_KVO_。 OOP的_encapsulation_功能也是關於隱藏來自外部對象的信息。所以,我的問題仍然是一樣的,它怎麼會是一個糟糕的架構呢? – holex 2014-09-27 13:14:57

相關問題