故事板 xib 实时视图在左上角呈现所有子视图
Storyboard xib live view renders all subviews in top-left corner
我正在使用 XCode 12.1,我正在尝试创建一些可重用的 XIB,并希望在情节提要中呈现它们。我的问题是所有这些视图都将呈现在左上角,就像我加载的视图的框架是 CGRect.zero
一样。故事板中的视图控制器如下所示:
我制作了一个 UIView
的子class,它动态加载来自 .xib
的视图:
import UIKit
@IBDesignable
class NibView: UIView {
required init?(coder: NSCoder) {
super.init(coder: coder)
self.createNibView()
}
override init(frame: CGRect) {
super.init(frame: frame)
self.createNibView()
}
private func createNibView() {
guard let view = loadFromNib() else { return }
self.translatesAutoresizingMaskIntoConstraints = false
self.addSubview(view)
self.createConstraints(for: view)
self.setNeedsLayout()
}
private func loadFromNib() -> UIView? {
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: String(describing: type(of: self)), bundle: bundle)
let view = nib.instantiate(withOwner: self, options: nil).first as? UIView
view?.translatesAutoresizingMaskIntoConstraints = false
return view
}
private func createConstraints(for view: UIView) {
NSLayoutConstraint.activate([
self.topAnchor.constraint(equalTo: view.topAnchor),
self.bottomAnchor.constraint(equalTo: view.bottomAnchor),
self.leadingAnchor.constraint(equalTo: view.leadingAnchor),
self.trailingAnchor.constraint(equalTo: view.trailingAnchor)
])
}
}
和此视图的子class:
import UIKit
@IBDesignable
class RDTextField: NibView {
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var errorLabel: UILabel!
@IBOutlet weak var errorIcon: UIImageView!
}
与关联的 xib:
在情节提要中,我添加了一个视图,我为其设置了此自定义视图的 class,这是从带有情节提要的图像中选择的视图。
我也尝试过 awakeAfter(using coder:)
但没有更好的结果,我尝试使用自动调整大小的掩码,它稍微好一点,因为它可以正确设置原点,但它没有正确的大小。无论如何,我想使用translatesAutoresizingMaskIntoConstraints
禁用并使用我自己的约束。
我也试过调试这些视图,但是 XCode 不会附加到任何进程,我在 Console.app
.
中找不到日志
注意:我有 UIView
的 IBDesignable
扩展,它可以帮助我设置边框颜色、宽度和半径。我试过禁用它,但没有任何结果。
注意 2:在运行时一切正常,但也非常需要故事板中的实时视图。
有没有人遇到过这个问题或者知道如何解决这个问题?
情节提要对象的 root 视图始终使用自动调整大小蒙版。您的代码正在禁用它。
从 NibView
class
中的 createNibView()
函数中删除一行
private func createNibView() {
guard let view = loadFromNib() else { return }
// don't do this!
//self.translatesAutoresizingMaskIntoConstraints = false
self.addSubview(view)
self.createConstraints(for: view)
self.setNeedsLayout()
}
应该可以了。
我正在使用 XCode 12.1,我正在尝试创建一些可重用的 XIB,并希望在情节提要中呈现它们。我的问题是所有这些视图都将呈现在左上角,就像我加载的视图的框架是 CGRect.zero
一样。故事板中的视图控制器如下所示:
我制作了一个 UIView
的子class,它动态加载来自 .xib
的视图:
import UIKit
@IBDesignable
class NibView: UIView {
required init?(coder: NSCoder) {
super.init(coder: coder)
self.createNibView()
}
override init(frame: CGRect) {
super.init(frame: frame)
self.createNibView()
}
private func createNibView() {
guard let view = loadFromNib() else { return }
self.translatesAutoresizingMaskIntoConstraints = false
self.addSubview(view)
self.createConstraints(for: view)
self.setNeedsLayout()
}
private func loadFromNib() -> UIView? {
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: String(describing: type(of: self)), bundle: bundle)
let view = nib.instantiate(withOwner: self, options: nil).first as? UIView
view?.translatesAutoresizingMaskIntoConstraints = false
return view
}
private func createConstraints(for view: UIView) {
NSLayoutConstraint.activate([
self.topAnchor.constraint(equalTo: view.topAnchor),
self.bottomAnchor.constraint(equalTo: view.bottomAnchor),
self.leadingAnchor.constraint(equalTo: view.leadingAnchor),
self.trailingAnchor.constraint(equalTo: view.trailingAnchor)
])
}
}
和此视图的子class:
import UIKit
@IBDesignable
class RDTextField: NibView {
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var errorLabel: UILabel!
@IBOutlet weak var errorIcon: UIImageView!
}
与关联的 xib:
在情节提要中,我添加了一个视图,我为其设置了此自定义视图的 class,这是从带有情节提要的图像中选择的视图。
我也尝试过 awakeAfter(using coder:)
但没有更好的结果,我尝试使用自动调整大小的掩码,它稍微好一点,因为它可以正确设置原点,但它没有正确的大小。无论如何,我想使用translatesAutoresizingMaskIntoConstraints
禁用并使用我自己的约束。
我也试过调试这些视图,但是 XCode 不会附加到任何进程,我在 Console.app
.
注意:我有 UIView
的 IBDesignable
扩展,它可以帮助我设置边框颜色、宽度和半径。我试过禁用它,但没有任何结果。
注意 2:在运行时一切正常,但也非常需要故事板中的实时视图。
有没有人遇到过这个问题或者知道如何解决这个问题?
情节提要对象的 root 视图始终使用自动调整大小蒙版。您的代码正在禁用它。
从 NibView
class
createNibView()
函数中删除一行
private func createNibView() {
guard let view = loadFromNib() else { return }
// don't do this!
//self.translatesAutoresizingMaskIntoConstraints = false
self.addSubview(view)
self.createConstraints(for: view)
self.setNeedsLayout()
}
应该可以了。