ฉันจะทำให้สีน้ำเงินเป็นค่าเริ่มต้นของ iOS 7 โดยทางโปรแกรมได้อย่างไร


223

ฉันกำลังสร้างองค์ประกอบที่กำหนดเองในแอพของฉันและต้องการจับคู่รูปลักษณ์ของ iOS ใหม่ iOS 7 แนะนำให้เรารู้จักกับสีฟ้าที่พบได้บ่อยมากสีเริ่มต้นหรือโทนสีสำหรับองค์ประกอบต่าง ๆ รวมถึงปุ่มระบบการควบคุมแบบแบ่งกลุ่มและอื่น ๆ พวกเขาทำให้การเลือกสีโดยใช้ IB ทำได้ง่ายดังที่เห็นที่นี่:

ป้อนคำอธิบายรูปภาพที่นี่

อย่างไรก็ตามฉันไม่พบวิธีการเข้าถึงสีอย่างง่ายดายโดยทางโปรแกรม ฉันเช็คเอาท์เอกสาร UIColorและดูเหมือนจะไม่มีอุปกรณ์เสริมสำหรับสีของระบบสีฟ้าในชั้นเรียนของตัวเอง

นี่คือคำถามของฉัน: มี accessor แบบง่ายสำหรับสีนี้หรือไม่ [UIColor ?]หรืออะไรอย่างนั้น ถ้าไม่มีใครรู้ค่า RGBที่แน่นอนสำหรับสีนั้น

คำตอบ:


252

ใช้self.view.tintColorจากตัวควบคุมมุมมองหรือself.tintColorจากUIViewคลาสย่อย


6
ฉันจะบอกว่าคุณสามารถใช้UIView().tintColorแต่ในความเป็นจริงคุณไม่สามารถ ไม่แน่ใจว่าจุดใดที่ UIView จะได้รับชุดสีอ่อน ...
Dan Rosenstark

1
@DanRosenstark ฉันคิดว่าUIWindowมุมมองรูทของมันอาจจะเป็นเวอร์ชั่นดั้งเดิม มุมมองสืบทอดสีอ่อนของพวกเขาจากมุมมองที่สูงขึ้นในห่วงโซ่การตอบกลับ แต่ในตัวอย่างของคุณมุมมองใหม่ไม่มีการกำกับดูแล
Aaron Brager

2
self.view.tintColorจากภายในUIViewController.viewDidLoad()ให้สีน้ำเงินที่เหมาะสม
Nicolas Miari

234

[UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0]มันดูเหมือนจะเป็น

สกรีนช็อตแสดงหน้าต่างสี


2
ที่น่าสนใจสีน้ำเงินเริ่มต้นในระบบของฉันดูเหมือนจะเป็น 0: 128: 255 (ใช้เครื่องมือเดียวกัน) ฉันสงสัยว่า Apple เพิ่งเปลี่ยนหรือไม่
Joel H.

@JoelH ตรวจสอบพื้นที่สีที่คุณใช้อยู่ในปัจจุบัน
Richard J. Ross III

19
โปรดใช้ความระมัดระวังในการใช้งานเนื่องจากอาจมีการเปลี่ยนแปลงในการเปิดตัว iOS รุ่นถัดไป
Zev Eisenberg

7
ใช่ไม่ใช่ความคิดที่ดีในการเขียนโค้ดค่าใด ๆ ที่อาจเปลี่ยนแปลงได้ โดยเฉพาะอย่างยิ่งเมื่อมี API เพื่อสอบถามค่าจริง
Nicolas Miari

1
รุ่น SwiftUIColor(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0)
Doug Amos

90

สีฟ้าเริ่มต้นของ iOS 7 คือ 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
และถ้าคุณชอบ0x007aff
Jason Moore

4
นี่ไม่ใช่ข้อพิสูจน์ในอนาคต - หาก Apple เปลี่ยนสีโทนเริ่มต้นหรืออนุญาตให้ผู้ใช้ตั้งค่าสีโทนเริ่มต้นแอพของคุณจะไม่ได้สีที่ถูกต้อง
prewett

4
และในระบบอื่น: # 007AFF
daleijn

3
ใน Swift: let defaultTintColor = UIColor (สีแดง: 0.0, สีเขียว: 122/255, สีน้ำเงิน: 1.0, อัลฟา: 1)
Jervisbay

49

ตามเอกสารสำหรับ UIButton:

ใน iOS v7.0 คลาสย่อยทั้งหมดของ UIView สืบทอดพฤติกรรมของพวกเขาสำหรับ tintColor จากคลาสพื้นฐาน ดูการอภิปรายของ tintColor ที่ระดับ UIView สำหรับข้อมูลเพิ่มเติม

สมมติว่าคุณไม่เปลี่ยน tintColor ก่อนที่จะคว้าค่าเริ่มต้นคุณสามารถใช้:

self.view.tintColor

ดูเหมือนว่าวิธีที่ปลอดภัยที่สุดที่จะคว้าสี
Cliff Helsel

มันใช้งานได้สำหรับฉัน ฉันsharedApplication()ไม่ได้มีkeyWindowwithtintColor
SimplGy

26

นี่เป็นวิธีง่าย ๆ ในการรับสีเริ่มต้นของระบบ:

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

คุณไม่จำเป็นต้องจัดส่งหนึ่งครั้งสำหรับเนื้อหาหลัก ง่าย ๆ ถ้าศูนย์จะพอเพียง
malhal

6
ทำไมทฤษฏีจะถูกเรียกจากเธรดหลักเท่านั้น? ค่าโสหุ้ยถึงdispatch_onceค่อนข้างต่ำและเป็นโสดหากตรวจสอบในกรณีทั่วไป
Rick

@Rick เนื่องจาก UIKit API ไม่ได้เป็นพื้นหลังของเธรดที่ปลอดภัยดังนั้นจึงไม่อนุญาตให้เรียกใช้นอกเธรดหลัก
Andrey Tarantsov

@AndreyTarantsov ว่าเป็นความจริง แต่มันคือความปลอดภัยในการใช้งานUIColorในหลายหัวข้อ การห่อในตัวdispatch_onceช่วยในการเรียกคืนสีนี้อย่างปลอดภัยบนเธรดใด ๆ และอีกครั้งค่าใช้จ่ายต่ำมาก
Rick

3
@AndreyTarantsov จากการทดสอบอย่างรวดเร็วดูเหมือนว่าจะทำงานได้ดี จากเอกสารของ UIVIew : "การจัดการกับส่วนติดต่อผู้ใช้ของแอปพลิเคชันของคุณจะต้องเกิดขึ้นในเธรดหลักดังนั้นคุณควรเรียกวิธีการของคลาส UIView จากรหัสที่รันในเธรดหลักของแอปพลิเคชันของคุณเท่านั้นเวลานี้อาจไม่เคร่งครัด จำเป็นคือเมื่อสร้างวัตถุมุมมอง แต่การจัดการอื่น ๆ ทั้งหมดควรเกิดขึ้นในเธรดหลัก "
Rick


16

สวิฟท์ 4 วิธี:

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

ฉันไม่แนะนำให้คุณใช้การบังคับเปิดเครื่องเนื่องจากอาจทำให้แอปพลิเคชันขัดข้องหากลักษณะการทำงานเริ่มต้นของ UIKit Framework จะเปลี่ยนในเวอร์ชันถัดไป การรับสีอ่อนจากอินสแตนซ์ UIView ไม่สามารถรับประกันได้ว่าสีนี้เป็นสีอ่อนของระบบ
Stanislau Baranouski

@StanislauBaranouski ทำไมพวกเขาควรเปลี่ยนมัน? โปรดอธิบายประเด็นของคุณ
Dmitry Kozlov

ไม่ต้องการคำอธิบายที่นี่เป็นเพียงการปฏิบัติที่ไม่ถูกต้องที่จะใช้การบังคับเปิดออกโดยเฉพาะถ้าคุณสามารถหลีกเลี่ยงได้
Stanislau Baranouski

15

ส่วนขยายนี้ให้ระบบสีฟ้าแก่คุณ

extension UIColor {

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

}

UPDATE

โปรดลืมสิ่งที่ฉันเขียนด้านบนเพียงแค่คิดออก - มีส่วนขยายดั้งเดิมที่มีสีของระบบที่กำหนดไว้ล่วงหน้าที่เรากำลังมองหารวมถึงสีฟ้าของระบบ :

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

คุณสามารถใช้งานได้โดยตรง:

myView.tintColor = .systemBlue

1
อันนี้จะสร้าง UIButton ทุกครั้งที่คุณขอให้ระบบฟ้าดีกว่าที่จะเริ่มสีนี้อีกครั้ง การใช้คำภายในในส่วนขยายภายในไม่เป็นมิตรต่อผู้ใช้ เหมือนกับการใช้คลาสแทนสแตติก และเรียกมันว่า "สีน้ำเงิน" ไม่ถูกต้องทำให้สีนี้สามารถเปลี่ยนแปลงได้ในภายหลังเช่นใน macOS Mojave ดังนั้นstatic let system = UIView().tintColor!ยังดีกว่าตัวแปรของคุณมาก
Dmitry Kozlov

@DmitryKozlov คุณถูกต้องดีกว่าที่จะใช้ประสิทธิภาพหน่วยความจำแบบคงที่ ขอบคุณที่ชี้ไปที่ แต่การเรียกมันว่า "สีน้ำเงิน" ยังคงใช้ได้กับ iOS 12 และไม่เกี่ยวข้องกับ macOS เลย สำหรับ macOS คุณต้องจัดการกับประเภท NSColor
Stanislau Baranouski

14

รับสีโดยอัตโนมัติโดยใช้รหัสนี้:

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

10

UIWindow.tintColorวิธีการไม่ได้ทำงานสำหรับฉันใน iOS8 (มันก็ยังคงเป็นสีดำ) ดังนั้นผมต้องทำเช่นนี้:

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

สิ่งนี้ทำให้โทนสีน้ำเงินที่เหมาะสมเห็นใน UIBarButtonItem


รู้สึกสกปรกนิดหน่อย แต่มันดีกว่าฮาร์ดโค้ดสีลิงค์ที่อาจเปลี่ยนแปลงไปตามกาลเวลา
timgcarlson

7

จาก iOS 7 มี API และคุณสามารถรับ (และตั้งค่า) สีอ่อน ๆ ด้วย:

self.view.tintColor

หรือถ้าคุณต้องการ CGColor:

self.view.tintColor.CGColor

6

ในหลายกรณีสิ่งที่คุณต้องการคือเพียงแค่

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

หรือรวดเร็ว

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

1
self.view.tintColor มีโอกาสมากขึ้น
malhal

3

ในขณะที่ตั้งค่าสีคุณสามารถตั้งค่าสีเช่นนี้

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

เหตุใดจึงต้องเขียน/255.0ด้วยแต่ละrgbค่า
Adil Malik

7
เพราะสีบน macs นั้นจะอยู่ระหว่าง 0.0 ถึง 1.0
malhal

2

การเพิ่มหมวดหมู่ใน UIColor ด้วยวิธีต่อไปนี้จะทำให้คุณสามารถใช้งานได้ตลอดเวลาที่คุณต้องการหรือแม้แต่เปลี่ยนคำจำกัดความของรหัสของคุณ:

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

เมื่อคุณนำเข้าหมวดหมู่ในรหัสของคุณคุณสามารถโทรหาสีโดยใช้:

UIColor *myBlueColor = [UIColor iOSblueColor];

โปรดลองอ่านstackoverflow.com/help/deleted-answersนี้เพื่อทำความเข้าใจวิธีการไม่ตอบ คือ: "คำตอบที่ไม่ได้ตอบคำถามพื้นฐาน": มากกว่าลิงก์ไปยังไซต์ภายนอก
Radim Köhler

เอ่อเราจะblueไปจากredใน+ (instancetype)iOS7redColor;
ta.speot.is
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.