A UISegmentedControl
hat ein neues Erscheinungsbild in iOS 13 und vorhandener Code zum Ändern der Farben des segmentierten Steuerelements funktioniert nicht mehr wie bisher.
Vor iOS 13 konnten Sie das tintColor
und festlegen , das für den Rahmen um das segmentierte Steuerelement, die Linien zwischen den Segmenten und die Hintergrundfarbe des ausgewählten Segments verwendet wird. Anschließend können Sie die Farbe der Titel jedes Segments mithilfe des Attributs Vordergrundfarbe mit ändern titleTextAttributes
.
Unter iOS 13 tintColor
macht das nichts. Sie können die segmentierten Steuerelemente so einstellen backgroundColor
, dass die Gesamtfarbe des segmentierten Steuerelements geändert wird. Ich kann jedoch keine Möglichkeit finden, die Farbe zu ändern, die als Hintergrund für das ausgewählte Segment verwendet wird. Das Festlegen der Textattribute funktioniert weiterhin. Ich habe sogar versucht, die Hintergrundfarbe des Titels festzulegen, aber das wirkt sich nur auf den Hintergrund des Titels aus, nicht auf den Rest der Hintergrundfarbe des ausgewählten Segments.
Kurz gesagt, wie können Sie die Hintergrundfarbe des aktuell ausgewählten Segments eines UISegmentedControl
in iOS 13 ändern ? Gibt es eine geeignete Lösung mit öffentlichen APIs, bei der nicht in die private Unteransichtsstruktur gegraben werden muss?
In iOS 13 gibt es keine neuen Eigenschaften für UISegmentedControl
oder UIControl
und keine der Änderungen in UIView
ist relevant.
quelle
tintColor
der bereits in der Antwort behandelt wird.Ab Xcode 11 Beta 3
Siehe rmaddys Antwort
So erhalten Sie das Erscheinungsbild von iOS 12 zurück
Ich konnte die Farbe des ausgewählten Segments nicht tönen, hoffentlich wird es in einer kommenden Beta behoben.
Das Festlegen des Hintergrundbilds des ausgewählten Status funktioniert nicht, ohne das Hintergrundbild des normalen Status festzulegen (wodurch das gesamte iOS 13-Styling entfernt wird).
Aber ich konnte es wieder auf das iOS 12-Erscheinungsbild bringen (oder fast genug, ich konnte den Eckenradius nicht auf seine kleinere Größe zurücksetzen).
Es ist nicht ideal, aber ein hellweißes segmentiertes Steuerelement sieht in unserer App etwas fehl am Platz aus.
(Wusste nicht, dass
UIImage(color:)
es sich um eine Erweiterungsmethode in unserer Codebasis handelt. Der Code für die Implementierung befindet sich jedoch im Internet.)quelle
setTitleTextAttributes
, damit der Titel des ausgewählten Segments eine weiße Farbe hat?IOS 13 und Swift 5.0 (Xcode 11.0) Segmentsteuerung 100% funktionsfähig
quelle
Ich habe die Problemumgehung ausprobiert und sie funktioniert hervorragend für mich. Hier ist die Objective-C-Version:
quelle
CGRectMake(0.0f, 0.0f, 1.0f, 1.0f)
: Aus meinen Tests mit Xcode 11 Betarect
musste die gleiche Größe wie die Grenzen des segmentierten Steuerelements stammen.[[UISegmentedControl appearance] ensureiOS12Style]
erhalte ich eine Ausnahme. Irgendeine Idee, was los ist?Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSMethodSignature getArgumentTypeAtIndex:]: index (2) out of bounds [0, 1]'
Ab Xcode 11 Beta 3
Danke @rmaddy!
Ursprüngliche Antwort für Xcode 11 Beta und Beta 2
Mit Xcode 11.0 Beta scheint es eine Herausforderung zu sein, dies nach den Regeln zu tun, da grundsätzlich alle Hintergrundbilder für jeden Status selbst neu gezeichnet werden müssen, mit runden Ecken, Transparenz und
resizableImage(withCapInsets:)
. Zum Beispiel müssten Sie ein farbiges Bild erzeugen, ähnlich wie:Im Moment scheint es also viel einfacher zu sein, in die Unteransichten zu graben:
Diese Lösung wendet die Farbtonfarbe korrekt auf die Auswahl an, wie in:
quelle
setBackgroundImage
für.normal
Sie alle anderen Bilder (einschließlich anderer Staaten und setzen müssensetDividerImage
), wahrscheinlich mit einigenUIBezierPath
undresizableImage(withCapInsets:)
, was es zu komplex macht , wenn wir die iOS 13 Design wollen diesen Weg.selectedSegmentTintColor
Eigenschaft aufUISegmentedControl
.Schnelle Version von @Ilahi Charfeddine Antwort:
quelle
quelle
iOS13 UISegmentController
wie benutzt man:
quelle
XCODE 11.1 & iOS 13
Basierend auf der Antwort von @Jigar Darji, aber einer sichereren Implementierung.
Wir erstellen zunächst einen fehlerhaften Convenience-Initialisierer:
Dann erweitern wir UISegmentedControl:
quelle
Hier ist meine Sicht auf Jonathans Antwort für Xamarin.iOS (C #), aber mit Korrekturen für die Bildgröße. Wie bei Cœurs Kommentar zu Colin Blakes Antwort habe ich alle Bilder außer dem Teiler so groß wie das segmentierte Steuerelement gemacht. Der Teiler ist 1x Höhe des Segments.
quelle
Sie können die folgende Methode implementieren
Verwendungscode
quelle
Die obigen Antworten sind zwar großartig, aber die meisten von ihnen haben die falsche Textfarbe innerhalb des ausgewählten Segments. Ich habe eine
UISegmentedControl
Unterklasse erstellt, die Sie auf Geräten mit iOS 13 und vor iOS 13 verwenden können, und verwende die Eigenschaft tintColor wie auf Geräten vor iOS 13.Mithilfe der
tintColorDidChange
Methode stellen wir sicher, dass diestylize
Methode jedes Mal aufgerufen wird, wenn sich dietintColor
Eigenschaft in der Segmentansicht oder in einer der zugrunde liegenden Ansichten ändert. Dies ist das bevorzugte Verhalten unter iOS.Ergebnis:
quelle
Erweitern Sie die Antwort von Jonathan ein wenig, falls Sie keine runden Ecken wollen
quelle