在Swift 4中画多条线

时间:2019-01-27 05:44:54

标签: ios swift uibezierpath

在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

为了使该行显示与示例中相同的方式,我需要在主故事板上更改视图。

  • 这是否意味着我在整个项目中只能在任何给定时间查看一种自定义类的自定义类?

  • 无论特定的情节提要视图如何,默认情况下都可以使线条可见吗?

  • 为什么在不需要定义类对象的情况下绘制圆,但是直线需要我定义类对象?

  • 有没有一种方法可以像在飞行中画圆一样简单地在飞行中画线?

1 个答案:

答案 0 :(得分:2)

  

有没有一种方法可以像在飞行中画圆一样简单地在飞行中画一条线?

当然,只需使用UIBezierPath创建一个addLine(to:),然后在您的path中使用以下CAShapeLayer,就像您对示例中的圆圈所做的一样:

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)
])
  

这是否意味着我在整个项目中只能有一种类型的自定义类,而该类在任何给定时间都可以查看?

就像您可以添加所需的任何shapelayer一样,您可以添加自己的自定义UIView子类并添加任意数量的所需。因此,从理论上讲,您可以有几种子类类型,一种用于不同类型的形状(圆形,直线,圆角矩形等),然后实例化它们并将它们作为子视图添加到所需场景中的任何视图中。