自定义视图中的图像不会实时渲染
Image inside custom view doesn't get live rendered
我正在为导航栏之类的东西构建自定义 UIView,并希望在故事板的视图控制器内显示此栏。
酒吧分为两部分。一个 UIView 用于背景,一个 UIImageView 用于波浪图像。我的问题是,如果我在情节提要中使用该自定义视图,则只有背景 UIView 会实时渲染,而图像不会。如果我为图像设置 @IBInspectable
并将其设置为检查器中的 UIImageView,它会起作用。
酒吧的样子如下:
这就是它在视图控制器中的样子:
这是我的代码 (Swift 3):
TopBar.swift
@IBDesignable
class TopBar: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
initView()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
initView()
}
func initView() {
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: "TopBar", bundle: bundle)
let view = nib.instantiate(withOwner: self, options: nil).first as! UIView
view.frame = bounds
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
addSubview(view)
}
}
尝试实现您的 awakeFromNib 方法并添加 prepareForInterfaceBuilder 方法
override func awakeFromNib() {
super.awakeFromNib()
self.initView()
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
self.initView()
}
已编辑
这很奇怪,因为我一直使用这个 class 并且在我的故事板中渲染效果很好
import UIKit
@IBDesignable class GenericXibView: UIView {
@IBInspectable var nibName:String?
/**
View name.
*/
func getNibName() ->String?
{
return nibName
}
/**
View itself.
*/
var vView : UIView!;
override func awakeFromNib() {
super.awakeFromNib()
self.setup()
}
/**
Class construct. Initialize the view.
*/
public override init(frame oFrame: CGRect) {
super.init(frame: oFrame);
self.setup();
}
/**
Class construct. Initialize the view.
*/
public required init?(coder oDecoder: NSCoder) {
super.init(coder: oDecoder);
self.setup();
}
/**
Initialize the custom view and add it to this.
*/
fileprivate func setup() {
assert(self.getNibName() != nil, "View with empty nib name can't be instatiated")
self.vView = UINib(nibName: self.getNibName()!, bundle: Bundle(for: type(of: self))).instantiate(withOwner: self, options: nil)[0] as! UIView;
self.vView.translatesAutoresizingMaskIntoConstraints = false;
self.addSubview(vView);
self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[view]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":self.vView]));
self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[view]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":self.vView]));
// self.vImgUser.layer.cornerRadius = (self.vImgUser.frame.size.width / 2);
// self.vImgUser.layer.masksToBounds = true;
self.setNeedsLayout();
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
setup()
vView.prepareForInterfaceBuilder()
}
/*
// Only override draw() if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func draw(_ rect: CGRect) {
// Drawing code
}
*/
}
还要确保您的 class 在 xib 文件中设置为 fileOwner
希望对您有所帮助
经过与 Reinier Melian 的多次讨论和反复试验,我才弄清楚是什么原因造成的。
在我的 Assets.xcassets 文件夹中,我导入了仅用于 iPhone 设备的图像。在检查器中将其设置为 Universal 后,一切都与我问题中列出的代码一起工作。
无论如何,非常感谢 Reinier Melian 帮助我!
(https://whosebug.com/users/6190582/reinier-melian)
我正在为导航栏之类的东西构建自定义 UIView,并希望在故事板的视图控制器内显示此栏。
酒吧分为两部分。一个 UIView 用于背景,一个 UIImageView 用于波浪图像。我的问题是,如果我在情节提要中使用该自定义视图,则只有背景 UIView 会实时渲染,而图像不会。如果我为图像设置 @IBInspectable
并将其设置为检查器中的 UIImageView,它会起作用。
酒吧的样子如下:
这就是它在视图控制器中的样子:
这是我的代码 (Swift 3):
TopBar.swift
@IBDesignable
class TopBar: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
initView()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
initView()
}
func initView() {
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: "TopBar", bundle: bundle)
let view = nib.instantiate(withOwner: self, options: nil).first as! UIView
view.frame = bounds
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
addSubview(view)
}
}
尝试实现您的 awakeFromNib 方法并添加 prepareForInterfaceBuilder 方法
override func awakeFromNib() {
super.awakeFromNib()
self.initView()
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
self.initView()
}
已编辑
这很奇怪,因为我一直使用这个 class 并且在我的故事板中渲染效果很好
import UIKit
@IBDesignable class GenericXibView: UIView {
@IBInspectable var nibName:String?
/**
View name.
*/
func getNibName() ->String?
{
return nibName
}
/**
View itself.
*/
var vView : UIView!;
override func awakeFromNib() {
super.awakeFromNib()
self.setup()
}
/**
Class construct. Initialize the view.
*/
public override init(frame oFrame: CGRect) {
super.init(frame: oFrame);
self.setup();
}
/**
Class construct. Initialize the view.
*/
public required init?(coder oDecoder: NSCoder) {
super.init(coder: oDecoder);
self.setup();
}
/**
Initialize the custom view and add it to this.
*/
fileprivate func setup() {
assert(self.getNibName() != nil, "View with empty nib name can't be instatiated")
self.vView = UINib(nibName: self.getNibName()!, bundle: Bundle(for: type(of: self))).instantiate(withOwner: self, options: nil)[0] as! UIView;
self.vView.translatesAutoresizingMaskIntoConstraints = false;
self.addSubview(vView);
self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[view]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":self.vView]));
self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[view]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":self.vView]));
// self.vImgUser.layer.cornerRadius = (self.vImgUser.frame.size.width / 2);
// self.vImgUser.layer.masksToBounds = true;
self.setNeedsLayout();
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
setup()
vView.prepareForInterfaceBuilder()
}
/*
// Only override draw() if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func draw(_ rect: CGRect) {
// Drawing code
}
*/
}
还要确保您的 class 在 xib 文件中设置为 fileOwner
希望对您有所帮助
经过与 Reinier Melian 的多次讨论和反复试验,我才弄清楚是什么原因造成的。
在我的 Assets.xcassets 文件夹中,我导入了仅用于 iPhone 设备的图像。在检查器中将其设置为 Universal 后,一切都与我问题中列出的代码一起工作。
无论如何,非常感谢 Reinier Melian 帮助我! (https://whosebug.com/users/6190582/reinier-melian)