224

自動レイアウトを使用して配置された UIButton がある場合、そのサイズはコンテンツに合わせて適切に調整されます。

画像を に設定するbutton.imageと、固有のサイズがこれを説明しているように見えます。

ただし、titleEdgeInsetsボタンの を微調整すると、レイアウトはこれを考慮せず、代わりにボタンのタイトルを切り捨てます。

ボタンの固有の幅がインセットを占めていることを確認するにはどうすればよいですか?

ここに画像の説明を入力

編集:

私は以下を使用しています:

[self.backButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 5, 0, 0)];

目標は、画像とテキストの間にある程度の分離を追加することです。

4

11 に答える 11

232

負と正のタイトルとコンテンツ インセットを組み合わせて使用​​することで、(コードを記述せずに) Interface Builder でこれを機能させることができます。

ここに画像の説明を入力

更新: Xcode 7 には、インセット フィールドに負の値を入力できないというバグがありますが、そのRight横にあるステッパー コントロールを使用して値を減らすことができます。(ありがとうスチュアート)

これを行うと、画像とタイトルの間に 8pt のスペースが追加され、ボタンの固有の幅が同じ量だけ増加します。このような:

ここに画像の説明を入力

于 2015-02-02T22:12:17.513 に答える
202

メソッドをオーバーライドしたり、任意の幅の制約を設定したりすることなく、これを解決できます。次のように、Interface Builder ですべて実行できます。

  • 本質的なボタンの幅は、タイトルの幅、アイコンの幅、および左右のコンテンツエッジのインセットから算出されます。

  • ボタンに画像とテキストの両方がある場合、それらはグループとして中央に配置され、間にパディングはありません。

  • 左のコンテンツ インセットを追加すると、テキスト + アイコンではなく、テキストに対して相対的に計算されます。

  • 負の左イメージ インセットを設定すると、イメージは左に引き出されますが、ボタン全体の幅には影響しません。

  • 負の左イメージ インセットを設定すると、実際のレイアウトではその値の半分が使用されます。したがって、-20 ポイントの左インセットを取得するには、Interface Builder で -40 ポイントの左インセット値を使用する必要があります。

したがって、目的の左インセットと、アイコンとテキストの間の内側のパディングの両方のためのスペースを作成するのに十分な大きさの左コンテンツ インセットを提供し、アイコンとテキストの間に必要なパディングの量を 2 倍にして、アイコンを左にシフトします。その結果、左右のコンテンツのインセットが等しく、テキストとアイコンのペアがグループとして中央に配置され、その間に特定の量のパディングがあるボタンが作成されます。

値の例:

// Produces a button with the layout:
// |-20-icon-10-text-20-|
// AutoLayout intrinsic width works as you'd desire.
button.contentEdgeInsets = UIEdgeInsetsMake(10, 30, 10, 20)
button.imageEdgeInsets = UIEdgeInsetsMake(0, -20, 0, 0)
于 2016-05-13T20:32:03.357 に答える
101

intrinsicContentSizeUIView でメソッドをオーバーライドしないのはなぜですか? 例えば:

- (CGSize) intrinsicContentSize
{
    CGSize s = [super intrinsicContentSize];

    return CGSizeMake(s.width + self.titleEdgeInsets.left + self.titleEdgeInsets.right,
                      s.height + self.titleEdgeInsets.top + self.titleEdgeInsets.bottom);
}

これにより、ボタンのサイズを大きくしてインセットを許可し、テキスト全体を表示する必要があることを自動レイアウト システムに伝える必要があります。私は自分のコンピューターにいないので、これをテストしていません。

于 2013-07-23T09:26:41.120 に答える
94

インセットの設定方法を指定していないため、同じ効果が得られるため、 titleEdgeInsets を使用していると推測しています。代わりに contentEdgeInsets を使用すると、正しく機能します。

- (IBAction)ChangeTitle:(UIButton *)sender {
    self.button.contentEdgeInsets = UIEdgeInsetsMake(0,20,0,20);
    [self.button setTitle:@"Long Long Title" forState:UIControlStateNormal];
}
于 2013-07-23T03:06:26.503 に答える
25

そしてSwiftの場合、これが機能しました:

extension UIButton {
    override open var intrinsicContentSize: CGSize {
        let intrinsicContentSize = super.intrinsicContentSize

        let adjustedWidth = intrinsicContentSize.width + titleEdgeInsets.left + titleEdgeInsets.right
        let adjustedHeight = intrinsicContentSize.height + titleEdgeInsets.top + titleEdgeInsets.bottom

        return CGSize(width: adjustedWidth, height: adjustedHeight)
    }
}

ラブ・ユー・スウィフト

于 2015-03-05T17:53:31.757 に答える
7

上記のすべてがiOS 9+では機能しませんでした。私がしたことは次のとおりです。

  • 幅の制約を追加します (ボタンにテキストがない場合の最小幅。テキストが提供されている場合、ボタンは自動スケーリングされます)。
  • リレーションを「より大きいか等しい」に設定します

ここに画像の説明を入力

ボタンの周りに境界線を追加するには、次のメソッドを使用します。

button.contentEdgeInsets = UIEdgeInsetsMake(0,20,0,20);
于 2015-10-21T21:39:25.780 に答える
6

UIButton アイコンとラベルの間に 5pt のスペースを追加したかったのです。これが私がそれを達成した方法です:

UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeCustom];
// more button config etc
infoButton.contentEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 5);
infoButton.titleEdgeInsets = UIEdgeInsetsMake(0, 5, 0, -5);

contentEdgeInsets、titleEdgeInsets、および imageEdgeInsets が相互に関係する方法には、各インセットからのギブ アンド テイクが必要です。したがって、タイトルの左側にインセットを追加する場合は、右側に負のインセットを追加し、コンテンツの右側に (正のインセットを介して) スペースを追加する必要があります。

タイトル インセットのシフトに合わせて右のコンテンツ インセットを追加することで、テキストがボタンの境界の外に出ることはありません。

于 2015-05-19T07:36:46.953 に答える
3

このオプションは、インターフェイス ビルダーでも使用できます。挿入図を参照してください。左と右を3に設定しました。魅力のように機能します。

インターフェイス ビルダーのスクリーンショット

于 2014-11-26T15:12:31.563 に答える