2014-02-15 29 views
0

我有一個自定義的UIView fooView,在那裏我已經覆蓋了drawRect方法,用initWithFrame方法。如何/手動更改自定義UIView的框架?

我也有一個自定義的UIView barView它保存幷包含fooView

barView應該從fooView得到它的高度,因爲fooView正在繪製自定義的東西。

我的問題是我每次檢查fooViewframebounds屬性,它仍然是一樣的。儘管我可以清楚地看到它超出了initWithFrame規定的初始高度。

這使我相信,也許因爲我已經重寫了drawRect方法,現在我有責任更新fooView的框架。

我應該這樣做? 我該怎麼做? 最佳做法是什麼?


編輯:添加的代碼

- (id)initWithFrame:(CGRect)frame{ 
    self = [super initWithFrame:frame]; 
    if (self) [self setupWithMessage:nil]; 
    return self; 
} 

setupWithMessage只是計算,以適應在約束寬度所需的文本的尺寸(主要是高度)。

- (void)drawRect:(CGRect)rect{ 
    [super drawRect:rect]; 
// a whole bunch of drawing logic, but basically draws a message bubble 
// based on the size of the text (The text dynamically changes), and then 
// draws the text so if there is a lot of text, the calculated height of 
// what it takes to draw the text can easily be larger than the size 
// originally passed in during initialization 
} 
+1

你能否提供一些代碼? 例如您的drawRect:和initWithFrame:方法實現 –

+0

@YuriRomanchenko我會把它現在 – vvMINOvv

+1

即使你是畫fooView'的框架'外,其寬度和高度沒有更新,但內容外'fooView'的框架仍然可見,假設你沒有在'barView'上設置'clipsToBounds'。 – bobnoble

回答

1

的方法drawInRect:(CGRect)rect爲您提供了一個矩形,是不是比你的圖幅更大。

所以,如果你在RECT是較高的,鑑於rect畫 - 您的圖紙將被裁剪。

這樣的步驟,你應該做的:

  • 計算所有維度和設置您的fooView框架。
  • 之後,您應該撥打[fooView setNeedsDisplay]
  • 它會調用您drawInRect:方法用一個新框架,因此您也可以專注於繪畫。

如果您fooView的主要任務是從barView給出文本,我建議你創建fooView@property (nonatomic) NSString *textToDraw;並覆蓋二傳手中,你將遵循上述步驟。

編輯: 正如我所見,您爲此創建了一個setupWithText:方法。所以,你需要計算所有尺寸,設置框架self.frame = (CGRect){previousX, previousY, newWidth, newHeight}並調用[self setNeedsDisplay];

+0

所以我確實必須改變我自己的框架。輝煌!謝謝你的幫助 – vvMINOvv

相關問題