İOS 7 varsayılan mavi rengini program aracılığıyla nasıl alabilirim?


223

Uygulamamda özel öğeler oluşturuyorum ve yeni iOS'un görünümüne ve izlenimine uymak istiyorum. iOS 7 bize çok yaygın bir açık mavi renk, sistem düğmesi, parçalı kontrol vb.Dahil olmak üzere çeşitli öğeler için varsayılan renk veya renk tonunu tanıttı.

resim açıklamasını buraya girin

Ancak, renge programla kolayca nasıl erişebileceğimi bulamadım. Ben teslim UIColor belgeleri ve sınıfın kendisi mavi sistem renk için herhangi erişimci olacaksa görünmüyor.

Sorum şu: Bu renk için basit bir erişimci var mı? [UIColor ?]ya da onun gibi bir şey? Değilse, birisi o renk için kesin RGB değerlerini biliyor mu?

Yanıtlar:


252

Kullanarak self.view.tintColorbir görünüm denetleyicisinden veya self.tintColorbir mesafede UIViewalt sınıfı.


6
Sadece kullanabileceğinizi söyleyecektim UIView().tintColor, ama aslında kullanamazsınız. UIView hangi renk tonu renk setini alır emin değilim ...
Dan Rosenstark

1
@DanRosenstark Bence UIWindowya da belki kök görünümü orijinal sürümü vardır. Görünümler, renk tonlarını yanıtlayıcı zincirindeki daha yüksek görünümlerden devralır, ancak örneğinizde yeni görünümün denetimi yoktur.
Aaron Brager

2
self.view.tintColoriçeriden UIViewController.viewDidLoad()sağ maviyi verir.
Nicolas Miari

234

Öyle görünüyor [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0].

Renkler penceresini gösteren ekran görüntüsü


2
İlginç bir şekilde, sistemimdeki varsayılan mavi 0: 128: 255 (aynı aracı kullanarak) gibi görünüyor. Apple'ın son zamanlarda değiştirip değiştirmediğini merak ediyorum.
Joel H.26

@JoelH. Şu anda kullandığınız renk uzayını kontrol edin.
Richard J. Ross III

19
Bunu nasıl kullandığınız konusunda dikkatli olun, çünkü sonraki iOS sürümlerinde değişebilir.
Zev Eisenberg

7
Evet, potansiyel olarak değişebilecek herhangi bir değeri kodlamak için kesinlikle iyi bir fikir değildir. Özellikle gerçek değeri sorgulamak için bir API olduğunda.
Nicolas Miari

1
Hızlı sürümUIColor(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0)
Doug Amos

90

iOS 7 varsayılan mavi rengi 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
Ve onaltılık tercih ederseniz:0x007aff
Jason Moore

4
Bu çok ileri bir kanıt değildir - Apple varsayılan renk tonunu değiştirirse veya kullanıcıların varsayılan renk tonu rengini ayarlamasına izin verirse uygulamanız doğru rengi alamaz.
prewett

4
ve başka bir sistemde: # 007AFF
daleijn

3
Swift'te: let defaultTintColor = UIColor (kırmızı: 0.0, yeşil: 122/255, mavi: 1.0, alfa: 1)
Jervisbay

49

UIButton belgelerine göre:

İOS v7.0'da, UIView'in tüm alt sınıfları tintColor için davranışlarını temel sınıftan alır. Daha fazla bilgi için UIView düzeyindeki tintColor tartışmasına bakın.

Varsayılan değeri yakalamadan önce tintColor'u değiştirmediğinizi varsayarsak, şunları kullanabilirsiniz:

self.view.tintColor

Rengi yakalamanın en güvenli yolu gibi görünüyor.
Cliff Helsel

Bu benim için çalışıyor. Benim sharedApplication()bir yok keyWindowolantintColor
SimplGy

26

Varsayılan sistem renk tonu rengini elde etmek için basit bir yöntem:

+ (UIColor*)defaultSystemTintColor
{
   static UIColor* systemTintColor = nil;
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
      UIView* view = [[UIView alloc] init];
      systemTintColor = view.tintColor;
   });
   return systemTintColor;
}

ana iş parçacığı şeyler için bir kez sevk gerekmez. Nil yeterli olacaksa basit.
malhal

6
Neden yöntemin sadece ana evreden çağrıldığını varsayalım? Genel gider dispatch_onceoldukça düşüktür ve ortak durumda check-in tek.
Rick

@Rick UIKit API'leri arka plan iş parçacığı açısından güvenli olmadığından, ana iş parçacığının dışında çağrılmasına yine de izin verilmez.
Andrey Tarantsov

@AndreyTarantsov doğrudur, ama o olduğunu kullanmak güvenli UIColorbirden çok iş parçacığı üzerinde. dispatch_onceHerhangi bir iş parçacığında bu rengin güvenli bir şekilde alınmasını sağlayan bir şekilde sarılması . Ve yine, ek yük çok düşük.
Rick

3
@AndreyTarantsov hızlı bir testten iyi çalışıyor gibi görünüyor. UIVIew belgelerinden : "Uygulamanızın kullanıcı arayüzüne yönelik manipülasyonlar ana iş parçacığında gerçekleşmelidir. Bu nedenle, UIView sınıfının yöntemlerini her zaman uygulamanızın ana iş parçacığında çalışan koddan çağırmalısınız. Bu sadece kesin olmayabilir görüntüleme nesnesinin kendisini oluştururken gereklidir, ancak diğer tüm manipülasyonlar ana iş parçacığında gerçekleşmelidir. "
Rick


16

4 yönlü hızlı:

extension UIColor {
  static let system = UIView().tintColor!
}

UIKit Framework'ün varsayılan davranışı herhangi bir sonraki sürümde değiştirilecekse, uygulama kilitlenmesine neden olabileceğinden, zorla açmayı kullanmanızı kesinlikle önermem. Ayrıca bir UIView örneğinden renk tonu rengi almak, bu rengin bir sistem renk tonu rengi olduğunu garanti edemez.
Stanislau Baranouski

@StanislauBaranouski Bunu neden değiştirmeliler? Lütfen açıklayınız
Dmitry Kozlov

burada açıklamaya gerek yok, zorla paketlemeyi kullanmak sadece kötü bir uygulamadır, özellikle de kaçınabiliyorsanız.
Stanislau Baranouski

15

Bu uzantı size yerel sistem mavi rengi verir.

extension UIColor {

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

}

GÜNCELLEME

Lütfen yukarıda yazdıklarımı unutun, anladım - sistem mavisi de dahil olmak üzere, aradığımız önceden tanımlanmış sistem renkleriyle yerel bir uzantı var :

// 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 }
    ... 
}

Doğrudan kullanabilirsiniz:

myView.tintColor = .systemBlue

1
Bu, systemBlue'yu her istediğinde UIButton'u oluşturacaktır.Bu rengi bir kez başlatmak daha iyidir. Dahili uzantıda dahili kelimeyi kullanmak kullanıcı dostu değildir. Statik yerine sınıf kullanmak için aynıdır. Ve "Mavi" demek doğru değil, çünkü bu renk daha sonra macOS Mojave'de olduğu gibi değiştirilebilir. Yani static let system = UIView().tintColor!hala varyant daha iyidir.
Dmitry Kozlov

@DmitryKozlov haklısın, statik bellek performansını kullanmak daha iyi. Buna işaret ettiğiniz için teşekkürler. Ancak "mavi" olarak adlandırmak hala iOS 12'ye kadar çalışıyor ve macOS ile ilgili değil. MacOS için NSColor tipi ile uğraşmak zorundasınız.
Stanislau Baranouski

14

Bu kodu kullanarak rengi otomatik olarak alın:

static let DefaultButtonColor = UIButton(type: UIButtonType.System).titleColorForState(.Normal)!

10

UIWindow.tintColorBunu yapmak zorunda yöntem (siyah hala) iOS8 benim için çalışma değildi:

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

Bu bir mavi renkte görülen uygun mavi renk tonu verdi. UIBarButtonItem


Biraz kirli geliyor, ancak zamanla değişebilen bir bağlantı rengini kodlamaktan daha iyidir.
timgcarlson

7

İOS 7'den bir API var ve renk tonu rengini şu şekilde alabilirsiniz (ve ayarlayabilirsiniz):

self.view.tintColor

Veya CGColor'a ihtiyacınız varsa:

self.view.tintColor.CGColor

6

Çoğu durumda ihtiyacınız olan şey

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

veya hızlıca

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

1
self.view.tintColor daha olası
malhal

3

rengi ayarlarken rengi böyle ayarlayabilirsiniz

[UIColor colorWithRed:19/255.0 green:144/255.0 blue:255/255.0 alpha:1.0]

Neden /255.0her bir rgbdeğerle yazmak gerekiyor ?
Adil Malik

7
Çünkü mac'lardaki renkler 0.0 ile 1.0 arasındadır.
malhal

2

UIColor'a aşağıdaki şekilde bir kategori eklemek, ihtiyacınız olduğunda ve hatta kodunuzdaki tanımını değiştirdiğinizde kategoriyi size sunacaktır:

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

Kategoriyi kodunuza içe aktardıktan sonra rengi kullanarak şunları çağırabilirsiniz:

UIColor *myBlueColor = [UIColor iOSblueColor];

Lütfen nasıl yanıt vermeyeceğinizi daha iyi anlamak için bu stackoverflow.com/help/deleted-answers adresini okumaya çalışın . Yani: "Soruyu temel olarak cevaplamayan cevaplar": harici bir siteye bağlantıdan çok daha fazlası
Radim Köhler

Biz aldığım Ah nasıl blueüzere rediçinde+ (instancetype)iOS7redColor;
ta.speot.is
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.