W pewnym momencie mojej aplikacji mam wyróżnione UIButton
(na przykład, gdy użytkownik trzyma palec na przycisku) i muszę zmienić kolor tła, gdy przycisk jest podświetlony (więc gdy palec użytkownika jest nadal na przycisku) .
Próbowałem następujące:
_button.backgroundColor = [UIColor redColor];
Ale to nie działa. Kolor pozostaje taki sam. Próbowałem tego samego kodu, gdy przycisk nie jest podświetlony i działa dobrze. Próbowałem też zadzwonić -setNeedsDisplay
po zmianie koloru, to nie miało żadnego efektu.
Jak zmusić przycisk do zmiany koloru tła?
ios
objective-c
xcode
uibutton
MartinMoizard
źródło
źródło
Odpowiedzi:
Można zastąpić
UIButton
„ssetHighlighted
metody.Cel C
Swift 3.0 i Swift 4.1
źródło
backgroundColor = isHighlighted ? .lightGray : .white
Nie jestem pewien, czy ten rodzaj rozwiązuje to, czego szukasz, czy pasuje do ogólnego krajobrazu programistycznego, ale pierwszą rzeczą, którą spróbowałbym, byłaby zmiana koloru tła przycisku na zdarzeniu touchDown.
Opcja 1:
Potrzebne byłyby dwa zdarzenia do przechwycenia, UIControlEventTouchDown byłby potrzebny, gdy użytkownik naciśnie przycisk. UIControlEventTouchUpInside i UIControlEventTouchUpOutside będą dostępne po zwolnieniu przycisku, aby przywrócić go do normalnego stanu
Opcja 2:
Zwróć obraz wykonany z żądanego koloru podświetlenia. To może być także kategoria.
a następnie zmień podświetlony stan przycisku:
źródło
layer.cornerRadius
i idziesz z opcją # 2, musisz upewnić się, że jest ustawiona wartośćclipsToBounds
true, aby zaokrąglić również rogi obrazu.Nie ma potrzeby zastępowania
highlighted
jako obliczonej właściwości. Za pomocą obserwatora właściwości można wywołać zmianę koloru tła:Szybki 4
źródło
File>New>File>Cocoa Touch Class
i ustawiając ją nasubclass of UIButton
. Nazwij plik np.CustomButton
, Który stanie się zarówno nazwą pliku, jak i nazwą klasy. Wewnątrz tego pliku umieśćoverride var highlighted
kod pokazany powyżej. W ostatnim kroku ustaw UIButton w interfejsie Konstruktora, aby używał tejCustomButton
podklasy, przechodząc do strony Właściwość, na której jest napisane „Klasa niestandardowa” i ma rozwijane pole. Powie „UIButton” szarymi literami. Lista rozwijana powinna zawierać CustomButton. Wybierz to, a przycisk jest teraz podklasą.isHighlighted = false
gdzieś na początku (na przykład podczas inicjalizacji).Przydatne ogólne rozszerzenie w Swift:
Swift 3.0
źródło
W Swift możesz zastąpić akcesorium podświetlonej (lub wybranej) właściwości zamiast przesłonić metodę setHighlighted
źródło
highlighted
jest własnością na UIButton. Odpowiedź jest taka, że jest to właściwość UIControl, z której dziedziczy UIButton.Zastąp podświetloną zmienną. Dodanie
@IBInspectable
sprawia, że edytujesz podświetlony kolor tła w serii ujęć, który również jest fajny.źródło
bardziej kompaktowe rozwiązanie (na podstawie odpowiedzi @ aleksejs-mjaliks ):
Swift 3/4 + :
Swift 2:
Jeśli nie chcesz przesłonić, jest to zaktualizowana wersja odpowiedzi @ timur-bernikowich ( Swift 4.2 ):
źródło
Rozszerzenie UIButton ze składnią Swift 3+ :
Używaj go jak:
Oryginalna odpowiedź: https://stackoverflow.com/a/30604658/3659227
źródło
Oto podejście w Swift, wykorzystujące rozszerzenie UIButton, aby dodać IBInspectable, o nazwie highlightedBackgroundColor. Podobny do podklasy, bez wymagania podklasy.
Mam nadzieję, że to pomoże.
źródło
Możesz użyć tej kategorii, która dodaje metodę setBackgroundColor: forState:
https://github.com/damienromito/UIButton-setBackgroundColor-forState-
źródło
Moje najlepsze rozwiązanie dla Swift 3+ bez podklas.
Dzięki temu rozszerzeniu można łatwo zarządzać kolorami dla różnych stanów i automatycznie wyciszy Twój normalny kolor, w przypadku braku wyróżnionego koloru.
źródło
AKTUALIZACJA:
Użyj biblioteki UIButtonBackgroundColor Swift.
STARY:
Użyj pomocników poniżej, aby utworzyć obraz o wymiarach 1 x 1 x 1 piksel z kolorem wypełnienia w skali szarości:
lub kolor wypełnienia RGB:
Następnie użyj tego,
image
aby ustawić obraz tła przycisku:Pomocnicy
Uwaga:
ACU
jest prefiksem klasy mojej biblioteki statycznej Cocoa Touch o nazwie Acani Utilities, gdzie AC oznacza Acani, a U oznacza Utilities.źródło
Spróbuj tego !!!!
Dla zdarzenia TouchedDown ustaw jeden kolor, a dla TouchUpInside ustaw drugi.
źródło
- (IBAction)onButtonTouchDragOutside:(UIButton *)sender {
aby upewnić się, że kolor nie pozostanie włączony, gdy użytkownik przypadkowo wyciągnie palec z przycisku.Podklasuj przycisk UIB i dodaj właściwości, które można sprawdzić, dla wygodnego użycia (napisane w Swift 3.0):
źródło
Możesz podklasować UIButton i zrobić niezły forState.
colourButton.h
colourButton.m
Uwagi (To jest przykład, wiem, że są problemy i oto kilka)
Użyłem NSMutableDictionay do przechowywania UIColor dla każdego stanu, muszę zrobić nieprzyjemną konwersję tekstu dla klucza, ponieważ UIControlState nie jest ładną prostą int. Jeśli to tam możesz zainicjować tablicę z tyloma obiektami i użyć stanu jako indeksu.
Z tego powodu wielu ma trudności z np. Wybraniem i wyłączeniem przycisku, potrzeba nieco więcej logiki.
Kolejny problem polega na tym, że jeśli próbujesz ustawić wiele kolorów jednocześnie, nie próbowałem za pomocą przycisku, ale jeśli możesz to zrobić, może nie działać
Zakładam, że to StoryBoard, nie ma init, initWithFrame, więc dodaj je, jeśli ich potrzebujesz.
źródło
Swift 5 , dzięki @Maverick
źródło
Detale
Rozwiązanie
Stosowanie
źródło
Spróbuj tego, jeśli masz obraz:
lub sprawdź, czy
showsTouchWhenHighlighted
to ci wystarczy.źródło
Otworzyłem podklasę UIButton , STAButton , aby wypełnić lukę w funkcjonalnej luce . Dostępne na licencji MIT. Działa na iOS 7+ (nie testowałem ze starszymi wersjami iOS).
źródło
Aby rozwiązać ten problem, stworzyłem kategorię do obsługi
backgroundColor
stanów za pomocąUIButtons
:ButtonBackgroundColor-iOS
Możesz zainstalować kategorię jako kapsuła .
Łatwy w użyciu z Objective-C
Jeszcze łatwiejszy w użyciu dzięki Swift :
Polecam zaimportować kapsułę z:
Korzystanie z use_frameworks! w Podfile ułatwia korzystanie ze swoich strąków dzięki Szybkiemu i celowi-C.
WAŻNY
Napisałem też post na blogu z dodatkowymi informacjami.
źródło
źródło
Posługiwać się https://github.com/swordray/UIButtonSetBackgroundColorForState
Dodaj do Podfile przy użyciu CocoaPods
Szybki
Cel C
źródło
Spróbuj
tintColor
:źródło
NSLog(@"%@", _button);
?UIButtonTypeCustom
.Oto kod w Swift, aby wybrać stan przycisku:
Przykład:
źródło
Upuść go i możesz zacząć:
* Proerty można ustawić w IB, a jeśli nie zostanie ustawione podświetlone tło, tło nie zmieni się po naciśnięciu
źródło
Poniższe
UIIImage
rozszerzenie wygeneruje obiekt obrazu o określonym parametrze koloru.Przykładowe użycie przycisku można zastosować do obiektu przycisku jako:
źródło
proste jest użycie TYLKO tego rozszerzenia UIButton
i użyj tego
źródło
jeśli nie zastąpisz, po prostu ustaw dwa działania touchDown touchUpInside
źródło
Swift 3:
źródło
w Swift 5
Dla tych, którzy nie chcą używać kolorowego tła, aby pobić wybrany stan
Po prostu możesz pokonać problem za pomocą instrukcji #Selector i if, aby łatwo zmienić kolory UIButton dla każdego stanu
Na przykład:
źródło