Chciałbym umieścić ikonę po lewej stronie dwóch linii tekstu, tak aby między obrazem a początkiem tekstu było około 2-3 pikseli przestrzeni. Samo sterowanie jest wyrównane do środka w poziomie (ustawiane za pomocą Konstruktora interfejsów)
Przycisk przypominałby coś takiego:
| |
|[Image] Add To |
| Favorites |
Próbuję skonfigurować to z contentEdgeInset, imageEdgeInsets i titleEdgeInsets bezskutecznie. Rozumiem, że wartość ujemna rozszerza krawędź, podczas gdy wartość dodatnia zmniejsza ją, aby przesunąć ją bliżej środka.
Próbowałem:
[button setTitleEdgeInsets:UIEdgeInsetsMake(0, -image.size.width, 0, 0)];
[button setImageEdgeInsets:UIEdgeInsetsMake(0, button.titleLabel.bounds.size.width, 0, 0)];
ale to nie wyświetla go poprawnie. Poprawiałem wartości, ale przejście od powiedzmy -5 do -10 na lewej wartości wstawki nie wydaje się przesuwać jej w oczekiwany sposób. -10 przesuwa tekst do końca w lewo, więc spodziewałem się, że -5 przeskoczy go do połowy z lewej strony, ale tak nie jest.
Jaka jest logika wypustek? Nie znam umiejscowienia obrazu i powiązanej terminologii.
Użyłem tego pytania SO jako odniesienia, ale coś w moich wartościach jest niewłaściwe. UIButton: jak wyśrodkować obraz i tekst za pomocą imageEdgeInsets i titleEdgeInsets?
[UIButton setTitleColor:forState:]
, a nawet[UIButton setTitle:forState:]
.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
ititleEdgeInsets
działam:Dokumenty do
imageEdgeInsets
mają następujące części do powiedzenia: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ł, ztitleEdgeInsets
) 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:
Ale czekaj , mówisz, kiedy to robię, otrzymuję to:
O tak! Zapomniałem, doktorzy ostrzegali mnie przed tym. Mówią częściowo:
Ale jest właściwość, która może pomóc, i to jest
contentEdgeInsets
. Dokumenty do tego mówią częściowo:To brzmi dobrze. Ponownie poprawmy kategorię:
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:
źródło
intrinsicContentSize
bycia niepoprawnym, co jest bardzo ważne w tych dniach z automatycznym układem, odkąd oryginalna odpowiedź została zaakceptowana.spacing
stroną przycisku a obrazem i etykietą, dodaj do każdej z czterech wartości self.contentEdgeInsets, tak jak:self.contentEdgeInsets = UIEdgeInsetsMake(spacing, spacing + insetAmount, spacing, spacing + insetAmount);
W interfejsie Konstruktora. Wybierz przycisk UIB -> Inspektor atrybutów -> Krawędź = Tytuł i zmodyfikuj wstawki krawędzi
źródło
Także jeśli chcesz zrobić coś podobnego do
Potrzebujesz
1. Ustaw wyrównanie w poziomie i pionie dla przycisku do
Znajdź wszystkie wymagane wartości i ustaw
UIImageEdgeInsets
Umożliwi to ustawienie tytułu i obrazu na przycisku.
Należy również pamiętać o aktualizacji tego przy każdym przekaźniku
Szybki
źródło
Dzięki temu możesz uniknąć wielu problemów -
Spowoduje to automatyczne wyrównanie wszystkich treści do lewej (lub gdziekolwiek chcesz)
Swift 3:
źródło
W Xcode 8.0 możesz to po prostu zmienić
insets
rozmiar inspektora.Wybierz przycisk UIB -> Inspektor atrybutów -> przejdź do inspektora rozmiarów i zmodyfikuj wstawki treści, obrazu i tytułu.
A jeśli chcesz zmienić obraz po prawej stronie, możesz po prostu zmienić właściwość semantyczną na
Force Right-to-left
w Inspektorze atrybutów.źródło
Jestem również trochę spóźniony na tę imprezę, ale myślę, że mam coś przydatnego do dodania: o).
Utworzyłem
UIButton
podklasę, której celem jest wybranie, gdzie obraz przycisku ma układ, w pionie lub w poziomie.Oznacza to, że możesz zrobić tego rodzaju przyciski:
Oto szczegóły dotyczące tworzenia tych przycisków w mojej klasie:
Aby to zrobić, dodałem 2 atrybuty:
imageVerticalAlignment
iimageHorizontalAlignment
. Oczywiście, jeśli twój przycisk ma tylko obrazek lub tytuł ... w ogóle nie używaj tej klasy!Dodałem również atrybut o nazwie
imageToTitleSpacing
który pozwala dostosować przestrzeń między tytułem a obrazem.Ta klasa stara się być jak najlepiej kompatybilnym, jeśli chcesz używać
imageEdgeInsets
,titleEdgeInsets
icontentEdgeInsets
bezpośrednio lub w połączeniu z nowymi atrybutami układu.Jak wyjaśnia @ravron, staram się, aby krawędź zawartości przycisku była poprawna (jak widać z czerwonymi ramkami).
Możesz go również użyć w Konstruktorze interfejsów:
Oto kod ( gist ):
źródło
error: IB Designables: Failed to update auto layout status: The agent crashed
, gist.github.com/nebiros/ecf69ff9cb90568edde071386c6c4ddberror: IB Designables: Failed to update auto layout status: The agent crashed
ponieważinit(frame: CGRect)
nie został przesłonięty, dodam też@available
adnotację… możesz,diff -Naur
jeśli chcesz, ;-)Mały dodatek do odpowiedzi Riley Avron na zmiany ustawień regionalnych konta:
źródło
Swift 4.x
Zastosowanie :
źródło
Piszę kod poniżej. Działa dobrze w wersji produktu. Supprot Swift 4.2 +
źródło
Oto prosty przykład użycia imageEdgeInsets Spowoduje to, że przycisk 30x30 z obszarem możliwym do powiększenia o 10 pikseli dookoła (50x50)
źródło
Elegancki sposób w Swift 3 i lepiej zrozumieć:
źródło
Szybka wersja 4.2 rozwiązania byłaby następująca:
źródło