Я пытаюсь наложить вид холста поверх UIImageView
, чтобы нарисовать несколько пользовательских линий.
Я пытаюсь разрешить ограничение автоматического размещения холста на UIImageView
. Но это не работает: когда я отлаживаю в отладчике компоновки xcode, фрейм UIImageView
представляет собой прямоугольник размером 400 x 700, но размер фрейма просмотра Canvas равен 0x0.
Код относительно прост:
class Canvas : UIView {
override func draw(_ rect: CGRect) {
super.draw(rect)
guard let context = UIGraphicsGetCurrentContext() else { return }
let startPoint = CGPoint(x: 0, y: 0)
let endPoint = CGPoint(x:100 , y: 100)
context.setStrokeColor(UIColor.red.cgColor)
context.setLineWidth(7)
context.move(to: startPoint)
context.addLine(to: endPoint)
context.strokePath()
}
}
class ViewController: UIViewController {
let canvas:Canvas = {
let canvas = Canvas()
canvas.backgroundColor = UIColor.black
canvas.alpha = 0.2
return canvas
} ()
let photoView: UIImageView = {
let imageView = UIImageView()
imageView.image = UIImage(imageLiteralResourceName: "hongjinbao")
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.contentMode = .scaleAspectFill
return imageView
} ()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// stack views
view.addSubview(photoView)
view.addSubview(canvas)
setupLayout()
}
private func setupLayout() {
photoView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
photoView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
photoView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
photoView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
canvas.topAnchor.constraint(equalTo: photoView.topAnchor).isActive = true
canvas.bottomAnchor.constraint(equalTo: photoView.bottomAnchor).isActive = true
canvas.leadingAnchor.constraint(equalTo: photoView.leadingAnchor).isActive = true
canvas.trailingAnchor.constraint(equalTo: photoView.trailingAnchor).isActive = true
// this two works together
// photoView.frame = view.frame
// canvas.frame = photoView.frame
}
}
Я что-то пропустил? Если я установлю размер с помощью .frame
, он будет работать (см. Комментарии в конце). Но я хочу использовать якоря Autolayout для достижения того же эффекта.