2012-08-27 12 views
8

sizeToFitを私のビューの1つに呼び出すと、iOSフレームワークが最初にsizeThatFitsを呼び出し、その後layoutSubviewsを呼び出していることがわかりました。私のsizeThatFitsでの計算が私のlayoutSubviewsの結果に依存するので、これは私には問題があります。次の例では、サブビューはlayoutSubviewsに調整され、このサブビューの高さはsizeThatFitsで使用されます。現在、私のコードは動作していないので、注文は元に戻ります。私のビューコントローラののviewDidLoadでsizeThatFitsより前にlayoutSubviewsを呼び出す方法を教えてください。

:私の見解では

UIView* header = [[MyHeader alloc] init]; 
[header sizeToFit]; 
self.tableView.tableHeaderView = header; 
[header release]; 

- (void) layoutSubviews { 
    [super layoutSubviews]; 
    [self.subView sizeToFit]; 
} 

- (CGSize) sizeThatFits:(CGSize)size { 
    return CGSizeMake(
     self.frame.size.width, 
     self.subView.frame.size.height 
    ); 
} 
+0

この問題を解決しましたか? –

+0

最初のコードでは、 '[header sizeToFit]'を呼び出すだけで 'MyHeader'の' sizeThatFits: 'はオーバーライドされません: >このメソッドのデフォルトの実装では、ビューの境界矩形のサイズ部分が返されます。 – Rivera

答えて

0

は、あなただけの-layoutSubviews方法でサブビューのフレームの代わりに、-sizeThatFits:方法を変更することができませんか?

1

layoutSubviewsを強制的に表示するには、layoutIfNeededを呼び出してみましたか?誤解を招く名前にもかかわらず、これはただちにlayoutSubviewsを誘発する方法です。 sizeToFitまたはsizeThatFitsの前に電話してみてください。

6

あなたは、あなたが物事を呼び出す順番に関係なく常に正しいこと(tm)をしたいと思うでしょう。これを達成するには、ビューの目的の高さと別の方法でのサブビューを計算するコードを配置することをお勧めします。これらの線に沿って何か:

- (void)updateSubviewDimensions 
{ 
    [self.subview sizeToFit]; 
    // possibly much more code 
} 

- (void) layoutSubviews { 
    [super layoutSubviews]; 
    [self updateSubviewDimensions]; 
} 

- (CGSize) sizeThatFits:(CGSize)size { 
    [self updateSubviewDimensions]; 
    return CGSizeMake(
     self.frame.size.width, 
     self.subView.frame.size.height 
    ); 
} 

このように、あなたはsizeToFitを呼び出す前に、特定のメソッドを呼び出すために覚えてに依存していませんが、あなたのビューは常にあなたがやりたいだろう。また、数ヶ月後に(または別の開発者に見てもらいたい)コードを見ると、コードは脆くなく分かりやすくなります。

+0

TL; DR: 'updateConstraints'を実装し、' updateSubviewDimensions'を呼び出します。 Verbose:私は完全な答えを得る時間がありませんが、ここでの適切な解決策はupdateConstraintsを実装することだと思います。 iOS 8のテストから。3、systemLayoutConstraintsFittingSizeのデフォルトのUIView実装は、最終的にupdateConstraintsの呼び出しを呼び出します。これにより、実際に物を敷くことなく、サイズを決定するために必要なものすべてがALシステムに与えられます。 –

2

sizeThatFits:のレイアウトが正確である必要がある場合は、レイアウトを強制する必要があります(下記のコードを参照してください)。しかし、レイアウトが「サイズ」を考慮していないため、これはうまく設計されていないと思います。

- (CGSize) sizeThatFits:(CGSize)size { 

    [self setNeedsLayout]; 
    [self layoutIfNeeded]; 

    return CGSizeMake(
     self.frame.size.width, 
     self.subView.frame.size.height 
    ); 
} 

より良いアプローチは、あなたの視野の必要なサイズを決定するために、その後、あなたのサブビューの自動レイアウトを使用systemLayoutSizeFittingSize:を使用することがあるかもしれない(対sizeThatFits:

あなたができないか、したくない場合自動レイアウトを使用するには、実際のレイアウトとレイアウト計算に別々のコードパスを使用することを検討する必要があります。

1

ここでの問題は、layoutSubviewsが呼び出されるまで、サブビューには次元がないことです。これは、カスタムテーブルビューセルと同じです。

これを回避するには、ロジックを変更するか、自動計算に頼らずに明示的な次元を得るために数学を自分で行う必要があります。

関連する問題