Думаю, я нашел вашу проблему. Вы определили UIView с фреймом (0, 0, 0, 0). Если вы затем нарисуете линию в этом виде с координатами этой линии, связанной с этим видом, вы не получите линии.
Я предполагаю, что вы хотите, чтобы ваше представление было на 0, 160 с высотой 40 и ширина 100. Затем линия должна проходить от (0, 20) до (100, 20).
В этом отношении ваши ограничения установлены неправильно, так как ваше представление заканчивается в верхнем правом углу экрана .
Я сделал следующий код, который может помочь. Вы устанавливаете свои ограничения так, как вам нравится.
Создайте собственное представление (MyLineView) следующим образом:
import UIKit
class MyLineView: UIView {
private let lineColor = UIColor.black
override func draw(_ rect: CGRect) {
let path = UIBezierPath()
lineColor.setStroke()
path.lineWidth = 11
path.move(to: CGPoint(x: self.frame.origin.x, y: self.frame.size.height / 2))
path.addLine(to: CGPoint(x: self.frame.size.width, y: self.frame.size.height / 2))
path.stroke()
print(self.frame)
}
}
Затем вы можете закодировать свой контроллер представления следующим образом:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// let myView = UIView(frame: CGRect(x: 0, y: 160, width: 100, height: 40))
let myView = MyLineView()
let viewPositionX: CGFloat = 0
let viewPositionY: CGFloat = 160
let viewWidth: CGFloat = 100
let viewHeight: CGFloat = 40
let topConstraint = viewPositionY + viewHeight - self.view.frame.size.height
let widthConstraint = viewWidth - self.view.frame.size.width
myView.backgroundColor = UIColor.green
self.view.addSubview(myView)
myView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint(item: myView, attribute: .leading, relatedBy: .equal, toItem: self.view, attribute: .leading, multiplier: 1, constant: viewPositionX).isActive = true
NSLayoutConstraint(item: myView, attribute: .top, relatedBy: .equal, toItem: self.view, attribute: .top, multiplier: 1, constant: viewPositionY).isActive = true
NSLayoutConstraint(item: myView, attribute: .bottom, relatedBy: .equal, toItem: self.view, attribute: .bottom, multiplier: 1, constant: topConstraint).isActive = true
NSLayoutConstraint(item: myView, attribute: .trailing, relatedBy: .equal, toItem: self.view, attribute: .trailing, multiplier: 1, constant: widthConstraint).isActive = true
}
}
Я просто добавил зеленый цвет фона, чтобы увидеть, где находится вид. Это работает на моем телефоне. Надеюсь, это поможет.