Jak mogę programowo uzyskać domyślny niebieski kolor dla iOS 7?

223

Tworzę niestandardowe elementy w mojej aplikacji i chcę dopasować wygląd i styl nowego iOS. iOS 7 wprowadził do nas bardzo powszechny jaśniejszy niebieski kolor, domyślny kolor lub odcień dla kilku elementów, w tym przycisku systemowego, sterowania segmentowego itp. Ułatwili wybranie koloru za pomocą IB, jak pokazano tutaj:

wprowadź opis zdjęcia tutaj

Jednak nie znalazłem sposobu, aby łatwo uzyskać programowy dostęp do koloru. Sprawdziłem dokumentację UIColor i wydaje się, że nie ma żadnego akcesorium dla niebieskiego koloru systemowego w samej klasie.

Oto moje pytanie: czy istnieje prosty akcesorium dla tego koloru? [UIColor ?]czy coś takiego? Jeśli nie, to czy ktoś zna dokładne wartości RGB dla tego koloru?

Joel H.
źródło

Odpowiedzi:

252

Użyj self.view.tintColorz kontrolera widoku lub self.tintColorz UIViewpodklasy.

Aaron Brager
źródło
6
Chciałem powiedzieć, że możesz po prostu użyć UIView().tintColor, ale w rzeczywistości nie możesz. Nie jestem pewien, w którym momencie UIView otrzymuje zestaw kolorów odcieni ...
Dan Rosenstark
1
@DanRosenstark Myślę, że UIWindowlub może jego widok główny ma oryginalną wersję. Widoki dziedziczą kolor zabarwienia po wyższych widokach w łańcuchu respondentów, ale w twoim przykładzie nowy widok nie ma podglądu.
Aaron Brager
2
self.view.tintColorod wewnątrz UIViewController.viewDidLoad()daje prawy niebieski.
Nicolas Miari
234

Wygląda na to, że tak [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0].

zrzut ekranu pokazujący okno kolorów

Greg
źródło
2
Co ciekawe, domyślnym niebieskim kolorem w moim systemie jest 0: 128: 255 (przy użyciu tego samego narzędzia). Zastanawiam się, czy Apple ostatnio to zmieniło?
Joel H.
@JoelH. Sprawdź aktualnie używaną przestrzeń kolorów.
Richard J. Ross III
19
Zachowaj ostrożność podczas korzystania z tego, ponieważ może się to zmienić w kolejnych wersjach iOS.
Zev Eisenberg,
7
Tak, zdecydowanie nie jest dobrym pomysłem na sztywne kodowanie wartości, które mogą potencjalnie ulec zmianie. Zwłaszcza, gdy istnieje interfejs API do zapytania o rzeczywistą wartość.
Nicolas Miari
1
Wersja UIColor(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0)
szybka
90

Domyślnym niebieskim kolorem iOS 7 jest R:0.0 G:122.0 B:255.0

UIColor *ios7BlueColor = [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0];
tarum
źródło
51
A jeśli wolisz hex:0x007aff
Jason Moore
4
Nie jest to bardzo przyszłościowy dowód - jeśli Apple zmieni domyślny kolor odcienia lub pozwoli użytkownikom ustawić domyślny kolor odcienia, aplikacja nie uzyska prawidłowego koloru.
prewett
4
oraz w innym systemie: # 007AFF
daleijn
3
W trybie Swift: let defaultTintColor = UIColor (czerwony: 0,0, zielony: 122/255, niebieski: 1,0, alfa: 1)
Jervisbay
49

Zgodnie z dokumentacją dla UIButton:

W iOS 7.0, wszystkie podklasy UIView wywodzą swoje zachowanie dla tintColor z klasy podstawowej. Więcej informacji można znaleźć w dyskusji o tintColor na poziomie UIView.

Zakładając, że nie zmienisz tintColor przed pobraniem wartości domyślnej, możesz użyć:

self.view.tintColor
Scott Carter
źródło
Wygląda na najbezpieczniejszy sposób na uchwycenie koloru.
Cliff Helsel,
To działa dla mnie. Mój sharedApplication()nie ma keyWindowztintColor
SimplGy
26

Oto prosta metoda uzyskania domyślnego koloru odcienia systemu:

+ (UIColor*)defaultSystemTintColor
{
   static UIColor* systemTintColor = nil;
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
      UIView* view = [[UIView alloc] init];
      systemTintColor = view.tintColor;
   });
   return systemTintColor;
}
Stóg
źródło
nie potrzebujesz jednorazowej wysyłki w przypadku głównych wątków. Proste, jeśli zero wystarczy.
malhal
6
Po co zakładać, że metoda będzie wywoływana tylko z głównego wątku? Narzut na dispatch_oncejest dość niski i jest pojedynczy, jeśli sprawdza się w zwykłym przypadku.
Rick,
@Rick Ponieważ interfejsy API UIKit nie są bezpieczne dla wątków w tle, więc i tak wywoływanie go poza głównym wątkiem jest niedozwolone.
Andrey Tarantsov
@AndreyTarantsov to prawda, ale można bezpiecznie używać jej UIColorw wielu wątkach. Zawinięcie go w dispatch_oncepozwala na bezpieczne odzyskanie tego koloru na dowolnym wątku. Ponownie, koszty ogólne są bardzo niskie.
Rick
3
@AndreyTarantsov z szybkiego testu wydaje się działać dobrze. Z dokumentacji UIVIew : „Manipulacje interfejsem użytkownika aplikacji muszą wystąpić w głównym wątku. Dlatego zawsze należy wywoływać metody klasy UIView z kodu działającego w głównym wątku aplikacji. Jedyny raz może to nie być ściśle konieczne jest tworzenie samego obiektu widoku, ale wszystkie inne manipulacje powinny odbywać się w głównym wątku. ”
Rick
16

swift 4 way:

extension UIColor {
  static let system = UIView().tintColor!
}
Dmitrij Kozłow
źródło
Zdecydowanie nie polecam używania wymuszonego rozpakowywania, ponieważ może to spowodować awarię aplikacji, jeśli domyślne zachowanie UIKit Framework zostanie zmienione w dowolnej następnej wersji. Również uzyskanie koloru odcienia z instancji UIView nie mogło zagwarantować, że ten kolor jest systemowym kolorem odcienia.
Stanislau Baranouski,
@StanislauBaranouski Dlaczego powinni to zmienić? Proszę wyjaśnić swój punkt
Dmitrij Kozłow
nie trzeba tutaj wyjaśniać, to po prostu zła praktyka używania wymuszonego rozpakowywania, szczególnie jeśli możesz tego uniknąć.
Stanislau Baranouski
15

To rozszerzenie zapewnia systemowy kolor niebieski.

extension UIColor {

    static var systemBlue: UIColor {
        return UIButton(type: .system).tintColor
    }

}

AKTUALIZACJA

Proszę zapomnieć o tym, co napisałem powyżej, właśnie się zorientowałem - istnieje natywne rozszerzenie ze wstępnie zdefiniowanymi kolorami systemowymi, których szukaliśmy, w tym niebieski system :

// System colors

extension UIColor {


    /* Some colors that are used by system elements and applications.
     * These return named colors whose values may vary between different contexts and releases.
     * Do not make assumptions about the color spaces or actual colors used.
     */

    ... 

    @available(iOS 7.0, *)
    open class var systemBlue: UIColor { get }
    ... 
}

Możesz użyć go bezpośrednio:

myView.tintColor = .systemBlue
Stanislau Baranouski
źródło
1
Ten utworzy UIButton za każdym razem, gdy poprosisz o systemBlue, lepiej jest raz zainicjować ten kolor. Używanie wewnętrznego słowa w wewnętrznym rozszerzeniu nie jest przyjazne dla użytkownika. To samo dotyczy używania klasy zamiast statycznej. A nazywanie go „Niebieskim” jest niewłaściwe, ponieważ ten kolor można później zmienić, jak w macOS Mojave. static let system = UIView().tintColor!Jest więc znacznie lepszy niż twój wariant.
Dmitry Kozlov
@DmitryKozlov masz rację, lepiej użyć statycznej wydajności pamięci. Dzięki za wskazanie na to. Ale nazywanie go „niebieskim” nadal działa w systemie iOS 12 i wcale nie jest związane z systemem macOS. W systemie macOS musisz radzić sobie z typem NSColor.
Stanislau Baranouski,
14

Uzyskaj kolor automatycznie, korzystając z tego kodu:

static let DefaultButtonColor = UIButton(type: UIButtonType.System).titleColorForState(.Normal)!
Łukasz Czerwiński
źródło
10

Ta UIWindow.tintColormetoda nie działała dla mnie w iOS8 (nadal była czarna), więc musiałem to zrobić:

let b = UIButton.buttonWithType(UIButtonType.System) as UIButton
var color = b.titleColorForState(.Normal)

To dało właściwy niebieski odcień widoczny w UIBarButtonItem

cscott530
źródło
Czuje się trochę brudny, ale lepiej niż zakodować na stałe kolor linku, który może się zmieniać z czasem.
timgcarlson
7

Z iOS 7 istnieje interfejs API i możesz uzyskać (i ustawić) kolor odcienia za pomocą:

self.view.tintColor

Lub jeśli potrzebujesz CGColor:

self.view.tintColor.CGColor
Codecraft Studio
źródło
6

W wielu przypadkach potrzebujesz tylko tego

[self tintColor] 
// or if in a ViewController
[self.view tintColor]

lub dla szybkiego

self.tintColor
// or if in a ViewController
self.view.tintColor
Ali
źródło
1
self.view.tintColor bardziej prawdopodobne
malhal
3

ustawiając kolor, możesz ustawić taki kolor

[UIColor colorWithRed:19/255.0 green:144/255.0 blue:255/255.0 alpha:1.0]
Anurag Soni
źródło
Dlaczego trzeba pisać /255.0z każdą rgbwartością?
Adil Malik
7
Ponieważ kolory na komputerach Mac są zmienne od 0,0 do 1,0.
malhal
2

Dodanie kategorii do UIColor w następujący sposób sprawi, że będzie ona dostępna zawsze, gdy będziesz jej potrzebować, a nawet zmieni jej definicję w całym kodzie:

@interface UIColor (iOS7Colors)

+ (instancetype)iOS7blueColor;

@end

@implementation UIColor (SpecialColors)

+ (instancetype)iOS7blueColor;
{
    return [UIColor colorWithRed:0.0f green:0.22f blue:122.0/255.0 alpha:1.0f];
}

Po zaimportowaniu kategorii do kodu możesz wywołać kolor, używając:

UIColor *myBlueColor = [UIColor iOSblueColor];
Renaud Boisjoly
źródło
Spróbuj przeczytać ten stackoverflow.com/help/deleted-answers , aby lepiej zrozumieć, jak nie odpowiadać. Mianowicie: „Odpowiedzi, które zasadniczo nie odpowiadają na pytanie”: niewiele więcej niż link do strony zewnętrznej
Radim Köhler,
Uh Skąd otrzymujemy od bluedo redw+ (instancetype)iOS7redColor;
ta.speot.is