1

У меня есть переменная размером UIView с drawRect с кодом пользовательского чертежа CoreGraphics. Первоначально представление было довольно маленьким, но имело потенциал стать очень широким и помещено внутри UIScrollView, чтобы позволить пользователю прокручивать представление.Как память обрабатывается подклассом UIView внутри UIScrollView

В настоящее время представление создается так широко, как должно быть, чтобы соответствовать всему чертежу, и код CoreGraphics рисует весь вид в drawRect.

- (void)drawRect:(CGRect)rect { 

    // Only try and draw if the frame size is greater than zero and the graph has some range 
    if ((self.frame.size.width>0) && (self.frame.size.height>0) && ((maxX - minX)>0)) { 

     // Get the current drawing context 
     CGContextRef context = UIGraphicsGetCurrentContext(); 

     // Save the state of the graphics context 
     CGContextSaveGState(context); 

     // Set the line style 
     CGContextSetRGBStrokeColor(context, 0.44, 0.58, 0.77, 1.0); 
     CGContextSetRGBFillColor(context, 0.44, 0.58, 0.77, 1.0); 
     CGContextSetLineWidth(context, 3.0); 
     CGContextSetLineDash(context, 0, NULL, 0); 

     // Draw the graph 
     [self drawGraphInContext:context]; 

     // Restore the graphics context 
     CGContextRestoreGState(context); 
    } 
} 

я могу сделать это более эффективным:

  1. Doing ограничивающего Calcs с параметром Rect в drawRect и только рисунок материала, который в настоящее время видны.
  2. Создание меньшего UIView (скажем, 2x ширины кадра scrollView), а при перемещении позиции прокрутки перерисовывает изображение и повторно центрирует scrollView.

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

В частности, позволяет ли scrollView ограничить объем памяти, используемый видом, видимой области? - это графический контекст, созданный размером всего представления, видимой области или размера параметра rect? Являются ли операции рисования вне видимой области просто проигнорированы CoreGraphics?

Любая помощь и рекомендации по лучшей практике будут оценены.

ответ

1

ИМО, все это зависит от rect аргумента вызова:

- (void)drawRect:(CGRect)rect 

и насколько я знаю, это будет установлено в contentSize вашем зрении прокрутки. Просто контекст и используемая для него память будут связаны с этим значением rect.

Возможно, вы попытаетесь сделать свою «обрезку» области, в которую вы рисуете, принимая во внимание вид прокрутки frame.

Еще лучше, вы могли бы взглянуть на образец от Apple около tiling content in a UIScrollView. Это образец 3.

Смежные вопросы