Jestem trochę spóźniony na tę imprezę, ale myślę, że mam coś przydatnego do dodania.
Odpowiedź Kekoa jest świetna, ale, jak wspomina RonLugge, może sprawić, że przycisk przestanie szanować sizeToFit
lub, co ważniejsze, może spowodować przycięcie przycisku, gdy jego rozmiar jest wewnętrzny. Yikes!
Najpierw jednak
Krótkie wyjaśnienie tego, w co wierzę imageEdgeInsets
i titleEdgeInsets
działam:
Dokumenty doimageEdgeInsets
mają następujące części do powiedzenia:
Ta właściwość służy do zmiany rozmiaru i położenia efektywnego prostokąta rysunkowego dla obrazu przycisku. Możesz określić inną wartość dla każdej z czterech wstawek (górny, lewy, dolny, prawy). Wartość dodatnia zmniejsza się lub wstawia tę krawędź - przesuwając ją bliżej środka przycisku. Wartość ujemna rozszerza lub wyrównuje tę krawędź.
Uważam, że ta dokumentacja została napisana z wyobrażeniem, że przycisk nie ma tytułu, tylko obraz. Takie myślenie jest o wiele bardziej sensowne i zachowuje się jak UIEdgeInsets
zwykle. Zasadniczo ramka obrazu (lub tytuł, z titleEdgeInsets
) jest przesuwana do wewnątrz w przypadku dodatnich wypustek i na zewnątrz w przypadku ujemnych wypustek.
Ok, i co?
Jadę tam! Oto, co masz domyślnie, ustawiając obraz i tytuł (ramka przycisku jest zielona, aby pokazać, gdzie się znajduje):
Jeśli chcesz wprowadzić odstępy między obrazem a tytułem, nie powodując zmiażdżenia żadnego z nich, musisz ustawić cztery różne wstawki, po dwa na każdym obrazie i tytule. Jest tak, ponieważ nie chcesz zmieniać rozmiarów ramek tych elementów, a jedynie ich pozycje. Kiedy zaczniesz myśleć w ten sposób, konieczna zmiana doskonałej kategorii Kekoa stanie się jasna:
@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
Ale czekaj , mówisz, kiedy to robię, otrzymuję to:
O tak! Zapomniałem, doktorzy ostrzegali mnie przed tym. Mówią częściowo:
Ta właściwość służy tylko do pozycjonowania obrazu podczas układu. Przycisk nie używa tej właściwości do określania intrinsicContentSize
i sizeThatFits:
.
Ale jest właściwość, która może pomóc, i to jest contentEdgeInsets
. Dokumenty do tego mówią częściowo:
Przycisk używa tej właściwości do określenia intrinsicContentSize
i sizeThatFits:
.
To brzmi dobrze. Ponownie poprawmy kategorię:
@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
A co dostajesz
Wygląda mi na zwycięzcę.
Pracujesz w Swift i nie chcesz w ogóle myśleć? Oto ostateczna wersja rozszerzenia w 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)
}
}