соединить uibezierpath с другим классом

#swift #subclass #uibezierpath #addsubview

#swift #подкласс #uibezierpath #добавить subview

Вопрос:

Цель моего кода swifts — нарисовать линию, представляющую обе оси x и y, как вы могли бы видеть на графике. У меня есть код, который я использовал для создания графика, но я не знаю, как подключиться к классам view controller. Я думаю, что мне нужно создать объект в контроллере представления и подклассировать его другими классами, в этом случае это была бы строка класса. Я просто подумал, что мой приведенный ниже код будет работать, но ничего не отображается.

 import UIKit

class ViewController: UIViewController{
    var box = Line()
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(box)
        box.drawLine()
        
    }

 
}

class Line:UIView {
    
    var line =  UIBezierPath()
    var line2 =  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()
        
        line2.move(to: CGPoint(x: bounds.width / 2, y:0 ))
        line2.addLine(to: CGPoint(x:  (bounds.width / 2) , y: (bounds.height)  ))
        
        
        
        UIColor.black.setStroke()
        line2.lineWidth = 0.1
        line2.stroke()
        
        
        
    }
    
    override func draw(_ rect: CGRect) {
        drawLine()
    }
}
  

Ответ №1:

Две вещи: вам нужно присвоить вашему блоку значение frame (или задать ему некоторые ограничения для установки его размера), и вам нужно присвоить ему значение backgroundColor , иначе он будет просто черным.

 override func viewDidLoad() {
    super.viewDidLoad()

    let box = Line(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
    box.backgroundColor = .white
    view.addSubview(box)
}
  

Примечание: Вам не обязательно вызывать его явно drawLine , потому что draw(rect:) он будет вызван системой при появлении представления.

Кроме того, вам нужен только один UIBezierPath :

 class Line:UIView {
    
    func drawLine() {
        let line =  UIBezierPath()
        
        line.move(to: CGPoint(x: 0, y: bounds.height / 2))
        line.addLine(to: CGPoint(x: (bounds.width) , y: bounds.height / 2))

        line.move(to: CGPoint(x: bounds.width / 2, y:0 ))
        line.addLine(to: CGPoint(x:  (bounds.width / 2) , y: (bounds.height)  ))

        UIColor.black.setStroke()
        line.lineWidth = 0.1
        line.stroke()
    }
    
    override func draw(_ rect: CGRect) {
        drawLine()
    }
}
  

Примечание: lineWidth of 0.1 — это действительно тонкая линия и может быть не очень заметна. Линия с одной точкой — это 1 , а линия с одним пикселем была бы 0.3333 или 0.5 на современных iPhone.