标签: uibezierpath

Bezier路径具有动态宽度变化


我想用动态改变线宽来创建bezier路径.我需要在线的每个部分上花费相同的颜色.因此,较长的线应该更薄.而较短的线应该是大胆的.或者,至少,line应该从开始到结束改变它的宽度.
任何想法如何实现呢?
谢谢.

drawing ios uibezierpath

8
推荐指数
1
解决办法
1763
查看次数

UIBezierPath持久化与核心数据

我正在开发一个应用程序,用户可以用手指在屏幕上绘图.我正在使用UIBezierPath.我需要保留这个数据,这是一个包含多个BezierPath对象的NSArray.最好的方法是什么?存储在coredata中,使用NSData存储在文件中?非常感谢.

core-data ios uibezierpath

8
推荐指数
1
解决办法
2581
查看次数

绘制在末端逐渐消失的UIBezierPath(渐变)

我试图绘制一个UIBezierPath在两端淡出的东西 - 从alpha 01然后再回到0.我基本上希望能够从内部在UIBezierPath中绘制渐变drawRect.

编辑:这是我想要实现的效果:

在此输入图像描述

iphone drawing ipad ios uibezierpath

8
推荐指数
1
解决办法
1427
查看次数

使用CAShapeLayer对象使用Bezierpath绘制线条

我正在制作一个图像编辑器,可以创建不同的形状对象,如圆形,三角形和方形,也可以更新或删除.所以我用它CAShapeLayer来创建形状对象.

现在我也想在图像上画一条线也可以更新或删除所以我使用bezierpath并CAShapeLayer创建线,它工作正常.但现在的问题是,当我想选择任何现有线时,可以选择接近线工具的任何位置,因为CAShapeLayer还设置了从起点到终点的直线的填充区域.

我的问题是如何创建没有填充区域的线CAShapeLayer.

这是我创建行的代码:

CAShapeLayer *line = [CAShapeLayer layer];
// Using bezierpath to make line 
UIBezierPath *linePath=[UIBezierPath bezierPath];

// Creating L with line

[linePath moveToPoint:point1];
[linePath addToPoint:point2];
[linePath addToPoint:point3];
line.path=linePath.CGPath;


// Configure the appearence of the line
line.fillColor = Nil;
line.opacity = 1.0;
line.strokeColor = [UIColor whiteColor].CGColor;
Run Code Online (Sandbox Code Playgroud)

对此有任何想法将非常感激.

objective-c cashapelayer ios uibezierpath

8
推荐指数
1
解决办法
9947
查看次数

将圆角应用于使用UIBezierPath创建的弧

我正在使用UIBezierPath创建的循环进度条.进度条如下图所示:

在此输入图像描述

我的问题是:如何使圆弧的边缘变圆而不是矩形?

我用来绘制弧线的代码如下:

 // Draw the arc with bezier path
        int radius = 100;

        arc = [CAShapeLayer layer];
        arc.path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(100, 50) radius:radius startAngle:M_PI endAngle:M_PI/150 clockwise:YES].CGPath;
        arc.position = CGPointMake(CGRectGetMidX(self.view.frame)-radius,
                                    CGRectGetMidY(self.view.frame)-radius);
        arc.fillColor = [UIColor clearColor].CGColor;
        arc.strokeColor = [UIColor purpleColor].CGColor;
        arc.cornerRadius = 0.5;
        arc.lineWidth = 6;

        [self.view.layer addSublayer:arc];

        // Animation of the progress bar
        drawAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
        drawAnimation.duration            = 5.0; // "animate over 10 seconds or so.."
        drawAnimation.repeatCount         = 1.0;  // Animate only once..
        drawAnimation.removedOnCompletion = YES;   // Remain stroked …
Run Code Online (Sandbox Code Playgroud)

objective-c uibezierpath

8
推荐指数
2
解决办法
2574
查看次数

使用closePath函数关闭贝塞尔曲线路径并手动关闭它有什么区别?

我正在尝试使用矩形UIBezierPath.我采用了两种不同的方法来绘制它.另外,我将笔画宽度增加到25像素.

第一种方法:使用closePath

UIBezierPath *bpath = [UIBezierPath bezierPath];

[bpath moveToPoint:CGPointMake(x, y)];
[bpath addLineToPoint:CGPointMake(x + w, y)];
[bpath addLineToPoint:CGPointMake(x + w, y + h)];
[bpath addLineToPoint:CGPointMake(x, y + h)];
[bpath closePath];
Run Code Online (Sandbox Code Playgroud)

输出:

使用closePath

第二种方法:手动关闭路径

UIBezierPath *bpath = [UIBezierPath bezierPath];

[bpath moveToPoint:CGPointMake(x, y)];
[bpath addLineToPoint:CGPointMake(x + w, y)];
[bpath addLineToPoint:CGPointMake(x + w, y + h)];
[bpath addLineToPoint:CGPointMake(x, y + h)];
[bpath addLineToPoint:CGPointMake(x, y)];
Run Code Online (Sandbox Code Playgroud)

输出:

手动关闭路径

closePath它的文档中说This method closes the current subpath by creating a line segment between the first and …

core-graphics ios uibezierpath

8
推荐指数
1
解决办法
1654
查看次数

使用CAShapeLayer和UIBezierPath剪辑屏蔽uiview

我在使用CAShapeLayer-UIBezierPath剪切视图时遇到问题,我想剪切内容但最终得到了一个带有UIBezierPath的笔画(帧),这是我的代码

UIBezierPath *path2Path = [UIBezierPath bezierPath];
[path2Path moveToPoint:CGPointMake(206.745, 0)];
[path2Path addLineToPoint:CGPointMake(206.745, 97.613)];
[path2Path addLineToPoint:CGPointMake(0, 97.613)];
[path2Path addLineToPoint:CGPointMake(0, 0)];
[path2Path addLineToPoint:CGPointMake(87.28, 0)];
[path2Path addCurveToPoint:CGPointMake(103.808, 12.118) controlPoint1:CGPointMake(87.28, 0) controlPoint2:CGPointMake(86.555, 12.118)];
[path2Path addCurveToPoint:CGPointMake(119.466, 0) controlPoint1:CGPointMake(121.061, 12.118) controlPoint2:CGPointMake(119.466, 0)];
[path2Path addLineToPoint:CGPointMake(206.745, 0)];
[path2Path closePath];

[path2Path addClip];

CAShapeLayer *pathLayer = [CAShapeLayer layer];
pathLayer.frame=MYVIEW.bounds;
pathLayer.path = path2Path.CGPath;

pathLayer.strokeColor = [[UIColor blackColor] CGColor];
pathLayer.fillColor = [[UIColor clearColor] CGColor];

pathLayer.fillRule=kCAFillRuleEvenOdd;
[MYVIEW.layer setMask:pathLayer];
[MYVIEW.layer setMasksToBounds:YES];

MYVIEW.backgroundColor=[UIColor greenColor];
Run Code Online (Sandbox Code Playgroud)

这段代码的结果只是一个绿色笔划线,边界是空的,就像这样 http://i.stack.imgur.com/aehdo.png

但是,我希望将界限设为绿色,并按中风进行修剪

objective-c uiview cashapelayer ios uibezierpath

8
推荐指数
2
解决办法
1万
查看次数

请设置CG_CONTEXT_SHOW_BACKTRACE环境变量

尽管关于这个问题超过了3个帖子(2015年制作),但是我已经解决了这个问题.

当我运行时,一个简单的代码使用UIBezierPath绘制一条线程序将返回给我:

:CGContextSetStrokeColorWithColor:无效的上下文0x0.如果要查看回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境变量.

:CGContextSetFillColorWithColor:无效的上下文0x0.如果要查看回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境变量.

:CGContextSaveGState:无效的上下文0x0.如果要查看回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境变量.

:CGContextSetLineWidth:无效的上下文0x0.如果要查看回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境变量.

:CGContextSetLineJoin:无效的上下文0x0.如果要查看回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境变量.

:CGContextSetLineCap:无效的上下文0x0.如果要查看回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境变量.

:CGContextSetMiterLimit:无效的上下文0x0.如果要查看回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境变量.

:CGContextSetFlatness:无效的上下文0x0.如果要查看回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境变量.

:CGContextAddPath:无效的上下文0x0.如果要查看回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境变量.

:CGContextDrawPath:无效的上下文0x0.如果要查看回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境变量.

:CGContextRestoreGState:无效的上下文0x0.如果要查看回溯,请设置CG_CONTEXT_SHOW_BACKTRACE环境变量.

@interface line : UIView
UIBezierPath *myPath;
.........
@implementation
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches]anyObject];
CGPoint touchLocation = [touch locationInView:self];
myPath = [UIBezierPath bezierPath];
[myPath moveToPoint:touchLocation];
}
- (void) touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches]anyObject];
CGPoint touchLocation = [touch locationInView:self];
[myPath addLineToPoint:touchLocation];
[[UIColor blackColor]setStroke];
[[UIColor greenColor]setFill];
[myPath stroke];
}
Run Code Online (Sandbox Code Playgroud)

如果我要使用drawRect绘制

- (void) drawRect:(CGRect)rect {
....
}
Run Code Online (Sandbox Code Playgroud)

不会弹出任何错误.我在想,如果我收到这些错误,因为 …

cocoa-touch objective-c uibezierpath

8
推荐指数
1
解决办法
1万
查看次数

带圆角的虚线

我试图在这样的视图周围绘制带圆角的虚线:

class DashedLineView: UIView {

    override func draw(_ rect: CGRect) {

        let path = UIBezierPath(roundedRect: rect, cornerRadius: 8)

        UIColor.clear.setFill()
        path.fill()

        UIColor.red.setStroke()
        path.lineWidth = 3

        let dashPattern : [CGFloat] = [3, 3]
        path.setLineDash(dashPattern, count: 2, phase: 0)
        path.stroke()
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是:

在此输入图像描述

你可以看到角落有问题,任何想法如何修复它?

更新: 使用@Jon Rose 答案 DashedLineView现在看起来像这样:

class DashedLineView: UIView {

    private let borderLayer = CAShapeLayer()

    override func awakeFromNib() {

        super.awakeFromNib()

        borderLayer.strokeColor = UIColor.red.cgColor
        borderLayer.lineDashPattern = [3,3]
        borderLayer.backgroundColor = UIColor.clear.cgColor
        borderLayer.fillColor = UIColor.clear.cgColor

        layer.addSublayer(borderLayer)
    }

    override func draw(_ rect: CGRect) …
Run Code Online (Sandbox Code Playgroud)

core-graphics uibezierpath swift

8
推荐指数
1
解决办法
5451
查看次数

在Core Graphics中斜切路径/形状

我正试图在核心图形中斜切路径.有没有人已经为任意形状做过这个,如果是这样,他们是否愿意共享代码?

我在下面列出了我的实现.我用三个变量来确定伞:CGFloat bevelSize,UIColor highlightColor,UIColor shadow.请注意,光源的角度始终为135度.我还没有完成这个,但这里基本上是我要做的,分成两部分.第一部分,产生焦点:

  1. 我找到了路径中每条相邻线之间角度的平分线.
  2. 对于弧,平分线是垂直于由弧的两个端点产生的线的线,源自中点.这应该照顾使用电弧的大多数情况.我不拿弧线和线的平分线.在这些情况下,弧平分线应该可以正常工作.
  3. 然后,我根据每个相邻平分线的交点计算焦点.
  4. 如果焦点位于其使用的形状内,否则将被丢弃.

产生焦点的目的是按比例"缩小"形状.

第二部分有点复杂.我必须创建斜面形状的每个边/部分.我这样做是通过bevelSize沿着从最近的焦点延伸到所讨论的点的线的半径来绘制(由)原始形状的每个点.当我有两个连续的'bevelPoints'时,我创建了一个UIBezierPath,它从bevelPoints延伸到原始点并返回到bevelPoints(注意,这包括弧).这会创建一个我可以用来填充的"边/段".在直边,我只是填充阴影或高光颜色,取决于侧面的角度.对于弧,我确定弧度'弧'.如果该弧包含一个过渡角(M_PI_4或M_PI + M_PI_4),我用渐变填充它(从阴影到高光或高亮到阴影,这是合适的).否则我用纯色填充它.

更新

我把我的答案(见下文)分成了一个单独的博文.我不再使用您在上面看到的实现细节,但我将其全部保留在那里以供参考.我希望这可以帮助其他人使用Core Graphics.

core-graphics objective-c shape uibezierpath

7
推荐指数
1
解决办法
1511
查看次数