最近在寫一個(gè)類似畫板的需求憔足。
功能實(shí)現(xiàn)參考文章:內(nèi)存惡鬼drawRect - 談畫圖功能的內(nèi)存優(yōu)化
功能實(shí)現(xiàn)參考Demo:BHBDrawBoarderDemo
????????簡(jiǎn)單功能實(shí)現(xiàn)后毙替,發(fā)現(xiàn)如果快速畫圓凭疮,拐點(diǎn)都有可見(jiàn)的棱(如下圖所示)循未。看代碼CAShaperLayer和UIBezierPath都已經(jīng)設(shè)置為kCGLineJoinRound切端。百度過(guò)挤庇,沒(méi)有找到解決辦法。
找到一個(gè)Demo也是實(shí)現(xiàn)了畫筆功能硫戈,但是拐點(diǎn)比較圓滑https://github.com/linsendear/LSDrawTest
(?iOS 畫板/涂鴉 你畫我猜 demo (OC版)?文章中提供的)
思路:Demo中是在touchMoved①方法中锰什,對(duì)點(diǎn)進(jìn)行存儲(chǔ),存儲(chǔ)夠5個(gè)后,使用- (void)addCurveToPoint: controlPoint1: controlPoint2:方法把UIBezierPath處理后再賦值給CAShapeLayer汁胆。
(①我使用UIPanGestureRecognizer實(shí)現(xiàn)的梭姓,對(duì)應(yīng)的是UIGestureRecognizerStateChanged狀態(tài))
存儲(chǔ)5個(gè)點(diǎn)在使用時(shí)會(huì)有稍微的延遲感。我改成了四個(gè)嫩码,計(jì)數(shù)規(guī)則也稍作改動(dòng)誉尖,就好很多。核心代碼如下
switch(gesture.state) {
? ? ? ? case UIGestureRecognizerStateBegan: {
? ? ? ? ? ? ctr=0;//索引值在此處歸零
? ? ? ? ? ? pts[0] = startP;
? ? ? ? ? ? UIBezierPath*path = [UIBezierPath bezierPath];
? ? ? ? ? ? _path= path;
? ? ? ? ? ? CAShapeLayer* shapeLayer = [CAShapeLayer layer];
? ? ? ? ? ? shapeLayer.path = path.CGPath;
? ? ? ? ? ? shapeLayer.backgroundColor = [UIColor clearColor].CGColor;
? ? ? ? ? ? shapeLayer.fillColor = [UIColor clearColor].CGColor;
? ? ? ? ? ? shapeLayer.lineCap = kCALineCapRound;
? ? ? ? ? ? shapeLayer.lineJoin = kCALineJoinRound;
? ? ? ? ? ? shapeLayer.strokeColor = [UIColor blackColor].CGColor;
? ? ? ? ? ? shapeLayer.lineWidth = 5;
? ? ? ? ? ? [self.layer addSublayer:shapeLayer];
? ? ? ? ? ? _shapeLayer?= shapeLayer;
????????????...//其他操作
? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? case UIGestureRecognizerStateChanged: {
? ? ? ? ? ? ctr++;
? ? ? ? ? ? pts[ctr] = startP;
? ? ? ? ? ? //圓角處理
? ? ? ? ? ? if(ctr==3) {
? ? ? ? ? ? ? ? pts[2] = CGPointMake((pts[1].x+pts[3].x) *0.5, (pts[1].y+pts[3].y) *0.5);
? ? ? ? ? ? ? ? [_path moveToPoint:pts[0]];
? ? ? ? ? ? ? ? [_path addCurveToPoint:pts[2] controlPoint1:pts[0] controlPoint2:pts[1]];
? ? ? ? ? ? ? ? pts[0] = pts[2];
? ? ? ? ? ? ? ? pts[1] = pts[3];
? ? ? ? ? ? ? ? ctr = 2;
? ? ? ? ? ? }
? ? ? ? ? ? _shapeLayer.path = _path.CGPath;
? ? ? ? ? ? break;
? ? ? ? }
}
效果圖:
另:如果有大神知道“設(shè)置kCGLineJoinRound無(wú)效”的解決辦法或原因铸题,可以評(píng)論區(qū)指導(dǎo)一下铡恕,感激不盡!