缩放后平滑线条

时间:2012-09-21 15:00:54

标签: objective-c ios uikit quartz-core

我正在尝试实现绘图功能。目前我正在使用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:我跟踪startPoint并致电[myPath moveToPoint:myTouch locationInView:self];touchesMoved:我致电[myPath addLineToPoint...]; [self setNeedsDisplay]

我的DrawView是UIScrollView的子视图。

我的问题: 当我放大时,绘图非常无形或像素化。

我想以某种方式重绘图形,使其看起来漂亮和平滑,但我无法弄清楚如何或从哪里开始。

我找到了这个简单的“解决方案”:

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

当我以这种方式实现该方法时,绘图将在zomming之后更平滑,但App变得非常迟缓和缓慢。在scrollView的高maximumZoomScale处,App完全崩溃。当我理解文档正确设置contentsScale高于2不是一个好主意或以任何方式改变contensScale不是那么好。

2 个答案:

答案 0 :(得分:0)

查看WWDC 2012视频Optimizing 2D Graphics and Animation Performance,了解一些优秀的技巧。副手我建议尽可能减少或消除透明层并连接各个线段。

答案 1 :(得分: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设置为shapeLayer的path属性。 此解决方案无需调用setNeedsDisplay