Есть ли способ просто нарисовать линию на лету так же, как я могу нарисовать круг на лету?
Конечно, просто создайте 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)
])
Значит ли это, что у меня может быть только 1 тип пользовательского класса во всем моем проекте, который можно просматривать в любой момент времени?
Точно так же, как вы можете добавлять любые слои-фигуры, которые вы хотите, вы можете добавить свои собственные подклассы UIView
и добавлять сколько угодно.Таким образом, теоретически вы можете иметь пару типов подклассов, один для различных типов фигур (круги, линии, скругленные прямоугольники и т. Д.), Создавать их экземпляры и добавлять их в качестве подпредставлений к любому виду любой сцены, которую вы хотите.