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?

Odpowiedzi:


252

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


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


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];

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

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;
}

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!
}

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

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)!

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


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

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

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]

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];

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.