ChatGPT解决这个技术问题 Extra ChatGPT

How can I get the iOS 7 default blue color programmatically?

I'm creating custom elements in my app and want to match the look and feel of the new iOS. iOS 7 introduced to us a very common lighter blue color, the default color or tint for several elements, including the system button, segmented control, etc. They've made it easy to select the color using IB, as seen here:

https://i.stack.imgur.com/deFsk.png

However, I haven't found how to easily access the color programmatically. I checked out the UIColor documentation, and there doesn't seem to be any accessor for the blue system color in the class itself.

Here's my question: does a simple accessor exist for this color? [UIColor ?] or something like it? If not, does someone know the exact RGB values for that color?


A
Aaron Brager

Use self.view.tintColor from a view controller, or self.tintColor from a UIView subclass.


I was going to say that you can just use UIView().tintColor, but in fact you cannot. Not sure at what point the UIView gets the tint color set...
@DanRosenstark I think the UIWindow or maybe its root view has the original version. Views inherit their tint color from higher views in the responder chain, but in your example the new view has no superview.
self.view.tintColor from within UIViewController.viewDidLoad() gives the right blue.
G
Greg

It appears to be [UIColor colorWithRed:0.0 green:122.0/255.0 blue:1.0 alpha:1.0].

https://i.stack.imgur.com/nb08q.png


Interestingly, the default blue on my system appears to be 0:128:255 (using the same tool). I wonder if Apple changed it recently?
@JoelH. Check the color space you're currently using.
Be careful in how you use this, as it may change in subsequent iOS releases.
Yes, definitely not a good idea to hard-code any value that could potentially change. Especially when there is an API to query the actual value.
Swift version UIColor(red: 0.0, green: 122.0/255.0, blue: 1.0, alpha: 1.0)
r
rdurand

iOS 7 default blue color is 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];

And if you prefer hex: 0x007aff
This isn't very future proof--if Apple changes the default tint color or lets users set default tint color your app won't get the correct color.
and in another system: #007AFF
In Swift: let defaultTintColor = UIColor(red: 0.0, green: 122/255, blue: 1.0, alpha: 1)
J
Josh Tynjala

According to the documentation for UIButton:

In iOS v7.0, all subclasses of UIView derive their behavior for tintColor from the base class. See the discussion of tintColor at the UIView level for more information.

Assuming you don't change the tintColor before grabbing the default value, you can use:

self.view.tintColor

Looks like the safest way to grab the color.
This works for me. My sharedApplication() does not have a keyWindow with tintColor
R
Rick

Here is a simple method to get the default system tint color:

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

you don't need dispatch once for main thread stuff. A simple if nil will suffice.
Why assume the method will only be called from the main thread? The overhead to dispatch_once is quite low and is a single if check in the common case.
@Rick Because UIKit APIs are not background thread-safe, so calling it outside the main thread is not allowed anyway.
@AndreyTarantsov that is true, but it is safe to use UIColor on multiple threads. Wrapping it in a dispatch_once allows for safely retrieving this color on any thread. And again, the overhead is very low.
@AndreyTarantsov from a quick test it seems to work fine. From the UIVIew documentation: "Manipulations to your application’s user interface must occur on the main thread. Thus, you should always call the methods of the UIView class from code running in the main thread of your application. The only time this may not be strictly necessary is when creating the view object itself but all other manipulations should occur on the main thread."
E
Ego Slayer

Hex Color code

#007AFF

and you need this libary https://github.com/thii/SwiftHEXColors

ps. iOS, Swift


D
Dmitry Kozlov

swift 4 way:

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

I strongly not recommend you to use forced unwrapping, since it could cause application crash, if default behavior of UIKit Framework will be changed in any next version. Also getting tint color from an UIView instance couldn't guarantee that this color is a system tint color.
@StanislauBaranouski Why they should change that? Please explain your point
no need explanation here, it's just a bad practice to use forced unwrapping, especially if you can avoid it.
S
Stanislau Baranouski

Native extension with predefined system colors gives what you're looking for:

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

You can use it directly:

myView.tintColor = .systemBlue

This one will create UIButton every time you ask for systemBlue its better to init this color once. Using internal word in internal extension is not user friendly. Same for using class instead of static. And calling it "Blue" is not right, cause this color can be changed later like in macOS Mojave. So static let system = UIView().tintColor! is still much better than your variant.
@DmitryKozlov you right, better to use static due memory performance. Thanks for pointing to that. But Calling it "blue" still works up to iOS 12 and it's not related to macOS at all. For macOS you have to deal with NSColor type.
L
Lukasz Czerwinski

Get the color automatically by using this code:

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

c
cscott530

The UIWindow.tintColor method wasn't working for me in iOS8 (it was still black), so I had to do this:

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

This gave the proper blue tint seen in a UIBarButtonItem


Feels a bit dirty, but it's better than hardcoding a link color that may change over time.
C
Codecraft Studio

From iOS 7 there is an API and you can get (and set) the tint color with:

self.view.tintColor

Or if you need the CGColor:

self.view.tintColor.CGColor

A
Ali

In many cases what you need is just

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

or for swift

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

self.view.tintColor more likely
E
Ely

Please don't mess with view.tintColor or extensions, but simply use this:

UIColor.systemBlue

A
Anurag Soni

while setting the color you can set color like this

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

Why is it needed to write /255.0 with each rgb value?
Because colours on macs are a float between 0.0 and 1.0.
R
Renaud Boisjoly

Adding a category to UIColor the following way will make it available to you anytime you need it or even change its definition accross your code:

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

Once you import the Category in your code you can call the color by using:

UIColor *myBlueColor = [UIColor iOSblueColor];

Please, try to read this stackoverflow.com/help/deleted-answers, to get more understanding how to not answer. Namely: "Answers that do not fundamentally answer the question": barely more than a link to an external site
Uh how'd we get from blue to red in + (instancetype)iOS7redColor;