在没有子类化的情况下在 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)
我是使用 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)