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:我跟踪 startPoint 并调用[myPath moveToPoint:myTouch locationInView:self]; IntouchesMoved:我调用[myPath addLineToPoint...]; [self setNeedsDisplay].

我的 DrawView 是 UIScrollView 的子视图。

我的问题:当我放大绘图时,它非常角落或像素化。

我想以某种方式重新绘制绘图,使其看起来既漂亮又流畅,但我不知道如何或从哪里开始。

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

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

当我以这种方式实现该方法时,缩放后绘图会更平滑,但应用程序变得非常缓慢和缓慢。在maximumZoomScale滚动视图的顶部,应用程序完全崩溃。当我理解文档正确设置 contentsScale 高于 2 不是一个好主意或以任何方式更改 contensScale 不是那么好。

4

2 回答 2

0

观看 WWDC 2012 视频优化 2D 图形和动画性能,了解一些好的技术。我建议尽可能减少或消除透明层并连接您的各个线段。

于 2012-09-21T17:03:36.143 回答
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 设置为pathshapeLayer 的属性。setNeedsDisplay此解决方案不需要调用。

于 2012-10-23T12:28:36.710 回答