我正在尝试在swift iOS 10中的xib / nib文件中创建可重用的视图。
当我创建一个堆栈视图并在其中有2个对象时,确保我的stackview被约束到nib / xib的容器视图(从上到下,从下到下,导致前导,最后尾随到尾随),我得到一个错误,说我错过了第一个和第二个对象的Y位置。只创建其中一个通常会修复它。虽然这是横向发展的地方。在我以前的所有研究中,如果我将我的stackview分布到Fill,我不应该这样做。虽然这似乎使Xcode安静,但是当我尝试运行我的程序时,它会产生一个过度约束的问题。
以下是我在主要故事板的视图中加载笔尖的内容:
public protocol NibOwnerLoadable: class {
static var nib: UINib { get }
}
//MARK:- Generic Implementation
public extension NibOwnerLoadable {
// Use the xib file with the same name as your UIView subclass located in the bundle of that class
static var nib: UINib {
return UINib(nibName: String(describing: self), bundle: Bundle(for: self))
}
}
//MARK:- Support for instation from the XIB file
public extension NibOwnerLoadable where Self: UIView {
// Function to load content and constraints automatically
func loadNibContent() {
let layoutAttributes: [NSLayoutAttribute] = [.top, .leading, .bottom, .trailing]
for view in Self.nib.instantiate(withOwner: self, options: nil) {
if let view = view as? UIView {
view.translatesAutoresizingMaskIntoConstraints = false
view.frame = bounds
self.addSubview(view)
layoutAttributes.forEach{ attribute in self.addConstraint(NSLayoutConstraint(item: view, attribute: attribute, relatedBy: .equal, toItem: self, attribute: attribute, multiplier: 1, constant: 0.0))
}
}
}
}
}
我知道我的问题是由自动布局添加的额外约束但是为什么以及在哪里。这个问题非常接近我正在尝试做的事情,但出于某种原因,我的AutoLayout知识在我的脑海中是混乱的。 Adding a subclassed UIView to a Nib with its auto layout constraints 一点点帮助将是欣赏。请解释原因,而不仅仅是如何做到这一点。我是一个喜欢了解背后故事的人。它使逻辑更容易保留。
以下是我的filterView作为nib / xib的图片,它在searchAndFilterView中作为FilterView(UIView)加载,加载到我的storyboard中的一个我的视图控制器中。想想可重复使用的工具视图。
答案 0 :(得分:0)
Woohou!
以下是我如何理解这一点。
我意识到我对使用XIB / NIB的视图的高度限制是必要的,以便在未隐藏时设置视图。但是当我将.isHidden设置为true值时,这将与我的高度约束发生冲突。
当视图从隐藏变为隐藏时,我需要让Autolayout执行自动布局,反之亦然。通过设置优先级默认值为1000的约束,我告诉Autolayout绝对确保此约束始终处于活动状态。
我意识到通过将优先级设置为999,我告诉Autolayout它可以在我真正需要的时候覆盖我的约束。为什么999,我假设当一个视图被隐藏时,它确实没有大小,这对于Autolayout来说是非常高的优先级。
我希望我知道这一点,或者知道如何找出默认的自动布局优先级。
如果有人对此有更多了解,我会感谢更多信息或链接!