为啥`[bezierPath closePath]`方法没有关闭我的路径?

Posted

技术标签:

【中文标题】为啥`[bezierPath closePath]`方法没有关闭我的路径?【英文标题】:Why `[bezierPath closePath]`method doesn't close my path?为什么`[bezierPath closePath]`方法没有关闭我的路径? 【发布时间】:2016-09-25 03:31:59 【问题描述】:

我有一个包含 CGPoints 的 NSArray,我绘制了从此类返回的路径。问题是 [bezierPath closePath] 不会关闭我在此类中的路径。这是为什么?我需要使用此类给我的曲线将端点连接到数组的第一个点,并使用此类使路径完全闭合/连接和连续。除了[bezierPath closePath],我还应该做什么,因为当我在drawrect方法中使用它时它什么也没做。任何帮助表示赞赏。

UIBezierPath (SmoothPath) 类的代码:

UIBezierPath+SmoothPath.h:
#import <UIKit/UIKit.h>
@interface UIBezierPath (SmoothPath)
+ (UIBezierPath*)smoothPathFromArray:(NSArray*)arr;
@end

还有

  UIBezierPath+SmoothPath.m:

    #import "UIBezierPath+SmoothPath.h"

    @implementation UIBezierPath (SmoothPath)

    + (UIBezierPath*)smoothPathFromArray:(NSArray*)arr
        if ([arr count] > 0)
            UIBezierPath *bezierPath = [UIBezierPath bezierPath];

            NSMutableArray *pts = [arr mutableCopy];
            int i = 0;
            for (; i < pts.count - 4 ; i+= 3)
                CGPoint temp = CGPointMake(([pts[i+2] CGPointValue].x + [pts[i+4] CGPointValue].x)/2.0,
                                           ([pts[i+2] CGPointValue].y + [pts[i+4] CGPointValue].y)/2.0);
                pts[i+3] = [NSValue valueWithCGPoint:temp];

                [bezierPath moveToPoint:[pts[i] CGPointValue]];
                [bezierPath addCurveToPoint:temp controlPoint1:[pts[i+1] CGPointValue] controlPoint2:[pts[i+2] CGPointValue]];
            

            switch (pts.count - i) 
                case 4:
                    [bezierPath moveToPoint:[pts[i] CGPointValue]];
                    [bezierPath addCurveToPoint:[pts[i+3] CGPointValue] controlPoint1:[pts[i+1] CGPointValue] controlPoint2:[pts[i+2] CGPointValue]];
                    break;
                case 3:
                    [bezierPath moveToPoint:[pts[i] CGPointValue]];
                    [bezierPath addCurveToPoint:[pts[i+2] CGPointValue] controlPoint1:[pts[i] CGPointValue] controlPoint2:[pts[i+1] CGPointValue]];
                    break;
                case 2:
                    [bezierPath moveToPoint:[pts[i] CGPointValue]];
                    [bezierPath addLineToPoint:[pts[i+1] CGPointValue]];
                    break;
                case 1:
                    [bezierPath addLineToPoint:[pts[i] CGPointValue]];
                    break;

                default:
           
        [bezierpath closePath];
        return bezierPath;
    
    return nil;

@end

【问题讨论】:

【参考方案1】:

您继续移动路径 (moveToPoint)。这会形成一条不连续的路径,因此关闭它只会回到上一节的开头。当您将曲线或直线添加到路径时,路径的当前点将移动到该曲线或直线的末端。设置路径的起点时,仅在开头使用 moveToPoint。

【讨论】:

非常感谢,所以我这样做了 [bezierPath moveToPoint:[pts[0] CGPointValue]]; 并将这条线从 for 循环中取出,然后使用 [path closePath] 关闭路径,它确实关闭了路径,但仍然是部分终点和起点(数组的最后一个索引和第一个索引)之间不平滑,如何使它看起来连续平滑,即使在终点和起点的连接处? 您需要像处理其他点一样计算曲线。关闭路径将始终只做一条直线。计算一条回到起点的曲线,添加它,然后关闭路径。

以上是关于为啥`[bezierPath closePath]`方法没有关闭我的路径?的主要内容,如果未能解决你的问题,请参考以下文章

Bezierpath 按钮宽度问题

如何使用 BezierPath 绘制 1px 线

在 Tableview 中使用 BezierPath 创建时间线视图

如何在Swift中的BezierPath之后为imageView的点1到2和点2到3设置不同的animation.duration时间?

[js高手之路] html5 canvas系列教程 - 开始路径beginPath与关闭路径closePath详解

UIBezierPath 绘图问题