IBDesignable 仅在 Storyboard 中呈现,而不是在独立的 XIB 中
IBDesignable's only render in Storyboard, not in standalone XIB's
如果这是正常的,我还没有阅读任何地方,但我无法让 IBDesignable 视图在独立的 xib 中呈现,例如自定义视图甚至 TableViewCell。
当我将它们放入故事板时,它们呈现得非常好。这是我的 IBDesignable 自定义视图的参考示例:
@IBDesignable
class AvatarView: UIView, NibLoadable {
@IBOutlet public var contentView: UIView!
@IBOutlet public var backgroundView: CircleView!
@IBOutlet public var label: UILabel!
@IBOutlet public var imageView: UIImageView!
@IBInspectable var labelText: String = "" {
didSet {
self.label.text = labelText
}
}
@IBInspectable var image: UIImage? = nil {
didSet {
self.imageView.image = image
}
}
override init(frame: CGRect) {
super.init(frame: frame)
setupFromNib()
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupFromNib()
commonInit()
}
private func commonInit() {
clipsToBounds = true
layer.masksToBounds = true
self.backgroundColor = .clear
}
public func setUser(_ user: User) {
labelText = getInitialsForUser(user)
}
public func setImageUrl(_ urlString: String) {
self.imageView.kf.setImage(with: URL(string: urlString)!)
}
//MARK -- PRIVATE --
fileprivate func getInitialsForUser(_ user: User) -> String {
var name = ""
if let fullName = user.getFullName() {
name = fullName
}
return name.components(separatedBy: " ").reduce("") { ([=10=] == "" ? "" : "\([=10=].first!)") + "\(.first!)" }
}
}
这里还有 NibLoadable class:
public protocol NibLoadable {
static var nibName: String { get }
}
public extension NibLoadable where Self: UIView {
static var nibName: String {
return String(describing: Self.self) // defaults to the name of the class implementing this protocol.
}
static var nib: UINib {
let bundle = Bundle(for: Self.self)
return UINib(nibName: Self.nibName, bundle: bundle)
}
func setupFromNib() {
guard let view = Self.nib.instantiate(withOwner: self, options: nil).first as? UIView else { fatalError("Error loading \(self) from nib") }
addSubview(view)
view.translatesAutoresizingMaskIntoConstraints = false
view.leadingAnchor.constraint(equalTo: self.safeAreaLayoutGuide.leadingAnchor, constant: 0).isActive = true
view.topAnchor.constraint(equalTo: self.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
view.trailingAnchor.constraint(equalTo: self.safeAreaLayoutGuide.trailingAnchor, constant: 0).isActive = true
view.bottomAnchor.constraint(equalTo: self.safeAreaLayoutGuide.bottomAnchor, constant: 0).isActive = true
}
}
编辑:我错误地指出 IBDesignable 和 IBInspectable 是 Storyboard-only 功能。
这个答案已经被接受所以我不能删除它。
请参阅下面 Rob 的评论。您无法从可设计的视图中加载 NIB (XIB)。
以下说法不正确。
没错。 IBDesignable 和 IBInspectable 是 Storyboard 独有的功能。
可以在 NIB/XIB 中使用 @IBDesignable
个视图。例如
根本无法从 @IBDesignable
视图中以编程方式访问任何项目资源(NIB、自定义命名颜色、资产等)。在 Interface Builder 中呈现的可设计对象无权访问您的包。 stand-alone 环境中的可设计对象 运行。
所以,是的,您可以在 NIB 中使用 designables,但反之则不行。
如果这是正常的,我还没有阅读任何地方,但我无法让 IBDesignable 视图在独立的 xib 中呈现,例如自定义视图甚至 TableViewCell。
当我将它们放入故事板时,它们呈现得非常好。这是我的 IBDesignable 自定义视图的参考示例:
@IBDesignable
class AvatarView: UIView, NibLoadable {
@IBOutlet public var contentView: UIView!
@IBOutlet public var backgroundView: CircleView!
@IBOutlet public var label: UILabel!
@IBOutlet public var imageView: UIImageView!
@IBInspectable var labelText: String = "" {
didSet {
self.label.text = labelText
}
}
@IBInspectable var image: UIImage? = nil {
didSet {
self.imageView.image = image
}
}
override init(frame: CGRect) {
super.init(frame: frame)
setupFromNib()
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupFromNib()
commonInit()
}
private func commonInit() {
clipsToBounds = true
layer.masksToBounds = true
self.backgroundColor = .clear
}
public func setUser(_ user: User) {
labelText = getInitialsForUser(user)
}
public func setImageUrl(_ urlString: String) {
self.imageView.kf.setImage(with: URL(string: urlString)!)
}
//MARK -- PRIVATE --
fileprivate func getInitialsForUser(_ user: User) -> String {
var name = ""
if let fullName = user.getFullName() {
name = fullName
}
return name.components(separatedBy: " ").reduce("") { ([=10=] == "" ? "" : "\([=10=].first!)") + "\(.first!)" }
}
}
这里还有 NibLoadable class:
public protocol NibLoadable {
static var nibName: String { get }
}
public extension NibLoadable where Self: UIView {
static var nibName: String {
return String(describing: Self.self) // defaults to the name of the class implementing this protocol.
}
static var nib: UINib {
let bundle = Bundle(for: Self.self)
return UINib(nibName: Self.nibName, bundle: bundle)
}
func setupFromNib() {
guard let view = Self.nib.instantiate(withOwner: self, options: nil).first as? UIView else { fatalError("Error loading \(self) from nib") }
addSubview(view)
view.translatesAutoresizingMaskIntoConstraints = false
view.leadingAnchor.constraint(equalTo: self.safeAreaLayoutGuide.leadingAnchor, constant: 0).isActive = true
view.topAnchor.constraint(equalTo: self.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
view.trailingAnchor.constraint(equalTo: self.safeAreaLayoutGuide.trailingAnchor, constant: 0).isActive = true
view.bottomAnchor.constraint(equalTo: self.safeAreaLayoutGuide.bottomAnchor, constant: 0).isActive = true
}
}
编辑:我错误地指出 IBDesignable 和 IBInspectable 是 Storyboard-only 功能。
这个答案已经被接受所以我不能删除它。
请参阅下面 Rob 的评论。您无法从可设计的视图中加载 NIB (XIB)。
以下说法不正确。
没错。 IBDesignable 和 IBInspectable 是 Storyboard 独有的功能。
可以在 NIB/XIB 中使用 @IBDesignable
个视图。例如
根本无法从 @IBDesignable
视图中以编程方式访问任何项目资源(NIB、自定义命名颜色、资产等)。在 Interface Builder 中呈现的可设计对象无权访问您的包。 stand-alone 环境中的可设计对象 运行。
所以,是的,您可以在 NIB 中使用 designables,但反之则不行。