在视图控制器中画线代替 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 和 运行 项目即可。
我希望我的 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 和 运行 项目即可。