swift - 如何让自动布局约束依赖于兄弟 View ?

标签 swift

我正在尝试在 UIImageView 之上覆盖 Canvas View 以绘制一些自定义线条。

我试图让 Canvas 自动布局约束依赖于 UIImageView。但它不起作用:当我在 xcode 布局调试器中调试时,UIImageView 的框架是一个大小为 400 x 700 的矩形,但 Canvas View 框架大小为 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 anchor 来实现相同的效果。

最佳答案

你需要设置

canvas.translatesAutoresizingMaskIntoConstraints = false

关于swift - 如何让自动布局约束依赖于兄弟 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54269901/

相关文章:

ios - 如何在 Swift 中获取 iPhone 上的 wifi mac 地址?

Xcode 9 中的 Swift 4 - 如何轻量级迁移 Core Data?

ios - Swift 3 - 从 xib 加载的 UITableViewCell - 自动布局和高度不正确

swift - 如何在 Swift 中为文件访问指定备用目录

python - 套接字编程 readStream!.takeUnretainedValue() 需要无限时间

swift - 按特定类(class)名称搜索 child

swift - 无法转换类型 '(Bool, NSError?) -> Void' 的值

Swift 2,协议(protocol)扩展和 respondsToSelector

ios - 在同一 View Controller 中的另一个 UIView 后面进行 UIView 更新

ios - 是否有混合模式或其他我可以为 UIControls 设置的内容,以便我可以看到其下面的图层?