Рисование в UIImageView с лучшей производительностью - PullRequest
2 голосов
/ 03 июля 2010

У меня есть вид, в котором я рисую пунктирную линию, когда пользователь перемещает палец по экрану iPad / iPhone.Я рисую линию между точкой, сохраненной как LastLocation, и точкой, которая является CurrentLocation.Чертежи должны быть постоянными на экране.Это происходит каждый раз, когда вызывается событие touchMoved, и в итоге я могу нарисовать пунктирную трассировку, где человек перетащил палец ... как приложение для рисования.

У меня есть функция, которая вызываетсяэто делает следующее, когда происходит событие касания.Представление содержит UIImageView с именем drawImage.Я использую UIImageView как средство сохранения нарисованных линий.Это явно не то, как люди обычно рисуют приложения, так как это довольно медленно.Любое понимание лучшего способа сделать постоянное рисование с использованием вызовов CGContextRef будет приветствоваться.

/* Enter bitmap graphics drawing context */
UIGraphicsBeginImageContext(frame.size);
/* Draw the previous frame back in to the bitmap graphics context */
[drawImage.image drawInRect:CGRectMake(0, 0, drawImage.frame.size.width, drawImage.frame.size.height)]; //originally self.frame.size.width, self.frame.size.height)];       
/* Draw the new line */
CGContextRef ctx = UIGraphicsGetCurrentContext();
/* Set line draw color to green, rounded cap end and width of 5 */
CGContextSetLineDash(ctx, 0, dashPattern, 2);
CGContextSetStrokeColorWithColor(ctx, color);
CGContextSetLineCap(ctx, kCGLineCapRound); //kCGLineCapSquare, kCGLineCapButt, kCGLineCapRound
CGContextSetLineWidth(ctx, 5.0); // for size
/* Start the new path point */
CGContextMoveToPoint(ctx, LastLocation.x, LastLocation.y);
CGContextAddLineToPoint(ctx, Current.x, Current.y);
CGContextStrokePath(ctx);
/* Push the updated graphics back to the image */
drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Вызов drawImage.image drawInRect является чрезвычайно медленным и по сути перерисовывает все изображение.

Есть ли более быстрый способ сделать это?Я видел такой код для рисования в нескольких местах в блогах для рисования, но он немного медленный.Хотелось бы услышать некоторые мысли по этой теме.

1 Ответ

1 голос
/ 03 июля 2010

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

В вашем коде просто сделайте вещи между двумя линиями drawImage в drawRect: метод представления рисования линий.

-(void) drawRect:(CGRect)dirty {
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    /* Set line draw color to green, rounded cap end and width of 5 */
    CGContextSetLineDash(ctx, 0, dashPattern, 2);
    CGContextSetStrokeColorWithColor(ctx, color);
    CGContextSetLineCap(ctx, kCGLineCapRound); //kCGLineCapSquare, kCGLineCapButt, kCGLineCapRound
    CGContextSetLineWidth(ctx, 5.0); // for size
    /* Start the new path point */
    CGContextMoveToPoint(ctx, LastLocation.x, LastLocation.y);
    CGContextAddLineToPoint(ctx, Current.x, Current.y);
    CGContextStrokePath(ctx);
}

Когда один конец линии перемещается, сохраните новую точку и отметьте вид рисования линии как необходимый для отображения. Таким образом, и Current, и LastLocation должны быть членами вида рисования линий, а в методе сеттера для каждого вызовите setNeedsDisplay.

Убедитесь, что clearsContextBeforeDrawing имеет значение ДА, а непрозрачное - НЕТ для вида рисования линий.

...