手动布局中的自动输出

时间:2015-05-23 09:52:12

标签: ios objective-c swift autolayout ios-autolayout

我可以在使用frame, bounds, autoresizingMask定位自己的父视图中添加自动布局视图吗?

通常在互联网上你会看到另一种方式,但我无法实现这种情况。

编辑: 我为你们添加了一些代码。只需使用"单一视图应用程序"创建一个新的Xcode项目。并将以下代码粘贴到为我们创建的ViewController.swift上。

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let custom = CustomManualLayoutSubviews()
        let subview = UIView()
        let childView = UIView()

        custom.backgroundColor = UIColor.redColor()
        subview.backgroundColor = UIColor.greenColor()
        childView.backgroundColor = UIColor.blueColor()

        custom.setTranslatesAutoresizingMaskIntoConstraints(false)
        subview.setTranslatesAutoresizingMaskIntoConstraints(false)
        childView.setTranslatesAutoresizingMaskIntoConstraints(false)

        view.addSubview(custom)
        custom.addSubview(subview)
        subview.addSubview(childView)

        pinToParent(view, child: custom)
        pinToParent(subview, child: childView)
    }

    private func pinToParent(parent: UIView, child: UIView) {
        parent.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-10-[view]-10-|",
            options: .allZeros, metrics: nil, views: ["view" : child]))
        parent.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-10-[view]-10-|",
            options: .allZeros, metrics: nil, views: ["view" : child]))
    }
}

class CustomManualLayoutSubviews : UIView {

    override func layoutSubviews() {
        super.layoutSubviews()

        for subview in subviews as! [UIView] {
            subview.frame = bounds.rectByInsetting(dx: 10, dy: 10)
            println("subview frame: \(subview)")
        }
    }

}

从代码中可以看出,子视图使用手动布局,而自定义和childView使用Autolayout。但结果是使用autolayout的childView没有显示在屏幕上,当我检查它时,我看到它有0宽度,0高度。

这就是我得到的,根本没有蓝色区域。 enter image description here

3 个答案:

答案 0 :(得分:1)

是的,但你必须非常小心并且相当有限。

从技术上讲,如果窗口中的任何视图使用自动布局,则窗口中的所有内容都使用自动布局。只是frameautoresizingMask自动为translatesAutoresizingMaskIntoConstraints留下的视图生成约束。

因此,您必须确保您的约束不会干扰那些自动生成的约束。您可以使用translatesAutoresizingMaskIntoConstraints从视图中松散地“悬挂”某些内容,但您的约束不得“推”或“拉”这些视图。使用translatesAutoresizingMaskIntoConstraints的观点必须具有完全的移动自由度和大小。

例如,您可以使用约束将按钮定位在容器视图前缘的一小段距离内,但如果您还约束到后缘,则最好使内容拥抱和压缩阻力优先级非常低,以便他们不会尝试改变容器的宽度。即便如此,您最终可能会遇到冲突。在自动布局中,视图的宽度不允许为负。如果容器设置为零宽度并且按钮与边缘的距离不为零,则这将是冲突。因此,对后沿的约束也应该具有低优先级,以便在必要时可以将其破坏。 (或者你可以为前沿做到这一点。)

您说使用translatesAutoresizingMaskIntoConstraints无法在视图中使用自动布局。如果您需要进一步的帮助,您需要解释您尝试过的内容以及尝试时发生的事情。

答案 1 :(得分:0)

答案 2 :(得分:0)

是。只要1个视图启用了自动布局,整个窗口就会启用自动布局,将帧转换为顶部,左侧,宽度和高度约束(尊重自动调整遮罩)

因此,即使您可能认为您正在操作边框或边框或中心属性,它也会在后台转换为自动布局,使其与启用自动布局的视图100%兼容。