UIButtonがあり、その中にあるテキストに合わせてサイズを変更したいと思います。幅は280に設定されていますが、テキストは次の行に折り返され、必要に応じてボタンの高さを拡張する必要があります。
改行をワードラップに設定してsizeToFitを試しましたが、ボタンが広くなるだけで、垂直にはなりません。
私はそれをUIButtonのカテゴリで機能させることができました:
@interface UIButton (ExpandsVertically)
- (CGSize)sizeThatFits:(CGSize)size;
@end
@implementation UIButton (Expandable)
- (CGSize)sizeThatFits:(CGSize)size {
// for the width, I subtract 24 for the border
// for the height, I use a large value that will be reduced when the size is returned from sizeWithFont
CGSize tempSize = CGSizeMake(size.width - 24, 1000);
CGSize stringSize = [self.titleLabel.text
sizeWithFont:self.titleLabel.font
constrainedToSize:tempSize
lineBreakMode:UILineBreakModeWordWrap];
return CGSizeMake(size.width - 24, stringSize.height);
}
@end
誰かがこれを使用する場合は、必ず設定してください:
myButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
ボタンのテキストを次のように設定してください。
[myButton setTitle:@"my title" forState:UIControlStateNormal];
...および[myButton sizeToFit]
は魅力のように機能するはずです。
[button sizeToFit]
私にはうまくいきませんでしたが、IBだけを使用する方法を見つけました(xcode 4.5):
UIButton
をクリックしますcontent hugging
から1(水平と垂直の両方)compression resistance
から1000(両方)constraints
の下でWidth
をクリックし、priority
を250に変更しますUIButton
のinset
を使用して、左/右/上/下のパディングを制御できます特定の幅またはボックスに制限されたフォント測定のメソッドを含む NSStringへのUIKitの追加ドキュメント を確認することをお勧めしますサイズ。
ボタンのタイトルを設定すると、たとえばsizeWithFont:forWidth:lineBreakMode:メソッドを使用して文字列を測定し、に基づいてボタンのフレームを更新できます。返されたサイズ(おそらくエッジの周りにいくつかのパディングを可能にします)。
申し訳ありませんが、具体的な例はありません。
私も同様の問題に直面しており、ボタンの幅が限られていて、与えるテキストの量に応じて、ボタンを垂直方向に拡大したいと考えていました。 Apple docs( https://developer.Apple.com/library/ios/documentation/UserExperience)で学んだことに基づいて、簡単な解決策になりました。 /Conceptual/AutolayoutPG/ImplementingView/ImplementingView.html )
UIButton
をサブクラス化し、2つの関数をオーバーライドしました。
- (void)setBounds:(CGRect)bounds {
if (!CGRectEqualToRect(bounds, self.bounds)) {
[self invalidateIntrinsicContentSize];
}
[super setBounds:bounds];
}
- (CGSize)intrinsicContentSize {
//
CGSize size;
self.titleLabel.frame = CGRectMake(self.titleLabel.frame.Origin.x,
self.titleLabel.frame.Origin.y,
self.frame.size.width - self.contentEdgeInsets.left - self.contentEdgeInsets.right - self.titleEdgeInsets.left - self.titleEdgeInsets.right,
0);
size = [self.titleLabel sizeThatFits:self.titleLabel.frame.size];
size = CGSizeMake(size.width, size.height + 20);
return size;
}
ここで基本的に行われるのは、ボタンがその固有のサイズを無効にすることです(境界セットが実際に新しい場合のみ-これは無限ループを防ぐためです)、システムが固有のコンテンツサイズを要求すると、幅に基づいて再計算しますボタンの。余分な20pxの高さはパディング用です。他の多くの方法を試しましたが、レイアウトはすべてAutoLayoutに基づいているため、デバイスが回転するたびに更新する必要がないものが必要でした。これは単純に機能します。
幸運を! Z。