如何在Swift Playground中调用UIBezier大纲?

问题描述 投票:1回答:2

编辑:对不起,我原来不清楚。我想获得线条或形状的“轮廓”路径。我特意试着理解如何使用:

context.replacePathWithStrokedPath()

和/或:

CGPathRef CGPathCreateCopyByStrokingPath(CGPathRef path, const CGAffineTransform *transform, CGFloat lineWidth, CGLineCap lineCap, CGLineJoin lineJoin, CGFloat miterLimit);

https://developer.apple.com/documentation/coregraphics/1411128-cgpathcreatecopybystrokingpath?language=objc

我不是在寻找解决方法,谢谢。

=====

我真的试图绕着画一条围绕它的轮廓线。我正在使用UIBezier,但遇到了砖墙。到目前为止,我有这个:

import UIKit
import PlaygroundSupport

let screenWidth = 375.0 // points
let screenHeight = 467.0 // points

let centerX = screenWidth / 2.0
let centerY = screenHeight / 2.0

let screenCenterCoordinate = CGPoint(x: centerX, y: centerY)

class LineDrawingView: UIView {
override func draw(_ rect: CGRect) {
    let path = UIBezierPath()
    path.lineWidth = 5
    path.lineCapStyle = .round

    //Move to Drawing Point
    path.move(to: CGPoint(x:20, y:120))
    path.addLine(to: CGPoint(x:200, y:120))

    path.stroke()

    let dot = UIBezierPath()
    dot.lineWidth = 1
    dot.lineCapStyle = .round

    dot.move(to: CGPoint(x:200, y:120))
    dot.addArc(withCenter: CGPoint(x:200, y:120), radius: 5, startAngle: CGFloat(0.0), endAngle: CGFloat(8.0), clockwise: true)

    UIColor.orange.setStroke()
    UIColor.orange.setFill()
    path.stroke()
    dot.fill()

    let myStrokedPath = UIBezierPath.copy(path)

    myStrokedPath().stroke()

  }

}


let tView = LineDrawingView(frame: CGRect(x: 0,y: 0, width: screenWidth, height: screenHeight))
tView.backgroundColor = UIColor.white

PlaygroundPage.current.liveView = tView

那么,我在哪里错了?我似乎无法弄清楚在哪里使用CGPathCreateCopyByStrokingPath ......或者如何...

编辑2:

好的,现在我有了这个。更近,但我如何再次填补这条路?

    let c = UIGraphicsGetCurrentContext()!

    c.setLineWidth(15.0)

    let clipPath = UIBezierPath(arcCenter: CGPoint(x:centerX,y:centerY), radius: 90.0, startAngle: -0.5 * .pi, endAngle: 1.0 * .pi, clockwise: true).cgPath

    c.addPath(clipPath)
    c.saveGState()
    c.replacePathWithStrokedPath()

    c.setLineWidth(0.2)
    c.setStrokeColor(UIColor.black.cgColor)
    c.strokePath()
swift uibezierpath
2个回答
0
投票

稍微修改了类以生成此图形:

OrangeLineWithOutline

路径未在修改的代码中复制。而是使用现有路径绘制,然后修改和重用。点没有中风所以添加了。由于只能填充封闭的路径,因此我通过改变线宽在较粗的路径上绘制了一条较细的路径。

这是修改后的代码:

class LineDrawingView: UIView {
  override func draw(_ rect: CGRect) {
    let path = UIBezierPath()
    path.lineWidth = 7
    path.lineCapStyle = .round

    //Move to Drawing Point
    path.move(to: CGPoint(x:20, y:120))
    path.addLine(to: CGPoint(x:200, y:120))

    path.stroke()

    let dot = UIBezierPath()
    dot.lineWidth = 1
    dot.lineCapStyle = .round

    dot.move(to: CGPoint(x:200, y:120))
    dot.addArc(withCenter: CGPoint(x:200, y:120), radius: 5, startAngle: CGFloat(0.0), endAngle: CGFloat(8.0), clockwise: true)

    dot.stroke()

    UIColor.orange.setStroke()
    UIColor.orange.setFill()
    path.lineWidth = 5
    path.stroke()
    dot.fill()

  }

}

0
投票

所以,我找到了(一)答案。我用过CAShapeLayer:

let c = UIGraphicsGetCurrentContext()!

    c.setLineCap(.round)
    c.setLineWidth(15.0)

    c.addArc(center: CGPoint(x:centerX,y:centerY), radius: 90.0, startAngle: -0.5 * .pi, endAngle: (-0.5 * .pi) + (3 / 2 * .pi ), clockwise: false)

    c.replacePathWithStrokedPath()

    let shape = CAShapeLayer()
    shape.path = c.path
    shape.fillColor = UIColor.yellow.cgColor
    shape.strokeColor = UIColor.darkGray.cgColor
    shape.lineWidth = 1

    myView.layer.addSublayer(shape)

它运作良好,但不适用于重叠层。我需要学习如何连接轮廓或其他东西。

© www.soinside.com 2019 - 2024. All rights reserved.