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

时间:2016-06-01 13:51:09

标签: ios swift ios-autolayout

我已设置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
    }

先谢谢..

4 个答案:

答案 0 :(得分:2)

你最不重要的是

scrollView.translatesAutoresizingMaskIntoConstraints = false

contentView.translatesAutoresizingMaskIntoConstraints = false

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

来自UIView.translatesAutoresizingMaskIntoConstraints documentation

  

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

(强调我的)

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

你有一些错误:

    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
        }