2016-01-18 9 views
1

EDIT:CoreGraphics в iOS: как я могу сохранить пути, нарисованные в CGContext, и получить их в следующем обратном вызове?

То, что я пытаюсь достичь, это пропустить вызов firstDraw() во второй раз, когда вызывается drawRect. Причина в том, что в моем реальном коде у меня есть много точек данных и линий для рисования, поэтому я подумал, что если я переработаю ранее нарисованные вещи, я мог бы оптимизировать производительность. Возможно ли это вообще с CoreGraphics?


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

Приведенный ниже код выполнит два розыгрыша за раз в 2,4 секунды. После первого вызова я использую CGContextSaveGState, чтобы сохранить состояние. Во втором вызове я извлекаю текущий графический контекст, а затем добавляю некоторые строки. Однако это, похоже, терпит неудачу, поскольку кажется, что предыдущий контекст потерян.


Что я получаю:

Вот что я получаю в первого вызова отрисовки:

enter image description here

Вот что я получаю после второго вызова :

enter image description here

Это вместо того, чтобы то, что я хотел бы получить вместо после второго звонка:

enter image description here


Вот код:

import UIKit 

class GraphView: UIView { 

    var count : Int = 0 

    override func drawRect(rect: CGRect) { 
     if (count == 0){ 
      firstDraw() 
     NSTimer.scheduledTimerWithTimeInterval(2.4, target: self, selector: "setNeedsDisplay", userInfo: nil, repeats: false) 
      count++ 
     } 
     else{ 
      addLinesToDraw() 
     } 
    } 

    func firstDraw(){ 
     // Drawing code 
     let context = UIGraphicsGetCurrentContext() 

     CGContextMoveToPoint(context, 50, 50); 

     CGContextSetRGBStrokeColor(context, 0, 0, 0, 1.0); 
     CGContextSetRGBFillColor(context, 0, 0.0, 0.0, 1.0); 
     CGContextAddLineToPoint(context, 60, 60); 
     CGContextMoveToPoint(context, 150, 150); 
     CGContextAddLineToPoint(context, 110, 90); 
     CGContextSetLineWidth(context, 2); 
     CGContextStrokePath(context); 

     // Draw a Point as a small square 
     CGContextSetRGBStrokeColor(context, 0.5, 0.5, 0.5, 1.0); 
     CGContextSetRGBFillColor(context, 0.5, 0.5, 0.5, 1.0); 
     //NSLog(@"Drawing rect at point [x: %i, y: %i]", xPosition+resolution, pressureIntValue); 
     CGContextFillRect(context, CGRectMake(0, 0, 10, 10)); 
     CGContextAddRect(context, CGRectMake(0, 0, 10, 10)); 
     CGContextStrokePath(context); 

     CGContextSaveGState(context) 
    } 

    func addLinesToDraw(){ 
     // Drawing code 
     let context = UIGraphicsGetCurrentContext() 

     CGContextMoveToPoint(context, 30, 60); 

     CGContextSetRGBStrokeColor(context, 0, 0, 0, 1.0); 
     CGContextSetRGBFillColor(context, 0, 0.0, 0.0, 1.0); 
     CGContextAddLineToPoint(context, 20, 20); 
     CGContextMoveToPoint(context, 120, 250); 
     CGContextAddLineToPoint(context, 110, 90); 
     CGContextSetLineWidth(context, 2); 
     CGContextStrokePath(context); 

     // Draw a Point as a small square 
     CGContextSetRGBStrokeColor(context, 0.5, 0.5, 0.5, 1.0); 
     CGContextSetRGBFillColor(context, 0.5, 0.5, 0.5, 1.0); 
     //NSLog(@"Drawing rect at point [x: %i, y: %i]", xPosition+resolution, pressureIntValue); 
     CGContextFillRect(context, CGRectMake(20, 30, 10, 10)); 
     CGContextAddRect(context, CGRectMake(20, 30, 10, 10)); 
     CGContextStrokePath(context); 

     CGContextSaveGState(context) 

    } 
} 

ответ

0

Каждый время, когда вы звоните drawRect:, вы hav е рисовать все с нуля. Таким образом, в вашем случае, вы хотите изменить свой код, чтобы что-то вроде:

override func drawRect(rect: CGRect) { 
    firstDraw() 

    if (count == 0){ 
    NSTimer.scheduledTimerWithTimeInterval(2.4, target: self, selector: "setNeedsDisplay", userInfo: nil, repeats: false) 
     count++ 
    } 
    else{ 
     addLinesToDraw() 
    } 
} 

Если вам не нравится это решение, вы всегда можете сделать все рисунок в отдельном CGContext и блитирования его на экран в ваш drawRect способ.

+0

Ok. То, что я пытаюсь достичь, это пропустить вызов firstDraw() во второй раз, когда вызывается drawRect. Причина в том, что в моем реальном коде у меня есть много точек данных и линий для рисования, поэтому я подумал, что если я переработаю ранее нарисованные вещи, я мог бы оптимизировать производительность. Возможно ли это вообще с CoreGraphics? – mm24