Нарисуйте несколько линий в Swift 4 - PullRequest
0 голосов
/ 27 января 2019

В 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 тип пользовательского класса во всем моем проекте, который можно просматривать в любой момент времени?

  • Можно ли сделать линии видимыми по умолчанию, независимо от конкретного вида раскадровки?

  • Почему круг отрисовывается, и мне не нужно определятьобъект класса, но линия требует, чтобы я определил объект класса?

  • Есть ли способ просто нарисовать линию на лету так же, как я могу нарисовать кругна лету?

1 Ответ

0 голосов
/ 27 января 2019

Есть ли способ просто нарисовать линию на лету так же, как я могу нарисовать круг на лету?

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

...