在Swift 4中绘制多条线

3
最初的回答:在Swift 4中,使用Xcode IDE可以轻松绘制圆形,代码如下:

在Swift 4中,使用Xcode IDE,我可以很容易地绘制一个圆形:

let circlePath = UIBezierPath(arcCenter: CGPoint(
    x: 100,
    y: 100),
    radius: 50,
    startAngle: CGFloat(0),
    endAngle:CGFloat(Double.pi * 2),
    clockwise: true)

let shapeLayer = CAShapeLayer()
shapeLayer.path = circlePath.cgPath

shapeLayer.fillColor = UIColor.white.cgColor
shapeLayer.strokeColor = UIColor.black.cgColor
shapeLayer.lineWidth = 2.0

然而,我想画一条从点A到点B的线,而不是画一个圆。我可以通过参照这里的示例代码来画一条线:https://www.youtube.com/watch?v=9sJxtzTo8W0 为了让线看起来与示例中相同,我需要在主Storyboard中更改视图。
以下是问题列表:
- 这是否意味着我在整个项目中只能有1种可查看的自定义类别? - 我能否使线路默认可见,而不受特定Storyboard视图的限制? - 为什么圆形可以渲染而无需定义类对象,但线条却需要我定义类对象? - 是否有一种方式可以简单地即时绘制一条线,就像我可以即时绘制一个圆形一样?

1
虽然不重要也与此无关,但在定义圆形时,你不需要所有那些 CGFloat 的引用。例如,只需使用以下代码:let circlePath = UIBezierPath(arcCenter: CGPoint(x: 100, y: 100), radius: 50, startAngle: 0, endAngle: .pi * 2, clockwise: true) - Rob
“我可以默认显示这些行吗?”……我不明白这个问题的意思。 - Rob
1个回答

2
有没有一种简单的方法可以像临时绘制圆形那样临时绘制直线?
当然,只需使用`addLine(to:)`创建一个`UIBezierPath`,然后像您在示例中为圆形所做的那样,在`CAShapeLayer`中使用以下`path`即可:
let startPoint = CGPoint(x: 10, y: 10)
let endPoint = CGPoint(x: 20, y: 5)

let linePath = UIBezierPath()
linePath.move(to: startPoint)
linePath.addLine(to: endPoint)

let shapeLayer = CAShapeLayer()
shapeLayer.path = linePath.cgPath

shapeLayer.fillColor = UIColor.white.cgColor
shapeLayer.strokeColor = UIColor.black.cgColor
shapeLayer.lineWidth = 2

view.layer.addSublayer(shapeLayer)

为什么圆可以渲染而不需要定义类对象,但是线需要我定义类对象?
线条并不需要你定义类对象。这只是另一种方法,你可以使用CAShapeLayer技术或UIView子类技术来绘制直线和圆(以及任何其他形状)。它们都能正常运作。
通过UIView子类方式,你首先需要定义你的类:
class LineView: UIView {

    var startPoint: CGPoint? { didSet { setNeedsDisplay() } }
    var endPoint: CGPoint?   { didSet { setNeedsDisplay() } }

    override func draw(_ rect: CGRect) {
        guard let startPoint = startPoint, let endPoint = endPoint else { return }

        let linePath = UIBezierPath()
        linePath.move(to: startPoint)
        linePath.addLine(to: endPoint)
        linePath.lineWidth = 2

        UIColor.black.setStroke()
        linePath.stroke()
    }
}

然后实例化一个并将其添加到您的视图层级中:
最初的回答
let lineView = LineView()
lineView.backgroundColor = .lightGray
lineView.translatesAutoresizingMaskIntoConstraints = false
lineView.startPoint = CGPoint(x: 10, y: 10)
lineView.endPoint = CGPoint(x: 20, y: 5)
view.addSubview(lineView)

NSLayoutConstraint.activate([
    lineView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10),
    lineView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10),
    lineView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 10),
    lineView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -10)
])

这是否意味着我在整个项目中只能同时查看一种自定义类的类型?
就像您可以添加任何形状图层一样,您可以添加自己的自定义UIView子类并添加任意数量。因此,您可以理论上有几种子类类型,一种用于不同类型的形状(圆形,线条,圆角矩形等),并将它们实例化并添加为子视图到您想要的任何场景上的任何视图。

当我使用您提供的代码时,屏幕上没有画出线条。请提供完整的代码,谢谢。 - Colin Hancey
如何将其实例化为子视图? - Colin Hancey
1
@ColinHancey - 要画线,您需要创建一个形状图层,设置其path,然后使用addSublayer将其添加,就像您在问题中使用circlePath示例所做的一样。但我提供了一些额外的代码。 - Rob
1
@ColinHancey - 要实例化子视图,只需创建子类实例(例如 LineView() 将会实例化一个 LineView 对象),然后将其配置并使用 addSubview 添加到您的视图层次结构中即可看到它。我也在上面添加了如何执行此操作的示例。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接