【发布时间】:2018-07-27 03:20:11
【问题描述】:
我正在尝试将我的视图控制器内容分解为从 xib 加载的更小的单个视图块。为此,我将占位符 UIView 对象放入我的 Storyboard 视图控制器中,并使用它们添加实际的 UIView 子类,该子类在构建时作为子视图放置在 xib 文件中。
然而,问题在于,在我添加视图时,在 xib 文件中定义的 AutoLayout 约束不起作用。
为了说明这个问题,我创建了一个示例项目:ViewController 有一个 colorView 类型为 CustomColorView(UIView 的子类),它将被添加到一个普通的 UIView 占位符中。 CustomColorViewclass 然后具有coloredView 的属性,它应该填满整个空间(由 xib 文件中每一侧的 AutoLayout 约束定义)。
NibLoadable协议:
public protocol NibLoadable {
static var nibName: String { get }
}
public extension NibLoadable where Self: UIView {
public static var nibName: String {
return String(describing: Self.self)
}
public static var nib: UINib {
let bundle = Bundle(for: Self.self)
return UINib(nibName: Self.nibName, bundle: bundle)
}
func setupFromNib() {
guard let loadedView = Self.nib.instantiate(withOwner: self, options: nil).first as? UIView else { fatalError("Error loading \(self) from nib") }
loadedView.frame = bounds
addSubview(loadedView)
loadedView.translatesAutoresizingMaskIntoConstraints = false
loadedView.leadingAnchor.constraint(equalTo: self.safeAreaLayoutGuide.leadingAnchor, constant: 0).isActive = true
loadedView.topAnchor.constraint(equalTo: self.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
loadedView.trailingAnchor.constraint(equalTo: self.safeAreaLayoutGuide.trailingAnchor, constant: 0).isActive = true
loadedView.bottomAnchor.constraint(equalTo: self.safeAreaLayoutGuide.bottomAnchor, constant: 0).isActive = true
}
}
当我将自定义视图添加到普通的UIView 时,我会假设它应用了 nib 文件中定义的所有约束,但事实并非如此。 print 两个视图的结果应该相同,但它们不同(coloredView 仍然具有来自 xib 文件的大小)。
对可能出现的问题有任何想法吗?感谢您的帮助!
整个项目都在 GitHub 上:XibAutoLayoutExample
【问题讨论】:
-
整个视图控制器应该用蓝色视图填充?
-
您的视图高度正确,请添加layer.borderColor和layer.borderWidth并检查它
-
您无法在
viewDidLoad上获得正确的帧,因为它将开始加载和布局视图,您可以在viewDidLayoutSubviews上检查实际值。 -
我的回答对您有任何帮助吗? @JanApotheker
标签: ios autolayout storyboard xib ios-autolayout