web-dev-qa-db-ja.com

UIButtonのサイズを変更して、画面より広くせずにテキストに合わせるにはどうすればよいですか?

UIButtonがあり、その中にあるテキストに合わせてサイズを変更したいと思います。幅は280に設定されていますが、テキストは次の行に折り返され、必要に応じてボタンの高さを拡張する必要があります。

改行をワードラップに設定してsizeToFitを試しましたが、ボタンが広くなるだけで、垂直にはなりません。

18
TigerCoding

私はそれを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;
2
TigerCoding

ボタンのテキストを次のように設定してください。

[myButton setTitle:@"my title" forState:UIControlStateNormal];

...および[myButton sizeToFit]は魅​​力のように機能するはずです。

33
Stephane JAIS

[button sizeToFit]私にはうまくいきませんでしたが、IBだけを使用する方法を見つけました(xcode 4.5):

  1. UIButtonをクリックします
  2. サイズインスペクターでドラッグcontent huggingから1(水平と垂直の両方)
  3. 引っ張る compression resistanceから1000(両方)
  4. uIButtonのconstraintsの下でWidthをクリックし、priorityを250に変更します
  5. 高さについても同じようにします
  6. UIButtoninsetを使用して、左/右/上/下のパディングを制御できます
7
marmor

特定の幅またはボックスに制限されたフォント測定のメソッドを含む NSStringへのUIKitの追加ドキュメント を確認することをお勧めしますサイズ。

ボタンのタイトルを設定すると、たとえばsizeWithFont:forWidth:lineBreakMode:メソッドを使用して文字列を測定し、に基づいてボタンのフレームを更新できます。返されたサイズ(おそらくエッジの周りにいくつかのパディングを可能にします)。

申し訳ありませんが、具体的な例はありません。

2
mrcrowl

私も同様の問題に直面しており、ボタンの幅が限られていて、与えるテキストの量に応じて、ボタンを垂直方向に拡大したいと考えていました。 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。

0
Zoltán