代码之家  ›  专栏  ›  技术社区  ›  modeller

如何让自动布局约束依赖于同级视图?

  •  1
  • modeller  · 技术社区  · 7 年前

    我正在尝试在 UIImageView 绘制一些自定义线条。

    我试图让画布自动布局约束依赖于 UIIVIEVIEW . 但它不起作用:当我在Xcode布局调试器中调试时, UIIVIEVIEW 是一个大小为400 x 700的矩形,但画布视图框架大小为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 它起作用(见结尾处的注释)。但我想使用自动布局锚来实现相同的效果。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Shehata Gamal    7 年前

    你需要设置

    canvas.translatesAutoresizingMaskIntoConstraints = false