web-dev-qa-db-ja.com

自動レイアウトで実際のサイズのUIViewを取得する方法

私は新しい開発者iOSです。

自動レイアウトを使用します。

私は問題があります。制約の後、UIViewの実際のサイズを取得できません。

例、制約付きでUIViewのサイズを取得する場合

self.container.frame.size.height

すべてのデバイスサイズで常に550を返します。しかし、異なるデバイスで実行すると、サイズが異なることがわかります。

ありがとう

27
Chicken

最も簡単な解決策は、-viewDidAppear:でそのコードを実行することです(自動レイアウトの実行後)。

15
Oxcug

「実際のサイズのコードを取得する」前に、次のコードを挿入します。

[view setNeedsLayout];
[view layoutIfNeeded];
46
Allen

誰もがUIViewControllerサブクラス内ではなくUIViewを介してアクセスが行われると想定しているため、答えは実際には有用ではありません。 UIViewサブクラスの正しいサイズを取得する正しい方法は、layoutSubviewsにあります。

17
Leandros

UIViewメソッドintrinsicContentSizeを使用できます

enter image description here

これについて読むことができます https://developer.Apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//Apple_ref/occ/instm/UIView/intrinsicContentSize

10
Abizern

これはすごい。

自動レイアウトの使用中にlayoutsubviewsメソッドを使用せずにフレームを取得する場合は、次のいずれかを使用します。

dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"View frame: %@", NSStringFromCGRect(view.frame));
    })
7
SamSol

- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize;があなたが探しているもののようです:

戻り値
保持している制約を満たすビューのサイズ。

討論
保持するすべての制約とそのサブビューの制約を考慮して、ビューの最適なサイズを決定します。

https://developer.Apple.com/documentation/uikit/uiview/1622624-systemlayoutsizefittingsize?language=objc

7
Dustt

[view layoutIfNeed]を保存してください。

このメソッドを使用して、描画前にサブビューのレイアウトを強制します。このメソッドは、メッセージをルートビューとして受信するビューを使用して、ルートから始まるビューサブツリーをレイアウトします。

このメソッドを呼び出した後、xibでカスタムビューの実際のサイズを取得できます。 @Allenと著者に感謝します。

1
Chiakie

viewDidLayoutSubviewsの前に発生するため、最良の瞬間はviewDidAppearの間にあります。したがって、ビューが表示される前にいくつかの変更を行うことができます。

1
Zaphod