我正在尝试实现绘图功能。目前我正在使用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不是那么好。
答案 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
。