2012-02-14 2 views
6

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

- (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

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

EDIT - Я загрузил a short video, чтобы показать, что происходит. Это своего рода развлечение ...

EDIT 2- Здесь a sample single-view app сфокусировавшись на проблеме.

+0

Я думаю, что это может иметь какое-то отношение к contentMode представления, в которое вы входите. Попробуйте UIViewContentModeRedraw? – kevboh

+0

Я попытался установить его для 'myImageView' и' drawImage' (оба являются 'UIImageView'), но это не сработало :(... – tipycalFlow

+0

@kevboh Я загрузил видео (и добавил в ответ), который мог бы дайте вам лучшее представление о проблеме ... – tipycalFlow

ответ

4

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

Шаг 1. Комментарий линия 70:

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

в методе touchesMoved.

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

drawImage.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

Тогда ошибка будет исправлена.

+0

Абсолютно блестящий ... спасибо человеку! Вы заслуживаете большего внимания! – tipycalFlow

1

Я реализовал поведение, как это в следующем виде:

  1. Вы должны помнить все координаты вашего пути (модель).
  2. Нарисуйте свой путь во временном подвид изображения ImageView.
  3. Когда пользователь начинает зажимать/увеличивать изображение - ничего не делайте, то есть путь будет масштабироваться iOS
  4. В тот момент, когда пользователь закончил масштабирование масштабирования - правильно перерисуйте свой путь с помощью вашей модели.

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

+0

Кстати, я считал, что ваш пример кода - и я бы рекомендовал вам реализовать путь catch/save отдельно от чертежа. Это может помочь вам избежать многих проблем. Модель Model-View-Controller. – SVGreg

+0

На самом деле, плохие результаты не возникают при масштабировании. Я рисую ** после ** масштабирования, что эта странность случается. Посмотрите короткое видео в вопросе, чтобы получить лучшую идею. – tipycalFlow

+0

Да, я видел видео - это какой-то размытый эффект - не рисуйте путь прямо к изображению - рисуйте немного прозрачный vie w и разделить их вместе в конце редактирования. – SVGreg

1

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

См., Например, Drawing bezier curves with my finger in iOS?.

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