繁体   English   中英

使用constraintsWithVisualFormat进行自动布局效果不佳

[英]Auto-layout with constraintsWithVisualFormat is not working well

我已设置scrollview并向scrollview添加约束。 但它显示空白屏幕。 请检查以下代码。

override func loadView()
    {
        super.loadView()
        scrollView = UIScrollView(frame:CGRectZero)
        scrollView.backgroundColor = UIColor.whiteColor()

        scrollView.sizeToFit()

        self.view.addSubview(scrollView)
        scrollView.backgroundColor = UIColor.blueColor()

        contentView = UIView()
//        contentView.setTranslatesAutoresizingMaskIntoConstraints(false)
        contentView.backgroundColor = UIColor.redColor()
        scrollView.addSubview(contentView)

        var viewBindingsDictBoth = [String: AnyObject]()
        viewBindingsDictBoth["scrollView"] = scrollView
        viewBindingsDictBoth["contentView"] = contentView
        viewBindingsDictBoth["mainView"] = self.view


        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[scrollView]-0-|",options: [], metrics: nil,  views:viewBindingsDictBoth))

        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[scrollView]-0-|",options: [], metrics: nil, views:viewBindingsDictBoth))

        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[contentView]|",options: [], metrics: nil, views:viewBindingsDictBoth))
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[contentView]|",options: [], metrics: nil, views:viewBindingsDictBoth))

        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[contentView(==mainView)]",options: [], metrics: nil, views:viewBindingsDictBoth))

        self.view.contentMode = UIViewContentMode.Redraw
    }

提前致谢..

你最缺少的是

scrollView.translatesAutoresizingMaskIntoConstraints = false

contentView.translatesAutoresizingMaskIntoConstraints = false

我认为你的一些约束并不完美,但最大的问题是每个视图默认使用其自动调整属性进行定位。 那些将与你的约束相冲突。

UIView.translatesAutoresizingMaskIntoConstraints文档

请注意,自动调整遮罩约束完全指定视图的大小和位置; 因此,如果不引入冲突,则无法添加其他约束来修改此大小或位置。 如果要使用“自动布局”动态计算视图的大小和位置,则必须将此属性设置为false ,然后为视图提供非模糊,非冲突的约束集。

(强调我的)

我通常发现覆盖loadView是非常必要的,除非我真的试图让基本视图( self.view )成为UIView的不同子类。 loadView用于初始化self.view的值,您忘记了这一点。

在您的情况下,为了易读,我建议将视图初始化移动到viewDidLoad

override func viewDidLoad() {
    // Do your init here
}

在viewcontroller的loadView()方法中,您需要创建一个根视图。 你的根视图现在是零
view = UIView()

你有一些错误:

    override func loadView()
        {
            super.loadView()
            scrollView = UIScrollView(frame:CGRectZero)
            scrollView.backgroundColor = UIColor.whiteColor()
            scrollView.setTranslatesAutoresizingMaskIntoConstraints(false)

            // No need for sizeToFit with autoLayout
            //scrollView.sizeToFit()

            self.view.addSubview(scrollView)
            scrollView.backgroundColor = UIColor.blueColor()

            contentView = UIView()

           //Always set TranslatesAutoresizingMaskIntoConstraints to false, on every view that users AutoLayout

            contentView.setTranslatesAutoresizingMaskIntoConstraints(false)
            contentView.backgroundColor = UIColor.redColor()
            scrollView.addSubview(contentView)

            var viewBindingsDictBoth = [String: AnyObject]()
            viewBindingsDictBoth["scrollView"] = scrollView
            viewBindingsDictBoth["contentView"] = contentView
            viewBindingsDictBoth["mainView"] = self.view


            view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[scrollView]-0-|",options: [], metrics: nil,  views:viewBindingsDictBoth))

            view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[scrollView]-0-|",options: [], metrics: nil, views:viewBindingsDictBoth))

            view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[contentView]|",options: [], metrics: nil, views:viewBindingsDictBoth))
            view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[contentView]|",options: [], metrics: nil, views:viewBindingsDictBoth))

            view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[contentView(==mainView)]",options: [], metrics: nil, views:viewBindingsDictBoth))

           // self.view.contentMode = UIViewContentMode.Redraw
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM