2017-05-30 10 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 
} 

は、Interface Builderでサイズインスペクタの「フレーム矩形」に設定された正確なフレームサイズを持っています。

これは保証されていますか?サブビューの制約は特定であり、ビューのサイズが間違っていれば適合しないため、このサイズが正確である必要がありますが、アップルのドキュメントではこれについて何も言及していません。

[*] =理由: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) 
    } 
} 

をし、

// 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-sizeが保証されていないことを確認するために、フレームをコードに設定するのは苦労しないと思います。 – scrrr

1

XIBの所有者として任意のUIViewのサブクラスを設定します。その後、クラスからあなたが必要なフレームサイズでそれを実装することがありますか、そうでなければ、それはあなたのインターフェイスビルダーに設定されているサイズにデフォルト設定されます場合は呼び出し、このビューのサブビューとして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

関連する問題