2017-05-30 47 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