2012-07-15 32 views
0

我想寫一個UIView的子類,其框架是不可變的外部(例如UIPickerView,UISwitch)。所以我嘗試重寫layoutSubviews,sizeToFit和setFrame,但不工作。
誰知道如何實現它像UIKit的UIPickerView或UISwitch,謝謝。如何使UIView的子類的框架不可變ouside

更新:

- (void)setFrame:(CGRect)frame   
{ 
    [super setFrame:frame]; 
    self.frame = CGRectMake(0, 0, 200, 200); 
} 

使用_frame我不能設置視圖的框架,所以當我寫這些,我會進入一個死循環。

+0

後,當你重寫SETFRAME代碼: – 2012-07-15 14:21:28

+1

你的代碼將導致堆棧溢出。如何元。 – 2012-07-15 14:28:43

回答

2

覆蓋-setBounds:將您的視圖限制在給定範圍內。

像這樣的東西應該工作:

static CGFloat maxHeight = ...; 
static CGFloat maxWidth = ...; 

- (void)setBounds:(CGRect)bounds { 
    CGSize size = bounds.size; 
    size.width = MIN(maxWidth, size.width); 
    size.height = MIN(maxHeight, size.height); 

    bounds.size = size; 
    [super setBounds:bounds]; 
} 
+0

明白了,謝謝Jacob!:) – DJean 2012-07-15 14:30:11

+1

@DJean:我們表達感謝的方式是通過upvotes和接受答案 - 單擊左側的空白複選標記以接受答案。也請爲你以前的問題做這件事,否則你可能會在稍後再次嘮叨。另請參閱:[如何接受答案的工作?](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – BoltClock 2012-07-15 14:36:16

2

self.frame = newFrame基本上與調用[self setFrame:newFrame],這就是爲什麼它進入一個死循環。

但是你可以做這樣的:

- (void)setFrame:(CGRect)frame   
{ 
    [super setFrame:CGRectMake(0, 0, 200, 200)]; 
} 

注意,這臺定位點(左上角)到(0,0),這可能不是你想要什麼。使用setBounds:代替或經過原點沿超:

- (void)setFrame:(CGRect)frame   
{ 
    [super setFrame:CGRectMake(frame.origin.x, frame.origin.y, 200, 200)]; 
} 
相關問題