2012-09-21 4 views
1

Я пытаюсь реализовать функцию рисования. В настоящее время я использую UIBezierPath:Плавная линия после масштабирования

@interface DrawView : UIView { 
    UIBezierPath *myPath; 
} 
@end 

@implemenation DrawView 

-(id)initWithFrame:(CGRect)frame { 
    //...normal init code 
    myPath = [[UIBezierPath alloc]init]; 
    myPath.lineCapStyle = kCGLineCapRound; 
    myPath.lineJoinStyle = kCGLineJoinRound; 
    myPath.miterLimit = 0; 
    myPath.lineWidth = 10; 
} 

В touchesBegan: я отслеживать начальную и позвонить [myPath moveToPoint:myTouch locationInView:self]; В touchesMoved: я называю [myPath addLineToPoint...]; [self setNeedsDisplay].

My DrawView - это подпрограмма UIScrollView.

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

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

Я нашел простое «решение»:

-(void)scrollViewDidEndZooming:(UIScrollView*)scrollView withView:(UIView*)view atScale:(float)scale { 
    view.layer.contentsScale = scale; 
    [view setNeedsDisplay]; 
} 

Когда я реализовать метод в этом случае рисунок будет более гладким после zomming, но приложение становится очень лагом и медленно. На высоком уровне maximumZoomScale прокруткиПросмотреть приложение полностью. Когда я понимаю, что документ правильно устанавливает содержание. Шкала выше 2 не является хорошей идеей или каким-либо образом меняет contensScale, это не так хорошо.

ответ

0

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

-(void)redrawWithScale:(float)scale { 
    _myPath.lineWidth = _myPath.lineWidth * scale //currently _myPath is a UIBezierPath, with CGPath it should be equal 
    [_myPath applyTransform:CGAffineTransformMakeScale(scale, scale)]; 

    [self setNeedsDisplay]; 

    //or with a CAShapeLayer: 
    _shapeLayer.path = _myPath.CGPath; 

}

Редактировать:

В моей текущей реализации я использую CAShapeLayer (как подслой моего UIView). UIBezierPath установлен в атрибут path элемента shapeLayer. Вызов setNeedsDisplay не требуется с этим решением.

0

Посмотрите на видео WWDC 2012 Optimizing 2D Graphics and Animation Performance для некоторых хороших техник. Вне рук я бы посоветовал уменьшать или устранять прозрачные слои и конкатенировать отдельные сегменты линии, когда это возможно.

+0

Большое спасибо за сообщение этой ссылки. Это помогает понять кварцевое ядро ​​и оптимизировать его. Я должен играть с оптимизационными шагами из сеансового видео. Но я думаю, что это не ответит на мой вопрос с масштабированием. Вполне знаю, что я нашел несколько примеров красок для iOS, но никогда не увеличивал масштаб. – Sebastian

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