从Nib加载时UIView的帧大小?

时间:2017-05-30 18:35:42

标签: ios swift uiview interface-builder xib

我正在从.xib文件加载UIView,如下所示:

static func loadFromNib() -> CardView {
    let nib = UINib(nibName: "CardView", bundle: nil)
    return nib.instantiate(withOwner: self, options: nil).first as! CardView
}

加载时,视图具有在" Frame Rectangle"中设置的确切帧大小。接口生成器中的大小检查器。

这有保证吗?我需要这个大小是准确的,因为子视图约束是特定的,如果视图的大小错误[*]则不适合,但我在Apple的文档中没有找到任何提及。

[*] =原因:我正在将视图渲染为UIImage,因此我可以在以后显示它和UIImageView。它显示会员卡的图像,名称和会员编号需要在所有设备上使用正确的字体大小在正确的位置..

2 个答案:

答案 0 :(得分:1)

为您的UIView创建一个自定义类:

class CardView: UIView {

override init(frame: CGrect) {
    super.init(frame: frame)
    let xibView = UINib(nibName: "CardView", bundle: nil).instantiate(withOwner: nil, options:nil)[0] as! UIView
    self.addSubview(xibView)
    }   

require init?(coder: aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    }  
}

然后从类中调用if您将使用您需要的帧大小实现它,否则它将默认为您在界面构建器中设置的大小:

// MyViewController

var cardView: CardView?

override func viewDidLoad() {
    super.viewDidLoad()

    self.cardView = CardView()
    self.cardView.frame.size = CGSize(size here)
    self.cardView.frame.origin = CGPoint(point here)
    self.view.addSubview(self.cardView!)

}

答案 1 :(得分:1)

将任何UIView子类设置为xib的所有者,然后将xib作为此视图的子视图加载并设置自动调整掩码。

这就是我使用它的方式:

extension UIView {
    func loadXibView(with xibFrame: CGRect) -> UIView {
        let className = String(describing: type(of: self))
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: className, bundle: bundle)
        guard let xibView = nib.instantiate(withOwner: self, options: nil)[0] as? UIView else {
            return UIView()
        }
        xibView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        xibView.frame = xibFrame
        return xibView
    }
}

xibView.autoresizingMask = [.flexibleWidth, .flexibleHeight]正确设置了视图大小。

然后在初始化中使用任何UIView子类:

override init(frame: CGRect) {
    super.init(frame: frame)
    addSubview(loadXibView(with: bounds))
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    addSubview(loadXibView(with: bounds))
}