CGContextStrokePath не работает при масштабировании и рисовании изображений - PullRequest
6 голосов
/ 14 февраля 2012

Я рисую линии по методу touchesMoved:, и обычно он работает нормально. Но когда я увеличиваю изображение и рисую, ранее нарисованные линии смещаются и становятся все более и более размытыми, в конечном итоге исчезая. Я попытался использовать UIPinchGestureRecognizer и просто увеличить frame из myImageView (только для событий с несколькими касаниями), но проблема возникает в обоих направлениях. Вот код для рисования:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
 NSArray *allTouches = [touches allObjects];
 int count = [allTouches count];
 if(count==1){//single touch case for drawing line
    UITouch *touch = [touches anyObject];   
    CGPoint currentPoint = [touch locationInView:myImageView];
    UIGraphicsBeginImageContext(myImageView.frame.size);
    [drawImage.image drawInRect:CGRectMake(0, 0, myImageView.frame.size.width, myImageView.frame.size.height)];
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 2.0);
    CGContextBeginPath(UIGraphicsGetCurrentContext());
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    lastPoint = currentPoint;
 }
else{//multi touch case
   // handle pinch/zoom
  }
}

Вот изображение, нарисованное без увеличения:

enter image description here

И это изображение, изображающее проблему после увеличения с красной стрелкой, показывающей сегмент, который уже был нарисован до увеличения (как показано на предыдущем изображении). Изображение размыто и смещено:

enter image description here

Также можно заметить, что часть линии, проведенной к концу, не затронута, и явление возникает для линий, оттянутых назад во времени. Я считаю, что причина этого в том, что атрибуты размера изображения теряются при увеличении / уменьшении, что, вероятно, вызывает размытие и сдвиг, но я не уверен в этом!

РЕДАКТИРОВАТЬ - Я загрузил короткое видео , чтобы показать, что происходит. Это что-то интересное ...

РЕДАКТИРОВАТЬ 2- Вот пример приложения для одного просмотра , фокусирующийся на проблеме.

Ответы [ 3 ]

4 голосов
/ 16 мая 2012

Я скачал ваш проект и обнаружил, что проблема заключается в автоматическом изменении размера.Решить ее помогут следующие шаги:

Шаг 1. Прокомментируйте строку 70:

drawImage.frame = CGRectMake(0, 0, labOrderImgView.frame.size.width, labOrderImgView.frame.size.height);

в вашем методе touchesMoved.

Шаг 2. Добавьте одну строку кода после того, как drawImage имеет значение alloc ed (строка 90) в методе viewDidLoad:

drawImage.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

Затем ошибка устранена.

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

Вы всегда просто рисуете в контекст изображения размер своего изображения - это, конечно, становится размытым, поскольку вы не адаптируетесь к более высокому разрешению при увеличении. Было бы разумнее вместо этого создать UIBezierPath один раз и просто добавьте к нему линию (с addLineToPoint:) в методе touchesMoved, затем нарисуйте ее в пользовательском методе drawRect через [bezierPath stroke]. Вы также можете просто добавить CAShapeLayer в качестве подпредставления представления изображения и установить для его свойства path значение CGPath для bezierPath, которое вы создали ранее.

См. Рисование кривых Безье моим пальцем в iOS? для примера.

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

Я реализовал поведение следующим образом:

  1. Вы должны запомнить все координаты вашего пути (МОДЕЛЬ).
  2. Нарисуйте свой путь во временное подпредставление imageView.
  3. Когда пользователь начинает сжимать / увеличивать ваше изображение - ничего не делать, т.е. путь будет масштабироваться iOS
  4. В тот момент, когда пользователь закончил масштабирование пинчем - правильно перерисуйте ваш путь, используя вашу модель.

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

...