Làm cách nào để có được màu xanh mặc định của iOS 7 theo chương trình?


223

Tôi đang tạo các yếu tố tùy chỉnh trong ứng dụng của mình và muốn phù hợp với giao diện của iOS mới. iOS 7 đã giới thiệu cho chúng tôi một màu xanh nhạt rất phổ biến, màu mặc định hoặc màu cho một số yếu tố, bao gồm nút hệ thống, điều khiển được phân đoạn, v.v. Họ đã giúp bạn dễ dàng chọn màu bằng IB, như được thấy ở đây:

nhập mô tả hình ảnh ở đây

Tuy nhiên, tôi không tìm thấy cách dễ dàng truy cập màu theo chương trình. Tôi đã kiểm tra tài liệu UIColor và dường như không có bất kỳ trình truy cập nào cho màu hệ thống màu xanh trong chính lớp đó.

Đây là câu hỏi của tôi: một trình truy cập đơn giản có tồn tại cho màu này không? [UIColor ?]hoặc một cái gì đó giống như nó? Nếu không, có ai biết các giá trị RGB chính xác cho màu đó không?

Câu trả lời:


252

Sử dụng self.view.tintColortừ một bộ điều khiển xem hoặc self.tintColortừ một UIViewlớp con.


6
Tôi sẽ nói rằng bạn chỉ có thể sử dụng UIView().tintColor, nhưng thực tế bạn không thể. Không chắc chắn tại thời điểm nào, UIView có bộ màu sắc ...
Dan Rosenstark

1
@DanRosenstark Tôi nghĩ rằng UIWindowhoặc có thể chế độ xem gốc của nó có phiên bản gốc. Các khung nhìn kế thừa màu sắc của chúng từ các khung nhìn cao hơn trong chuỗi phản hồi, nhưng trong ví dụ của bạn, khung nhìn mới không có giám sát.
Aaron Brager

2
self.view.tintColortừ bên trong UIViewController.viewDidLoad()cho màu xanh bên phải.
Nicolas Miari

234

Nó xuất hiện để được [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0].

ảnh chụp màn hình hiển thị cửa sổ Colors


2
Thật thú vị, màu xanh mặc định trên hệ thống của tôi dường như là 0: 128: 255 (sử dụng cùng một công cụ). Tôi tự hỏi nếu Apple thay đổi nó gần đây?
Joel H.

@JoelH. Kiểm tra không gian màu bạn đang sử dụng.
Richard J. Ross III

19
Hãy cẩn thận trong cách bạn sử dụng điều này, vì nó có thể thay đổi trong các bản phát hành iOS tiếp theo.
Zev Eisenberg

7
Có, chắc chắn không phải là một ý tưởng tốt để mã hóa bất kỳ giá trị nào có khả năng thay đổi. Đặc biệt là khi có API để truy vấn giá trị thực.
Nicolas Miari

1
Phiên bản SwiftUIColor(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0)
Doug Amos

90

Màu xanh mặc định của iOS 7 là 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
Và nếu bạn thích hex:0x007aff
Jason Moore

4
Đây không phải là bằng chứng trong tương lai - nếu Apple thay đổi màu sắc mặc định hoặc cho phép người dùng đặt màu sắc mặc định, ứng dụng của bạn sẽ không có màu chính xác.
prewett

4
và trong một hệ thống khác: # 007AFF
daleijn

3
Trong Swift: let defaultTintColor = UIColor (đỏ: 0.0, xanh lá cây: 122/255, xanh lam: 1.0, alpha: 1)
Jervvday

49

Theo tài liệu cho UIButton:

Trong iOS v7.0, tất cả các lớp con của UIView đều xuất phát hành vi của chúng đối với tintColor từ lớp cơ sở. Xem phần thảo luận về tintColor ở cấp độ UIView để biết thêm thông tin.

Giả sử bạn không thay đổi tintColor trước khi lấy giá trị mặc định, bạn có thể sử dụng:

self.view.tintColor

Trông giống như cách an toàn nhất để lấy màu.
Cliff Helsel

Điều này làm việc cho tôi. My sharedApplication()không có keyWindowvớitintColor
SimplGy 8/03/2015

26

Đây là một phương pháp đơn giản để có được màu sắc hệ thống mặc định:

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

bạn không cần gửi một lần cho công cụ chủ đề chính. Một đơn giản nếu không sẽ đủ.
malhal

6
Tại sao giả sử phương thức sẽ chỉ được gọi từ luồng chính? Chi phí hoạt động dispatch_oncekhá thấp và là một đơn nếu kiểm tra trong trường hợp phổ biến.
Rick

@Rick Vì API UIKit không an toàn cho luồng nền, nên việc gọi nó bên ngoài luồng chính không được phép.
Andrey Tarantsov

@AndreyTarantsov đó là sự thật, nhưng nó an toàn để sử dụng UIColortrên nhiều chủ đề. Gói nó trong một dispatch_oncecho phép lấy màu này một cách an toàn trên bất kỳ chủ đề. Và một lần nữa, chi phí rất thấp.
Rick

3
@AndreyTarantsov từ một bài kiểm tra nhanh có vẻ như nó hoạt động tốt. Từ tài liệu UIVIew : "Thao tác với giao diện người dùng của ứng dụng của bạn phải xảy ra trên luồng chính. Vì vậy, bạn phải luôn gọi các phương thức của lớp UIView từ mã chạy trong luồng chính của ứng dụng của bạn. Lần duy nhất điều này có thể không nghiêm ngặt cần thiết là khi tự tạo đối tượng khung nhìn nhưng tất cả các thao tác khác sẽ xảy ra trên luồng chính. "
Rick


16

4 cách nhanh chóng:

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

Tôi thực sự không khuyên bạn nên sử dụng hủy ghép buộc, vì nó có thể gây ra sự cố cho ứng dụng, nếu hành vi mặc định của UIKit Framework sẽ bị thay đổi trong bất kỳ phiên bản tiếp theo nào. Ngoài ra, việc lấy màu sắc từ một cá thể UIView không thể đảm bảo rằng màu này là màu của hệ thống.
Stanislau Baranouski

@StanislauBaranouski Tại sao họ nên thay đổi điều đó? Hãy giải thích quan điểm của bạn
Dmitry Kozlov

không cần giải thích ở đây, đó chỉ là một thực hành tồi để sử dụng cưỡng bức, đặc biệt là nếu bạn có thể tránh nó.
Stanislau Baranouski

15

Phần mở rộng này cung cấp cho bạn màu xanh hệ thống riêng.

extension UIColor {

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

}

CẬP NHẬT

Hãy quên những gì tôi đã viết ở trên, chỉ cần tìm ra - có phần mở rộng riêng với các màu hệ thống được xác định trước mà chúng tôi đang tìm kiếm, bao gồm cả màu xanh hệ thống :

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

Bạn có thể sử dụng nó trực tiếp:

myView.tintColor = .systemBlue

1
Cái này sẽ tạo UIButton mỗi khi bạn yêu cầu systemBlue tốt hơn để bắt đầu màu này một lần. Sử dụng từ nội bộ trong phần mở rộng nội bộ không thân thiện với người dùng. Tương tự cho việc sử dụng lớp thay vì tĩnh. Và gọi nó là "Blue" là không đúng, vì màu này có thể được thay đổi sau này như trong macOS Mojave. Vì vậy, static let system = UIView().tintColor!vẫn còn tốt hơn nhiều so với biến thể của bạn.
Dmitry Kozlov

@DmitryKozlov bạn đúng, tốt hơn để sử dụng hiệu suất bộ nhớ do tĩnh. Cảm ơn đã chỉ ra điều đó. Nhưng Gọi nó là "màu xanh" vẫn hoạt động cho đến iOS 12 và nó hoàn toàn không liên quan đến macOS. Đối với macOS, bạn phải xử lý loại NSColor.
Stanislau Baranouski

14

Lấy màu tự động bằng cách sử dụng mã này:

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

10

Các UIWindow.tintColorphương pháp đã không làm việc cho tôi trong iOS8 (nó vẫn còn màu đen), vì vậy tôi đã phải làm điều này:

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

Điều này đã cho màu xanh thích hợp nhìn thấy trong một UIBarButtonItem


Cảm thấy hơi bẩn, nhưng tốt hơn là mã hóa màu liên kết có thể thay đổi theo thời gian.
timgcarlson

7

Từ iOS 7 có API và bạn có thể nhận (và đặt) màu sắc với:

self.view.tintColor

Hoặc nếu bạn cần CGColor:

self.view.tintColor.CGColor

6

Trong nhiều trường hợp, những gì bạn cần chỉ là

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

hoặc cho nhanh

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

1
self.view.tintColor nhiều khả năng
malhal

3

Trong khi cài đặt màu, bạn có thể đặt màu như thế này

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

Tại sao cần phải viết /255.0với mỗi rgbgiá trị?
Adil Malik

7
Bởi vì màu sắc trên máy Mac là một khoảng giữa 0,0 và 1,0.
malhal

2

Thêm một danh mục vào UIColor theo cách sau sẽ giúp nó có sẵn cho bạn bất cứ lúc nào bạn cần hoặc thậm chí thay đổi định nghĩa của nó theo mã của bạn:

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

Khi bạn nhập Danh mục trong mã của mình, bạn có thể gọi màu bằng cách sử dụng:

UIColor *myBlueColor = [UIColor iOSblueColor];

Vui lòng thử đọc stackoverflow.com/help/delatted-answers này để hiểu thêm về cách không trả lời. Cụ thể: "Câu trả lời không trả lời cơ bản cho câu hỏi": hầu như không nhiều hơn một liên kết đến một trang web bên ngoài
Radim Köhler

Uh Sao chúng tôi nhận được từ blueđể red+ (instancetype)iOS7redColor;
ta.speot.is
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.