在iOS中设计绘图类层次结构

时间:2012-02-24 18:33:50

标签: iphone

我的最终目标是使用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方法吗?感谢。

1 个答案:

答案 0 :(得分:1)

您肯定希望使用UIView的层次结构而不是实现很多drawRectUIKit非常善于优化,如果你做了很多非优化/幼稚的drawRect,你就会失败。

您可能会也可能不会为所有对象创建自定义UIView子类。使用内置UIView子类并根据报表对象创建它们可能就足够了。子类化更复杂,但如果您需要执行比标准struts和spring提供的更多自定义布局(在layoutSubviews中),则通常需要。