在视图控制器中画线代替 x 轴

draw line in place of x axis in view controller

我希望我的 swift 代码在 x 轴位置画一条线。因此,无论显示对象的屏幕尺寸如何,该线都位于屏幕中央。我下面的代码生成了一条线,但它不考虑设备尺寸。我的下图显示了一条黑线,这是我当前代码生成的结果,橙色线是所需的输出。

Pic

    import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let lineView = UIView(frame: CGRect(x: 0, y: 100, width: 320, height: 1.0))
        lineView.layer.borderWidth = 1.0
        lineView.layer.borderColor = UIColor.black.cgColor
        self.view.addSubview(lineView)
    }


}

如果你想响应视图的宽度,你可以使用约束:

override func viewDidLoad() {
    super.viewDidLoad()
    
    let lineView = UIView()
    lineView.translatesAutoresizingMaskIntoConstraints = false
    lineView.layer.borderWidth = 1
    lineView.layer.borderColor = UIColor.black.cgColor
    view.addSubview(lineView)
    
    NSLayoutConstraint.activate([
        lineView.leftAnchor.constraint(equalTo: view.leftAnchor),
        lineView.rightAnchor.constraint(equalTo: view.rightAnchor),
        lineView.topAnchor.constraint(equalTo: view.topAnchor, constant: 100),
        lineView.heightAnchor.constraint(equalToConstant: 1)
    ])
}

为了它的价值,而不是使用视图的边框画线,我会定义一个 UIBezierPath 并将其用于 CAShapeLayer 的路径:

@IBDesignable
class GraphView: UIView {
    let shapeLayer: CAShapeLayer = {
        let shapeLayer = CAShapeLayer()
        shapeLayer.lineWidth = 2
        shapeLayer.strokeColor = UIColor.black.cgColor
        shapeLayer.fillColor = UIColor.clear.cgColor
        return shapeLayer
    }()
    
    override init(frame: CGRect = .zero) {
        super.init(frame: frame)
        layer.addSublayer(shapeLayer)
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        layer.addSublayer(shapeLayer)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()

        let path = UIBezierPath()
        path.move(to: CGPoint(x: bounds.minX, y: 100))
        path.addLine(to: CGPoint(x: bounds.maxX, y: 100))
        shapeLayer.path = path.cgPath
    }
}

然后您可以将此视图添加到您的视图层次结构中,如上所示,或者直接在 Interface Builder 中添加(显然,也在 IB 中定义约束)。

要在屏幕中间画一条线,只需将 Line.swift 文件分配给要在其上画线的 UIView。

Line.swift 文件

class Line:UIView {

var line =  UIBezierPath()

func drawLine() {
    line.move(to: CGPoint(x: 0, y: bounds.height / 2))
    line.addLine(to: CGPoint(x: (bounds.width) , y: bounds.height / 2))
    UIColor.black.setStroke()
    line.lineWidth = 0.1
    line.stroke()

}

override func draw(_ rect: CGRect) {
         drawLine()
       }
    }

要将其分配给您的 UIView,请打开 main.storyboard 并单击要画线的视图。然后,进入右上角的标签,看起来像这样

可以看到在class字段里面,有一个叫做“UIView”的占位符。在此处输入 Line 并按回车键,然后输入 运行 项目。您将能够在视图中间看到线条。无需声明或调用任何函数。只需分配此 class 和 运行 项目即可。