Проектирование иерархии классов рисования в iOS - PullRequest
0 голосов
/ 24 февраля 2012

Моя конечная цель - нарисовать отчет, который выглядит как MS Word, с использованием Quartz в UIView, имея и затем иметь этот UIView в UIScrollView.

Теперь у меня есть объект отчета верхнего уровня, изатем его дочерние элементы - это части отчета, которые нужно нарисовать, например 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, где класс знает, как рисовать себя.И это имеет смысл для меня.Однако проблема, с которой я столкнулся, была в конце, я хочу один UIView типа ReportView, который можно прокручивать в UIScrollView.Я не был уверен, должен ли каждый ReportObject иметь подкласс UIView вместо этого, а затем добавить каждый из этих объектов в UIView в scrollView как subView, а затем заставить его рисовать себя таким образом.Это лучший путь?Я не совсем уверен.Если это не так, какова моя альтернатива?Будет ли у всех моих классов метод рисования, но в нем он просто отправляет уведомление, а затем в своем классе ReportView я могу прослушивать эти уведомления и затем вызывать соответствующие методы рисования?Спасибо.

1 Ответ

1 голос
/ 24 февраля 2012

Вы определенно хотите использовать иерархию UIView с, а не реализовывать много drawRect с. UIKit очень хорош в оптимизации, и вы проиграете, если вы делаете много неоптимизированных / наивных drawRect s.

Вы можете создавать или не создавать собственные подклассы UIView для всех своих объектов. Возможно, будет достаточно использовать встроенные подклассы UIView и просто создавать их на основе ваших объектов отчета. Подклассы более сложны, но обычно необходимы, если вам нужно сделать больше пользовательского макета (в layoutSubviews), чем обеспечивают стандартные стойки и пружины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...