Nie chcę używać widoku podrzędnego, jeśli mogę tego uniknąć. Chcę mieć UIButton
obraz tła, tekst i obraz w nim. Teraz, kiedy to robię, obraz znajduje się po lewej stronie tekstu. Obraz tła, tekst i obraz mają różne stany podświetlenia.
ios
user-interface
layout
uibutton
jasongregori
źródło
źródło
Odpowiedzi:
Mimo że niektóre z sugerowanych odpowiedzi są bardzo kreatywne i wyjątkowo sprytne, najprostsze rozwiązanie jest następujące:
Tak proste jak to. Jako bonus, obraz będzie po lewej stronie w lokalizacjach od prawej do lewej.
EDYCJA : ponieważ pytanie zostało zadane kilka razy, jest to iOS 9 + .
źródło
semanticContentAttribute
to tylko hack / obejście, a nie prawdziwe rozwiązanie.Najprostsze rozwiązanie:
iOS 10 i nowsze wersje, Swift:
Przed iOS 10 Swift / Obj-C:
źródło
button.ImageEdgeInsets = new UIEdgeInsets(0, -leftPadding, 0, leftPadding); button.ContentEdgeInsets = new UIEdgeInsets(0, 0, 0, leftPadding);
. To jest w Xamarin, ale powinno być łatwo przetłumaczone na Swift / Obj-C.Jest łatwiejszy sposób z Konstruktora interfejsów .
Wybierz UIButton i wybierz tę opcję w View Utilities> Semantic :
Otóż to! Ładnie i prosto!
Jeśli chcesz dostosować odstępy między obrazem a tytułem, możesz zmienić wstawkę obrazu tutaj:
Mam nadzieję, że to pomaga!
źródło
Podklasowanie UIButton jest całkowicie niepotrzebne. Zamiast tego możesz po prostu ustawić wysoką wartość lewej wstawki dla wstawek obrazu i małą prawą wstawkę dla tytułu. Coś takiego:
źródło
Daję Inspire48 kredyt na ten jeden. Opierając się na jego sugestiach i patrząc na inne pytanie, wpadłem na to. Podklasę UIButton i zastąp te metody.
źródło
buttonWithType
If you subclass UIButton, this method does not return an instance of your subclass. If you want to create an instance of a specific subclass, you must alloc/init the button directly
ibackgroundRectForBounds
podklasy, które zapewniają niestandardowe ozdoby w tle, mogą zastąpić tę metodę i zwrócić zmodyfikowany prostokąt obwiedni, aby zapobiec rysowaniu przycisku przez dowolną niestandardową treść. Żadne z nich nie wspomina o tych konkretnych metody, ale zakładam, że nie mają nic przeciwko podklasom.frame.origin.x = CGRectGetMaxX(contentRect) - CGRectGetWidth(frame) - self.imageEdgeInsets.right + self.imageEdgeInsets.left - frame.origin.x;
działa lepiej dlaUIControlContentHorizontalAlignmentCenter
innych i ...Po prostu zaktualizuj wstawki po zmianie tytułu. Musisz skompensować wstawkę równą i przeciwną wstawką po drugiej stronie.
źródło
[thebutton.titleLabel sizeToFit];
wcześniej. Szerokość może wynosić zero, jeśli nie uruchomiono układu. To samo dotyczy rozmiaru obrazu (wystarczy użyć UIImage.size zamiast imageView)titleWidth = [self.titleLabel sizeThatFits:CGSizeMake(CGFLOAT_MAX, self.bounds.size.height)].width;
(lub jeśli obawiasz się, że ramka przycisku nie została jeszcze ustalona, użyj również CGFLOAT_MAX dla wysokości) iimageWidth = self.currentImage.size.width;
layoutSubviews
w mojejUITableViewCell
podklasie, ale działa dobrze. Dzięki!Wszystkie te odpowiedzi od stycznia 2016 r. Są niepotrzebne. W Konstruktorze interfejsów ustaw View Semantic na
Force Right-to-Left
, lub jeśli wolisz programowo,semanticContentAttribute = .forceRightToLeft
spowoduje to, że obraz pojawi się po prawej stronie tekstu.źródło
UIBarButtonItem(customView: button)
, ale zadziała, jeśliW narzędziu do tworzenia interfejsów możesz skonfigurować opcje wstawek krawędzi dla UIButton, osobno dla każdej z trzech części: treści, obrazu, tytułu
Xcode 8:
źródło
Aktualizacja: Swift 3
Oryginalna odpowiedź dla Swift 2:
Rozwiązanie, które obsługuje wszystkie wyrównania w poziomie, z przykładem implementacji Swift. W razie potrzeby po prostu przetłumacz na Objective-C.
Warto również zauważyć, że radzi sobie całkiem dobrze z wypustkami obrazu i tytułu.
Inspirowany odpowiedzią jasongregori;)
źródło
@IBDesignable
do klasy i widzieć, jak jest odwracana w czasie projektowania.Jeśli trzeba to zrobić w UIBarButtonItem , należy zastosować dodatkowe zawijanie w widoku.
To zadziała
To nie zadziała
źródło
Oto rozwiązanie
UIButton
z zawartością wyrównaną do środka. Ten kod wyrównuje obraz do prawej i pozwala na użycieimageEdgeInsets
ititleEdgeInsets
cenne pozycjonowanie.Podklasuj
UIButton
swoją klasę niestandardową i dodaj:źródło
Ponieważ rozwiązanie przekształcające nie działa w iOS 11, postanowiłem napisać nowe podejście.
Dostosowanie przycisków
semanticContentAttribute
daje nam obraz ładnie po prawej stronie, bez konieczności przekazywania, jeśli tekst się zmieni. Z tego powodu jest to idealne rozwiązanie. Jednak nadal potrzebuję wsparcia RTL. Fakt, że aplikacja nie może zmienić kierunku układu w tej samej sesji, łatwo rozwiązuje ten problem.To powiedziawszy, jest całkiem proste.
źródło
Sposób przedłużenia
Używanie rozszerzenia do ustawienia obrazu po prawej stronie z niestandardowym przesunięciem
źródło
Szybko-rozwiń przycisk UiButton i umieść te linie
źródło
Opierając się na eleganckim rozwiązaniu Piotra Tomasika: jeśli chcesz mieć również trochę odstępu między etykietą przycisku a obrazem , to dodaj to do wypustek krawędzi w następujący sposób (kopiowanie tutaj mojego kodu, który działa idealnie dla mnie):
Dziękuję Piotrowi za twoje rozwiązanie!
Erik
źródło
Zrób sam. Xcode10, swift4,
Do programowania interfejsu użytkownika
do projektowania interfejsu StoryBoard
źródło
Podzakładanie i zastępowanie układu Podglądy to prawdopodobnie najlepsza droga.
Źródło: iPhone UIButton - pozycja obrazu
źródło
Wziąłem odpowiedź @ Piotra i przekształciłem ją w rozszerzenie Swift. Upewnij się, aby ustawić obraz i tytuł przed wywołaniem tego, aby przycisk miał odpowiedni rozmiar.
}
źródło
Szybka opcja, która robi to, co chcesz, bez zabawy z wstawkami:
źródło
Wymienione tutaj rozwiązania przestały działać, gdy włączyłem Auto Layout . Musiałem wymyślić własne:
Podklasa UIButton i
layoutSubviews
metoda przesłonięcia :Wynik:
źródło
swift 3.0 Rozwiązanie migracji podane przez jasongregori
źródło
Zdecydowałem, że nie będę używać standardowego widoku obrazu przycisku, ponieważ proponowane rozwiązania do przenoszenia go wydawały się nieprzyzwoite. To zapewniło mi pożądaną estetykę i intuicyjnie jest zmieniać położenie przycisku, zmieniając ograniczenia:
źródło
Swift 3:
źródło
Co z ograniczeniami? W przeciwieństwie do semanticContentAttribute, nie zmieniają semantyki. Może coś takiego:
lub w celu C:
Ostrzeżenia: nieprzetestowane, iOS 9+
źródło
Aby wyrównać obraz w UIButton, wypróbuj poniższy kod
źródło
Po wypróbowaniu wielu rozwiązań z Internetu nie osiągnąłem dokładnie tego wymagania. Skończyło się więc pisaniem niestandardowego kodu narzędzia. Publikowanie, aby pomóc komuś w przyszłości. Testowane na szybkim 4.2
źródło
w przypadku tego problemu możesz utworzyć UIView wewnątrz „etykiety z widokiem UIImage” i ustawić klasę UIView jako UIControl i utworzyć IBAction tak mocno na boku
źródło
Swift 4 i 5
Zmień kierunek obrazu UIButton (RTL i LTR)
źródło
Utility
?Xcode 11.4 Swift 5.2
Dla każdego, kto próbuje odzwierciedlić styl przycisku Wstecz za pomocą szewronu w ten sposób:
Realizacja:
źródło
Skończyło się na utworzeniu niestandardowego przycisku, który pozwala ustawić obraz z Inspektora. Poniżej mój kod:
Możesz dopasować wartość wypełnienia odstępu z poziomu Inspektora, aby dostosować odstępy między tekstem a obrazem.
PS: Użyłem fragmentu kodu z odpowiedzi @Mark Hennings
źródło