0

UIView動的に描画されるan の最終的なサイズを計算して取得するより良い方法はどれか疑問に思っています。たとえば、一連のビューが描画されるスーパービューがあります。これらのビューを適切にレイアウトするには、それらのビューのサイズが必要ですが、最終的なサイズは、表示されるデータを考慮して動的です。

このように、表示するデータに応じてビューのサイズを計算して返すクラス メソッドを公開し、適切なフレームでビューを作成する必要があります。その後、スーパービューでビューを正しくレイアウトしdrawRect、サブビューでそのクラス メソッド コードをほぼ複製します。これらの計算を適切に描画する必要があるためです。

例:

+ (CGSize)sizeForTopText:(NSString *)topText 
                leftText:(NSString *)leftText 
             showingIcon:(BOOL)showIcon {

    // Here I compute all this data taking into account font sizes, 
    // icon image size, etc, code that will be almost cloned in drawRect:
}

// In the superview

CGSize myViewSize = [MyView sizeForTopText:@"topText" leftText:@"leftText" showingIcon:NO];
MyView *theView = [[MyView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, myViewSize.width, myViewSize.height)];

一部の Cocoa メソッドは、描画後に最終的なサイズを返すことがわかります。たとえば、NSStringdrawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment:は、そのパラメーターでテキストを描画した後にテキストの最終的なサイズを返します。

どうすればそのようなことを達成できますか? 私は現在の解決策が好きではありません。それは間違っていると思います。

ありがとうございました。

4

1 に答える 1

1

通常、 でサイズを計算するべきではありませんdrawRect:。データが更新される時点で必要なすべてのデータが必要です。また、クラス メソッドで計算するのは少し奇妙に思えます (さまざまな場所から呼び出す必要がある場合は問題ないかもしれませんが、それでも一般的ではありません)。

これを行う通常の方法は、sizeThatFits:サブビューごとにオーバーライドすることです。そこで、ビューの現在の構成に基づいて最適なサイズを計算します。を使用sizeToFitすると、ビューが最適なサイズになるように指示されます。スーパービューはオーバーライドsizeThatFits:を使用してそのサブビューの結果を組み合わせることができ、in を使用sizeThatFits:layoutSubviewsて全体のレイアウトを計算できます。

于 2013-04-30T17:36:14.657 に答える