2017-08-01 12 views
0

UIViewControllerにUIViewが追加されました。これらのビューのフレームにアクセスして使用するために、ビューが完全にロードされていることを確認します。私はUIView内で働いているし、ViewControllerはテスト目的のためだけです。 UIViewControllerUIViewが完全にロードされたときの通知方法

var slideView: BSlideBar = BSlideBar(frame: CGRect(x: 0, y: 150, width: 320, height: 54)) 

self.view.addSubview(slideView) 

私は次のようにビューを初期化していますのUIViewControllerにカスタムUIViewのをロードしています:ここで

は、私が働いている例でありますUIViewで

私はXIBファイルを私のUIViewに関連付けられているので、カスタムinit関数でNibをロードしています。

このUIView内には他のUIViewがあり、すべてUIViewControllerに追加されています。私はこれらのビューの属性にアクセスしようとすると、これは、すべて正常に動作し、問題が来ている:

例:

draggableView.layer.cornerRadius = draggableView.frame.width/2 

これはdraggableView円になりますし、またのサイズをベースに私を可能にそれを円として維持しながら、それが含まれているビュー上でdraggableViewを実行します。これは、私のビューが初期化されたどのフレームでも一貫性を保つことを意味します。注意深く、フレームは、ロードされたUIViewのフレームではなく、常にXIBファイルのフレームとして返されます。

例2(それは予想して所望のフレームを返し、それをロードした後、私はボタンをクリックした場合):もう一度

self.centreLine.frame = CGRect(x: Int(sidePadding), y: Int(slideView.frame.height/2), width: Int(UIScreen.main.bounds.width - 2 * sidePadding), height: 2) 

を、私は、このビューは、それが含まれているビューの大きさに合わせて調整したいですこの場合、エッジのパッディング内に留まり、まさにビューの真ん中にあるはずです。もう一度これは当てはまりません。

私が使用してthis答えを使用しようとしました:

-(void)awakeFromNib 

override func layoutSubviews() { 
    super.layoutSubviews() 
} 

は、しかし、これらのいずれも後半に十分に呼ばれているように見えます。

問題は、私は通常、このような何かを呼ばれると同じようにUIViewの内側にあることに一因である:

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
} 

私は少し混乱したが、この問題が発生している理由を見つけることに本当に興味を持っています。私が持っている主な問題は、問題を簡潔に調べて、現在のすべてのリードを使い果たしたことです。

+0

https://stackoverflow.com/questions/4501974/uiview-how-to-get-notified-when-the-view-is-loaded –

+0

私はすでにこの質問を私の質問にリンクしています。それは、どの機能が適切なものか誤解しているかもしれません。任意の追加の説明は素晴らしいだろう –

答えて

0

nibをロードしてロードされたビューを返すクラス関数を作成します。その後、

var slideBar: BSlideBar = BSlideBar.loadViewFromNib() 
slideBar.frame = CGRect(.....) 
addSubview(slideBar) 

動作するはずサブビューに追加し、私はするつもりだビューを設定し、

class func loadViewFromNib() -> BSlideBar 
    guard let nibs = Bundle.main.loadNibNamed("BSlideBar", owner: self, options: nil) as? [UIVIew] else { assertFailure(): return UIView() } 

    return nibs.first as! BSlideBar 
} 

があなたのUIViewVontrollerであなたの変数を初期化するUIView

ビュー

を初期化するためのものを使用してください私はそれに答える前に "なぜ"をダブルチェックし、あなたに悪い情報を与えたくありません。

0

それは、あなたが気にすることを「完全にロードさ」ではありません。それは完全にレイアウトされています。

オーバーライドlayoutSubviews

override func layoutSubviews() { 
    super.layoutSubviews() 

    // At this point, all of my direct subviews' frames are set. 
    // However, their subviews (my more distant descendants) 
    // haven't had their frames updated yet. 
} 

ビュー階層全体レイアウトを完了したときに通知すべき特に良い方法はありません。 drawRect:を受け取ったときにすべての子孫がレイアウトされていることを確認できますが、その時点でレイヤーのプロパティを変更する必要はありません。

+0

私はこれを試したときにメインのUIViewはそのサブビューによってレイアウトされていませんでした(あなたの答えのコメントが示唆するように)。あなたはすべての子孫がdrawRectにレイアウトされていると言います。レイヤのプロパティを変更することが許可される前に、そこには時間がありますか? –

関連する問題