从Xib加载的UIView不正确应用AutoLayout

时间:2018-02-16 08:45:23

标签: ios autolayout storyboard xib ios-autolayout

我试图将我的视图控制器内容分解为我从xib加载的更小的单个视图块。我通过将占位符UIView对象放入我的Storyboard视图控制器并使用它们将我在xib文件中布局的实际UIView子类添加为构建时的子视图来实现这一点。

这个过程非常简单,只有discussed before

然而,问题是当我添加视图时,xib文件中定义的AutoLayout约束不起作用。

为了说明问题,我创建了一个示例项目:ViewController的{​​{1}}类型colorViewCustomColorView的子类)将是添加到普通UIView占位符。然后UIView类具有CustomColorView属性,该属性应填充整个空间(由AutoLayout约束定义到xib文件中的每一侧)。

ViewController

enter image description here

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

1 个答案:

答案 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(),则会显示正确的值,因为viewDidAppearviewDidAppear之后执行,所以当您的viewController正确结束其布局时,您的日志显示正确的价值观

viewDidLayoutSubviews

<强>日志

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    colorView.setup()
}