我的最终目标是使用Quartz绘制一个看起来像MS Word的报告到UIView中,然后在UIScrollView中使用UIView。
我现在拥有的是顶级报表对象,然后它的子项是报表的一部分,如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的ReportObject,并在特定点绘制它。所以我的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,然后让它以这种方式绘制。这是更好的方式吗?我不太确定。如果不是,我的替代方案是什么?我的所有类都有一个draw方法,但是在它中,它只是发布一个通知然后在我的ReportView类中,我可以让它听取这些通知,然后调用相应的draw方法吗?感谢。
答案 0 :(得分:1)
您肯定希望使用UIView
的层次结构而不是实现很多drawRect
。 UIKit
非常善于优化,如果你做了很多非优化/幼稚的drawRect
,你就会失败。
您可能会也可能不会为所有对象创建自定义UIView
子类。使用内置UIView
子类并根据报表对象创建它们可能就足够了。子类化更复杂,但如果您需要执行比标准struts和spring提供的更多自定义布局(在layoutSubviews
中),则通常需要。