在没有子类化的情况下在 UIView 中绘制 UIBezierPaths?

Draw UIBezierPaths in UIView without subclassing?

我是使用 UIBezierPaths 绘制形状的新手。到目前为止我发现的所有示例都涉及首先对视图进行子类化,然后重写 drawRect: 方法并在其中进行绘图,但我还没有找到任何可以绝对肯定地说这是否是在 UIView 中绘制 UIBezierPaths 的唯一方法,或者如果这只是最实用的方法。

有没有其他方法(除了调配)在 UIView 中绘制 UIBezierPath 而不对其进行子类化?

您可以:1) 将 UIBezierPaths 渲染到图像上下文中。 2) 添加 UIImageView 作为视图的子视图,并使用渲染图像设置图像 属性。 像这样:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:self.imageView];
    [self drawPaths];
}

- (void)drawPaths {
       UIGraphicsBeginImageContext(self.view.bounds);
       //draw...
       self.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
       UIGraphicsEndImageContext();
}

另一种不使用 drawRect 绘制贝塞尔曲线路径的方法是使用 CAShapeLayers。将形状层的路径 属性 设置为从贝塞尔路径创建的 CGPath。将形状图层作为子图层添加到您的视图图层。

    UIBezierPath *shape = [UIBezierPath bezierPathWithOvalInRect:self.view.bounds];
    CAShapeLayer *shapeLayer = [CAShapeLayer layer];
    shapeLayer.path = shape.CGPath;
    shapeLayer.fillColor = [UIColor colorWithRed:.5 green:1 blue:.5 alpha:1].CGColor;
    shapeLayer.strokeColor = [UIColor blackColor].CGColor;
    shapeLayer.lineWidth = 2;

    [self.view.layer addSublayer:shapeLayer];

Swift 已接受答案的版本:

    let shape = UIBezierPath(ovalInRect: view.bounds)
    let shapeLayer = CAShapeLayer()
    shapeLayer.path = shape.CGPath
    shapeLayer.fillColor = UIColor(red: 0.5, green: 1, blue: 0.5, alpha: 1).CGColor
    shapeLayer.strokeColor = UIColor.blackColor().CGColor
    shapeLayer.lineWidth = 2.0
    view.layer.addSublayer(shapeLayer)

Swift 3 个接受的答案:

let shape = UIBezierPath(ovalIn: view.bounds)
let shapeLayer = CAShapeLayer()
shapeLayer.path = shape.cgPath
shapeLayer.fillColor = UIColor(red: 0.5, green: 1, blue: 0.5, alpha: 1).cgColor
shapeLayer.strokeColor = UIColor.black.cgColor
shapeLayer.lineWidth = 2.0
view.layer.addSublayer(shapeLayer)