A UISegmentedControl
ma nowy wygląd w iOS 13, a istniejący kod zmieniający kolory segmentowanej kontrolki nie działa już tak, jak działał.
Przed iOS 13 można było ustawić tintColor
i, które będzie używane do obramowania wokół podzielonej na segmenty kontrolki, linii między segmentami i koloru tła wybranego segmentu. Następnie możesz zmienić kolor tytułów każdego segmentu, używając atrybutu koloru pierwszego planu z titleTextAttributes
.
W iOS 13 tintColor
nic nie robi. Możesz ustawić podzieloną na segmenty kontrolkę, backgroundColor
aby zmienić ogólny kolor podzielonej na segmenty kontrolki. Ale nie mogę znaleźć żadnego sposobu na zmianę koloru używanego jako tło wybranego segmentu. Ustawianie atrybutów tekstu nadal działa. Próbowałem nawet ustawić kolor tła tytułu, ale wpływa to tylko na tło tytułu, a nie na pozostałą część koloru tła wybranego segmentu.
Krótko mówiąc, jak zmodyfikować kolor tła aktualnie wybranego segmentu UISegmentedControl
w iOS 13? Czy istnieje odpowiednie rozwiązanie, wykorzystujące publiczne API, które nie wymaga zagłębiania się w strukturę prywatnego podglądu?
W iOS 13 nie ma nowych właściwości dla UISegmentedControl
lub UIControl
i żadne zmiany w programie nie UIView
są istotne.
źródło
tintColor
którym jest już objęty odpowiedzią.Od Xcode 11 beta 3
Zobacz odpowiedź rmaddy
Aby przywrócić wygląd iOS 12
Nie udało mi się zabarwić koloru wybranego segmentu, mam nadzieję, że zostanie to naprawione w nadchodzącej wersji beta.
Ustawienie obrazu tła wybranego stanu nie działa bez ustawienia obrazu tła stanu normalnego (co usuwa wszystkie style iOS 13)
Ale udało mi się przywrócić wygląd iOS 12 (lub wystarczająco blisko, nie byłem w stanie przywrócić promienia narożnika do mniejszego rozmiaru).
Nie jest to idealne rozwiązanie, ale jasnobiały, segmentowy element sterujący wygląda nieco nie na miejscu w naszej aplikacji.
(Nie zdawałem sobie sprawy, że
UIImage(color:)
jest to metoda rozszerzająca w naszej bazie kodu. Ale kod do jej zaimplementowania znajduje się w Internecie)źródło
setTitleTextAttributes
aby tytuł wybranego segmentu miał biały kolor?IOS 13 i Swift 5.0 (Xcode 11.0) Kontrola segmentów w 100% działa
źródło
Wypróbowałem to obejście i działa świetnie. Oto wersja Objective-C:
źródło
CGRectMake(0.0f, 0.0f, 1.0f, 1.0f)
: z moich testów z Xcode 11 beta,rect
musiał być tego samego rozmiaru, co granice segmentowanej kontroli.[[UISegmentedControl appearance] ensureiOS12Style]
, pojawia się wyjątek. Masz jakiś pomysł, co się dzieje?Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSMethodSignature getArgumentTypeAtIndex:]: index (2) out of bounds [0, 1]'
Od Xcode 11 beta 3
Dziękuję @rmaddy!
Oryginalna odpowiedź dla Xcode 11 beta i beta 2
W przypadku Xcode 11.0 beta wydaje się wyzwaniem zrobienie tego zgodnie z zasadami, ponieważ zasadniczo wymaga to samodzielnego przerysowania wszystkich obrazów tła dla każdego stanu, z zaokrąglonymi rogami, przezroczystością i
resizableImage(withCapInsets:)
. Na przykład musiałbyś wygenerować kolorowy obraz podobny do:Na razie więc zagłębianie się w subviews wydaje się znacznie łatwiejsze:
To rozwiązanie poprawnie zastosuje kolor odcienia do zaznaczenia, jak w:
źródło
setBackgroundImage
za.normal
to musisz ustawić wszystkie inne obrazy (w tym inne stany isetDividerImage
), prawdopodobnie z niektórymiUIBezierPath
iresizableImage(withCapInsets:)
, co sprawia, że jest to zbyt skomplikowane, jeśli chcemy projekt iOS 13 tą drogą.selectedSegmentTintColor
nieruchomość jest włączonaUISegmentedControl
.Szybka wersja odpowiedzi @Ilahi Charfeddine:
źródło
źródło
iOS13 UISegmentController
jak używać:
źródło
XCODE 11.1 i iOS 13
Na podstawie odpowiedzi @Jigar Darji, ale bezpieczniejsza implementacja.
Najpierw tworzymy dostępny inicjalizator wygody:
Następnie rozszerzamy UISegmentedControl:
źródło
Oto moje podejście do odpowiedzi Jonathana dla platformy Xamarin.iOS (C #), ale z poprawkami dotyczącymi rozmiaru obrazu. Podobnie jak w przypadku komentarza Cœura na temat odpowiedzi Colina Blake'a, wykonałem wszystkie obrazy poza dzielnikiem wielkości segmentowanej kontrolki. Dzielnik to 1x wysokość segmentu.
źródło
Możesz zaimplementować następującą metodę
Kod użytkowania
źródło
Chociaż powyższe odpowiedzi są świetne, większość z nich ma nieprawidłowy kolor tekstu w wybranym segmencie. Utworzyłem
UISegmentedControl
podklasę, której można używać na urządzeniach z systemem iOS 13 i starszym niż iOS 13 i używać właściwości tintColor tak, jak na urządzeniach z systemem starszym niż iOS 13.Korzystając z
tintColorDidChange
metody, zapewniamy, żestylize
metoda zostanie wywołana za każdym razemtintColor
właściwość zmieni się w widoku segmentu lub w dowolnym z widoków bazowych, co jest preferowanym zachowaniem w systemie iOS.Wynik:
źródło
Rozwiń trochę odpowiedź Jonathana na wypadek, gdybyś nie chciał zaokrąglać rogów
źródło