在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

为了使该行显示与示例中相同的方式,我需要在主故事板上更改视图。
  • 这是否意味着我的整个项目中只能有一种类型的自定义类,而该类在任何给定时间都可以查看?
  • 无论特定的情节提要板视图如何,默认情况下都可以使线条可见吗?
  • 为什么在不需要我定义类对象但圆线需要我定义类对象的情况下渲染圆?
  • 有没有一种方法可以像在飞行中画圆一样简单地在飞行中画一条线?
  • 最佳答案

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

    当然,只需使用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子类并添加任意数量的所需。因此,从理论上讲,您可以有几种子类类型,一种用于不同类型的形状(圆形,直线,圆角矩形等),然后实例化它们并将它们作为子视图添加到所需场景中的任何视图中。

    关于ios - 在Swift 4中画多条线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54385418/

    10-12 14:35