我可以在使用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高度。
这就是我得到的,根本没有蓝色区域。
答案 0 :(得分:1)
是的,但你必须非常小心并且相当有限。
从技术上讲,如果窗口中的任何视图使用自动布局,则窗口中的所有内容都使用自动布局。只是frame
和autoresizingMask
自动为translatesAutoresizingMaskIntoConstraints
留下的视图生成约束。
因此,您必须确保您的约束不会干扰那些自动生成的约束。您可以使用translatesAutoresizingMaskIntoConstraints
从视图中松散地“悬挂”某些内容,但您的约束不得“推”或“拉”这些视图。使用translatesAutoresizingMaskIntoConstraints
的观点必须具有完全的移动自由度和大小。
例如,您可以使用约束将按钮定位在容器视图前缘的一小段距离内,但如果您还约束到后缘,则最好使内容拥抱和压缩阻力优先级非常低,以便他们不会尝试改变容器的宽度。即便如此,您最终可能会遇到冲突。在自动布局中,视图的宽度不允许为负。如果容器设置为零宽度并且按钮与边缘的距离不为零,则这将是冲突。因此,对后沿的约束也应该具有低优先级,以便在必要时可以将其破坏。 (或者你可以为前沿做到这一点。)
您说使用translatesAutoresizingMaskIntoConstraints
无法在视图中使用自动布局。如果您需要进一步的帮助,您需要解释您尝试过的内容以及尝试时发生的事情。
答案 1 :(得分:0)
此链接可能有用:
以编程方式自动布局
以编程方式添加视图:
http://www.informit.com/articles/article.aspx?p=2015112&seqNum=3
快乐的编码。
答案 2 :(得分:0)
是。只要1个视图启用了自动布局,整个窗口就会启用自动布局,将帧转换为顶部,左侧,宽度和高度约束(尊重自动调整遮罩)
因此,即使您可能认为您正在操作边框或边框或中心属性,它也会在后台转换为自动布局,使其与启用自动布局的视图100%兼容。