我试图将我的视图控制器内容分解为我从xib加载的更小的单个视图块。我通过将占位符UIView
对象放入我的Storyboard视图控制器并使用它们将我在xib文件中布局的实际UIView
子类添加为构建时的子视图来实现这一点。
然而,问题是当我添加视图时,xib文件中定义的AutoLayout约束不起作用。
为了说明问题,我创建了一个示例项目:ViewController
的{{1}}类型colorView
(CustomColorView
的子类)将是添加到普通UIView
占位符。然后UIView
类具有CustomColorView
属性,该属性应填充整个空间(由AutoLayout约束定义到xib文件中的每一侧)。
coloredView
协议:
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
}
}
时,我会假设它应用了nib文件中的所有已定义约束,但它没有。 UIView
结果对于两个视图应该是相同的但它们是不同的(print
仍然具有xib文件中的大小)。
关于什么可能出错的任何想法?谢谢你的帮助!
整个项目在GitHub上进行:XibAutoLayoutExample
答案 0 :(得分:1)
您的观看高度正确,请添加var user = _userManager.FindByIdAsync(Model.Author).Result;
和layer.borderColor
并进行检查
layer.borderWidth
此外,如果您在func setup() {
print("CustomColorView bounds: \(bounds)")
print("coloredView subview bounds: \(coloredView.bounds)")
self.coloredView.layer.borderColor = UIColor.red.cgColor
self.coloredView.layer.borderWidth = 1
}
中致电setup()
,则会显示正确的值,因为viewDidAppear
在viewDidAppear
之后执行,所以当您的viewController正确结束其布局时,您的日志显示正确的价值观
viewDidLayoutSubviews
<强>日志强>
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
colorView.setup()
}