私はこのパーティーに少し遅れましたが、何か付け加えることがあると思います。
Kekoaの答えはすばらしいですが、RonLuggeが言及しているように、ボタンを尊重しなくなっsizeToFit
たり、さらに重要なことに、ボタンのサイズが本来のサイズの場合にボタンがコンテンツをクリップする可能性があります。うわぁ!
最初に、しかし、
私がどのように信じimageEdgeInsets
てtitleEdgeInsets
働くかについての簡単な説明:
のドキュメントにimageEdgeInsets
は、一部、次のように述べられています。
このプロパティを使用して、ボタン画像の効果的な描画長方形のサイズと位置を変更します。4つのインセット(上、左、下、右)のそれぞれに異なる値を指定できます。正の値を指定すると、そのエッジが縮小または挿入され、ボタンの中心に近づきます。負の値は、そのエッジを拡張またはアウトセットします。
このドキュメントは、ボタンにタイトルがなく、画像のみであることを想定して書かれたと思います。この方法を考えると、もっと理にかなっていて、UIEdgeInsets
通常の動作をします。基本的に、画像のフレーム(またはの付いたタイトルtitleEdgeInsets
)は、正のインセットの場合は内側に、負のインセットの場合は外側に移動します。
じゃあ何?
そろそろ!画像とタイトルを設定するデフォルトの設定は次のとおりです(ボタンの境界線は、それがどこにあるかを示すために緑色になっています)。
画像とタイトルの間にスペースを入れたい場合、どちらも押しつぶさないようにするには、画像とタイトルのそれぞれに2つずつ、4つの異なるインセットを設定する必要があります。これは、これらの要素のフレームのサイズを変更するのではなく、位置だけを変更したいためです。このように考え始めると、Kekoaの優れたカテゴリに必要な変更が明らかになります。
@implementation UIButton(ImageTitleCentering)
- (void)centerButtonAndImageWithSpacing:(CGFloat)spacing {
CGFloat insetAmount = spacing / 2.0;
self.imageEdgeInsets = UIEdgeInsetsMake(0, -insetAmount, 0, insetAmount);
self.titleEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, -insetAmount);
}
@end
しかし、待ってください、私がそれをするとき、私はこれを得ます:
そうそう!私は忘れていました、ドキュメントはこれについて警告しました。彼らは部分的に言っています:
このプロパティは、レイアウト中に画像を配置するためにのみ使用されます。ボタンは、このプロパティを使用してintrinsicContentSize
およびを決定しませんsizeThatFits:
。
しかし、助けることができるプロパティがあり、それはcontentEdgeInsets
です。そのためのドキュメントは、部分的に言っています:
ボタンは、このプロパティを使用してintrinsicContentSize
およびを決定しsizeThatFits:
ます。
いいですね。したがって、もう一度カテゴリを微調整しましょう。
@implementation UIButton(ImageTitleCentering)
- (void)centerButtonAndImageWithSpacing:(CGFloat)spacing {
CGFloat insetAmount = spacing / 2.0;
self.imageEdgeInsets = UIEdgeInsetsMake(0, -insetAmount, 0, insetAmount);
self.titleEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, -insetAmount);
self.contentEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, insetAmount);
}
@end
そして、あなたは何を得るのですか?
私には勝者のように見えます。
Swiftで作業していて、何も考えたくないですか?Swiftの拡張機能の最終バージョンは次のとおりです。
extension UIButton {
func centerTextAndImage(spacing: CGFloat) {
let insetAmount = spacing / 2
imageEdgeInsets = UIEdgeInsets(top: 0, left: -insetAmount, bottom: 0, right: insetAmount)
titleEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount, bottom: 0, right: -insetAmount)
contentEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount, bottom: 0, right: insetAmount)
}
}