Bagaimana saya bisa mendapatkan warna biru default iOS 7 secara terprogram?

223

Saya membuat elemen khusus di aplikasi saya dan ingin mencocokkan tampilan dan nuansa iOS baru. iOS 7 memperkenalkan kepada kami warna biru terang yang sangat umum, warna default atau warna untuk beberapa elemen, termasuk tombol sistem, kontrol tersegmentasi, dll. Mereka telah membuatnya mudah untuk memilih warna menggunakan IB, seperti terlihat di sini:

masukkan deskripsi gambar di sini

Namun, saya belum menemukan cara mengakses warna dengan mudah secara terprogram. Saya memeriksa dokumentasi UIColor , dan sepertinya tidak ada accessor untuk warna sistem biru di kelas itu sendiri.

Inilah pertanyaan saya: apakah ada pengakses sederhana untuk warna ini? [UIColor ?]atau semacamnya? Jika tidak, apakah seseorang tahu nilai RGB yang tepat untuk warna itu?

Joel H.
sumber

Jawaban:

252

Gunakan self.view.tintColordari pengontrol tampilan, atau self.tintColordari UIViewsubkelas.

Aaron Brager
sumber
6
Saya akan mengatakan bahwa Anda hanya dapat menggunakan UIView().tintColor, tetapi sebenarnya Anda tidak bisa. Tidak yakin pada titik mana UIView mendapatkan set warna warna ...
Dan Rosenstark
1
@DanRosenstark Saya pikir UIWindowatau mungkin tampilan root-nya memiliki versi asli. Tampilan mewarisi warna warna mereka dari tampilan yang lebih tinggi di rantai responden, tetapi dalam contoh Anda tampilan baru tidak memiliki superview.
Aaron Brager
2
self.view.tintColordari dalam UIViewController.viewDidLoad()memberi biru kanan.
Nicolas Miari
234

Tampaknya begitu [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0].

tangkapan layar yang menunjukkan jendela Warna

Greg
sumber
2
Menariknya, biru default pada sistem saya tampaknya 0: 128: 255 (menggunakan alat yang sama). Saya ingin tahu apakah Apple mengubahnya baru-baru ini?
Joel H.
@ JoelH. Periksa ruang warna yang saat ini Anda gunakan.
Richard J. Ross III
19
Berhati-hatilah dalam penggunaannya, karena dapat berubah pada rilis iOS berikutnya.
Zev Eisenberg
7
Ya, jelas bukan ide yang baik untuk melakukan hard-code nilai apa pun yang berpotensi berubah. Terutama ketika ada API untuk menanyakan nilai aktual.
Nicolas Miari
1
Versi SwiftUIColor(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0)
Doug Amos
90

iOS 7 warna biru default adalah 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
sumber
51
Dan jika Anda lebih suka hex:0x007aff
Jason Moore
4
Ini bukan bukti di masa mendatang - jika Apple mengubah warna warna default atau memungkinkan pengguna menyetel warna warna default, aplikasi Anda tidak akan mendapatkan warna yang benar.
prewett
4
dan di sistem lain: # 007AFF
daleijn
3
Dalam Swift: biarkan defaultTintColor = UIColor (merah: 0,0, hijau: 122/255, biru: 1.0, alpha: 1)
Jervisbay
49

Menurut dokumentasi untuk UIButton:

Di iOS v7.0, semua subclass dari UIView menurunkan perilakunya untuk tintColor dari kelas dasar. Lihat pembahasan tintColor di tingkat UIView untuk informasi lebih lanjut.

Dengan asumsi Anda tidak mengubah tintColor sebelum meraih nilai default, Anda dapat menggunakan:

self.view.tintColor
Scott Carter
sumber
Sepertinya cara teraman untuk mengambil warna.
Cliff Helsel
Ini bekerja untuk saya. Saya sharedApplication()tidak punya keyWindowdengantintColor
SimplGy
26

Berikut adalah metode sederhana untuk mendapatkan warna warna sistem default:

+ (UIColor*)defaultSystemTintColor
{
   static UIColor* systemTintColor = nil;
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
      UIView* view = [[UIView alloc] init];
      systemTintColor = view.tintColor;
   });
   return systemTintColor;
}
Rick
sumber
Anda tidak perlu mengirim sekali untuk hal-hal utas utama. Sederhana jika nihil sudah cukup.
Malhal
6
Mengapa menganggap metode ini hanya akan dipanggil dari utas utama? Biaya overhead ke dispatch_oncecukup rendah dan merupakan satu jika memeriksa dalam kasus umum.
Rick
@Rick Karena API UIKit tidak aman untuk latar belakang, jadi memanggilnya di luar utas utama tidak diperbolehkan.
Andrey Tarantsov
@AndreyTarantsov itu benar, tetapi adalah aman untuk digunakan UIColorpada beberapa thread. Membungkusnya dalam dispatch_oncememungkinkan untuk mengambil warna ini dengan aman di utas apa pun. Dan sekali lagi, biaya overhead sangat rendah.
Rick
3
@AndreyTarantsov dari tes cepat sepertinya berfungsi dengan baik. Dari dokumentasi UIVIew : "Manipulasi ke antarmuka pengguna aplikasi Anda harus muncul di utas utama. Dengan demikian, Anda harus selalu memanggil metode kelas UIView dari kode yang berjalan di utas utama aplikasi Anda. Satu-satunya waktu ini mungkin tidak ketat yang diperlukan adalah ketika membuat objek tampilan itu sendiri tetapi semua manipulasi lain harus terjadi pada utas utama. "
Rick
16

cepat 4 cara:

extension UIColor {
  static let system = UIView().tintColor!
}
Dmitry Kozlov
sumber
Saya sangat tidak menyarankan Anda untuk menggunakan pembongkaran paksa, karena itu dapat menyebabkan crash aplikasi, jika perilaku default Kerangka UIKit akan diubah dalam versi berikutnya. Juga mendapatkan warna warna dari instance UIView tidak dapat menjamin bahwa warna ini adalah warna warna sistem.
Stanislau Baranouski
@StanislauBaranouski Mengapa mereka harus mengubahnya? Tolong jelaskan poin Anda
Dmitry Kozlov
tidak perlu penjelasan di sini, itu hanya praktik buruk untuk menggunakan membuka paksa, terutama jika Anda bisa menghindarinya.
Stanislau Baranouski
15

Ekstensi ini memberi Anda warna biru sistem asli.

extension UIColor {

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

}

MEMPERBARUI

Harap lupakan apa yang saya tulis di atas, baru tahu - ada ekstensi asli dengan warna sistem yang telah kami cari, termasuk sistem biru :

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

Anda dapat menggunakannya secara langsung:

myView.tintColor = .systemBlue
Stanislau Baranouski
sumber
1
Yang ini akan membuat UIButton setiap kali Anda meminta systemBlue lebih baik untuk init warna ini sekali. Menggunakan kata internal dalam ekstensi internal tidak mudah digunakan. Sama untuk menggunakan kelas, bukan statis. Dan menyebutnya "Biru" tidak benar, karena warna ini nantinya bisa diubah seperti di macOS Mojave. Jadi static let system = UIView().tintColor!masih jauh lebih baik daripada varian Anda.
Dmitry Kozlov
@DmitryKozlov Anda benar, lebih baik menggunakan kinerja memori statis karena. Terima kasih telah menunjukkan itu. Tapi menyebutnya "biru" masih berfungsi hingga iOS 12 dan sama sekali tidak terkait dengan macOS. Untuk macOS Anda harus berurusan dengan tipe NSColor.
Stanislau Baranouski
14

Dapatkan warna secara otomatis dengan menggunakan kode ini:

static let DefaultButtonColor = UIButton(type: UIButtonType.System).titleColorForState(.Normal)!
Lukasz Czerwinski
sumber
10

The UIWindow.tintColorMetode tidak bekerja untuk saya di iOS8 (itu masih hitam), jadi saya harus melakukan ini:

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

Ini memberi warna biru yang tepat terlihat pada a UIBarButtonItem

cscott530
sumber
Terasa agak kotor, tetapi lebih baik daripada meng-hardcoding warna tautan yang mungkin berubah seiring waktu.
timgcarlson
7

Dari iOS 7 ada API dan Anda bisa mendapatkan (dan mengatur) warna warna dengan:

self.view.tintColor

Atau jika Anda membutuhkan CGColor:

self.view.tintColor.CGColor
Studio Codecraft
sumber
6

Dalam banyak kasus apa yang Anda butuhkan adalah adil

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

atau untuk cepat

self.tintColor
// or if in a ViewController
self.view.tintColor
Ali
sumber
1
self.view.tintColor lebih mungkin
malhal
3

saat mengatur warna Anda dapat mengatur warna seperti ini

[UIColor colorWithRed:19/255.0 green:144/255.0 blue:255/255.0 alpha:1.0]
Anurag Soni
sumber
Mengapa perlu menulis /255.0dengan rgbnilai masing-masing ?
Adil Malik
7
Karena warna pada mac mengambang antara 0,0 dan 1,0.
Malhal
2

Menambahkan kategori ke UIColor dengan cara berikut akan membuatnya tersedia untuk Anda kapan pun Anda membutuhkannya atau bahkan mengubah definisi di seluruh kode Anda:

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

Setelah Anda mengimpor Kategori dalam kode Anda, Anda dapat memanggil warna dengan menggunakan:

UIColor *myBlueColor = [UIColor iOSblueColor];
Renaud Boisjoly
sumber
Tolong, coba baca stackoverflow.com/help/deleted-answers ini , untuk lebih memahami bagaimana tidak menjawab. Yaitu: "Jawaban yang tidak secara mendasar menjawab pertanyaan": hampir tidak lebih dari tautan ke situs eksternal
Radim Köhler
Uh Bagaimana kita dapatkan dari blueke reddalam+ (instancetype)iOS7redColor;
ta.speot.is