2012-02-24 67 views
0

我的最終目標是使用Quartz將看起來像MS Word的報表繪製到UIView中,然後在UIScrollView中擁有該UIView。在iOS中設計繪圖類層次結構

我現在已經是一個頂級的報告對象,那麼它的孩子們報告的部分畫像ReportTitle,ReportTable,ReportSplitColumn等頂級報表對象的樣子:

@property (nonatomic, retain) UIFont *font; 
@property (nonatomic, assign) CGFloat margins; 
@property (nonatomic, assign) TextObjectStyle style; 
@property (nonatomic, assign) CGColorRef color; 

- (CGSize)size; 

在我的概念證明中,我創建了一個ReportView對象,該對象知道如何繪製帶有特定ReportObject的ReportObjects,並在特定點繪製該對象。所以,我的drawRect想是這樣的:

//pseudocode 
drawRect: { 
    //get the current context 
    CGFloat startHeight = 0; 
    CGPoint point = CGPointMake(0, startHeight); 
    startHeight += [self drawReportTitle:currentContext atPoint:CGPointMake(0, point.y)].height; 
    point.y = startHeight; 

    startHeight += [self drawParagraph:currentContext withText:paragraphs atPoint:CGPointMake(0, point.y)].height; 
    point.y = startHeight; 

} 

我開始嘗試做的是有我的ReportView有NSArray *ReportObjectsArray一個屬性,然後有我的來電顯示類設置的值,然後有我ReportView繪製。我希望我可以做這樣的事情:

for (ReportView *r in self.ReportObjectsArray) { 
    startHeight += [self drawReportObject].height atPoint:CGPointMake(0, point.y; 
    point.y = startHeight 
} 

除了我意識到的問題是,我自己的類不知道如何畫自己。我想我記得在一本Java書中看到這種模式,在這本書中,班級知道如何繪製自己。這對我來說確實有意義。然而,我遇到的問題最終,我想要一個可在UIScrollView中滾動的ReportView類型的UIView。我不確定是否每個ReportObject應該繼承UIView的子類,然後將這些對象中的每一個作爲子視圖添加到scrollView的UIView中,然後讓它以這種方式繪製它自己。這是更好的方式嗎?我不太確定。如果不是,我的選擇是什麼?我會讓所有的類都有一個繪製方法,但是它只是發佈一個通知,然後在我的ReportView類中,我可以讓它監聽這些通知,然後調用相應的繪製方法?謝謝。

回答

1

您一定要使用UIView s的層次結構,而不是實施很多drawRect s。 UIKit對於優化是非常好的,如果你做了很多非優化/天真的drawRect s,你就會失敗。

您可能會也可能不會爲您的所有對象創建自定義UIView子類。使用內建UIView子類可能就足夠了,只需根據您的報告對象創建它們即可。子類化比較複雜,但如果您需要進行更多自定義佈局(在layoutSubviews中),則通常需要比標準支柱和彈簧提供的更多。