2017-05-30 88 views
2

我从一个的.xib文件中加载一个UIView是这样的:从Nib加载UIView的框架大小?

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

当加载视图具有如在界面生成器的尺寸检查的“矩形框架”中设定的确切帧大小。

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

[*] =原因:我将视图渲染为UIImage,以便稍后将其显示在UIImageView中。它显示了一个会员卡和名称,会员号的图像必须在所有设备上正确的字体大小合适的地方..

回答

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) 
    } 
} 

和然后调用如果从类,你会在你需要的帧大小执行或以其他方式将默认为是在你的界面生成器设置大小:设置任何UIView子类如厦门国际银行的所有者

// 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!) 

} 
+0

所以基本上你手动设置框。好吧,我想这不会在代码中设置框架,只是为了确保xib大小不能保证。 – scrrr

1

,然后加载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)) 
} 
+0

谢谢Vasilii。我只是想知道在Interface Builder中设置的框架在运行时是否有保证,但是你也明确地设置了xibView.frame,所以我猜你不会使用它或信任它。 ;)干杯 – scrrr