プログラムでiOS 7のデフォルトの青色を取得するにはどうすればよいですか?


223

アプリでカスタム要素を作成していて、新しいiOSのルックアンドフィールに一致させたいと考えています。iOS 7では、非常に一般的な明るい青色、システムボタン、セグメント化されたコントロールなどのいくつかの要素のデフォルトの色または色合いが導入されました。以下に示すように、IBを使用して色を簡単に選択できるようになりました。

ここに画像の説明を入力してください

ただし、プログラムで簡単に色にアクセスする方法はわかりません。私はUIColorのドキュメントをチェックアウトしましたが、クラス自体に青のシステムカラーのアクセサーがないようです。

これが私の質問です:この色には単純なアクセサーが存在しますか?[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]です。

screenshot showing Colors window


2
興味深いことに、私のシステムのデフォルトの青は0:128:255(同じツールを使用)のようです。最近Appleが変更したのかしら?
Joel H.

@JoelH。現在使用している色空間を確認してください。
リチャードJ.ロスIII 14年

19
これは今後のiOSリリースで変更される可能性があるため、使用方法には注意してください。
Zev Eisenberg 2014年

7
はい、変更される可能性のある値をハードコードするのは、決して良い考えではありません。特に、実際の値を照会するAPIがある場合。
Nicolas Miari、2015年

1
SwiftバージョンUIColor(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
また、16進数を使用する場合:0x007aff
Jason Moore

4
これはあまり将来の保証ではありません。Appleがデフォルトの色合いの色を変更したり、ユーザーにデフォルトの色合いの色を設定させたりした場合、アプリは正しい色を取得できません。
2015年

4
そして別のシステム:#007AFF
daleijn

3
Swiftの場合:defaultTintColor = UIColor(red:0.0、green:122/255、blue:1.0、alpha:1)
Jervisbay

49

UIButtonのドキュメントによると:

iOS v7.0では、UIViewのすべてのサブクラスは、基本クラスからtintColorの動作を派生させます。詳細については、UIViewレベルでのtintColorの説明を参照してください。

デフォルト値を取得する前にtintColorを変更しないと仮定すると、以下を使用できます。

self.view.tintColor

色をつかむ最も安全な方法のように見えます。
クリフヘルセル14

これは私にとってはうまくいきます。私にsharedApplication()keyWindowwith がありませんtintColor
SimplGy 2015年

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

あなたはメインスレッドのもののために一度ディスパッチする必要はありません。単純なnilで十分です。
Malhal 2014

6
メソッドがメインスレッドからのみ呼び出されると仮定するのはなぜですか?へのオーバーヘッドdispatch_onceは非常に低く、一般的なケースで確認すれば単一です。
リック

@Rick UIKit APIはバックグラウンドでスレッドセーフではないため、メインスレッドの外部で呼び出すことはできません。
Andrey Tarantsov 2014年

@AndreyTarantsovは真実ですが、複数のスレッドで使用して安全UIColorです。それをaにラップすると、dispatch_onceどのスレッドでもこの色を安全に取得できます。また、オーバーヘッドは非常に低くなっています。
Rick

3
@AndreyTarantsovのクイックテストから、問題なく動作するようです。UIVIewのドキュメントから:「アプリケーションのユーザーインターフェイスへの操作はメインスレッドで行う必要があります。したがって、常にアプリケーションのメインスレッドで実行されているコードからUIViewクラスのメソッドを呼び出す必要があります。ビューオブジェクト自体を作成するときに必要ですが、他のすべての操作はメインスレッドで行う必要があります。」
Rick


16

迅速な4ウェイ:

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

UIKitフレームワークのデフォルトの動作が次のバージョンで変更されると、アプリケーションがクラッシュする可能性があるため、強制アンラップを使用することは強くお勧めしません。また、UIViewインスタンスからティントカラーを取得しても、このカラーがシステムティントカラーであることを保証できませんでした。
Stanislau Baranouski、2018年

@StanislauBaranouskiなぜ彼らはそれを変えなければならないのですか?あなたの要点を説明してください
ドミトリー・コズロフ

ここで説明する必要はありません。特に回避できる場合は、強制アンラップを使用するのは単に悪い習慣です。
Stanislau Baranouski

15

この拡張機能により、ネイティブシステムの青色が得られます。

extension UIColor {

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

}

更新

私が上で書いたものを忘れてください、ちょうどわかった- システムブルーを含む、私たちが探していた定義済みのシステムカラーを持つネイティブエクステンションがあります:

// 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
これは、systemBlueを要求するたびにUIButtonを作成します。この色を一度初期化することをお勧めします。内部拡張で内部単語を使用することは、ユーザーフレンドリーではありません。静的の代わりにクラスを使用する場合も同様です。そして、「ブルー」と呼ぶのは正しくありません。この色はmacOS Mojaveのように後で変更できるためです。したがってstatic let system = UIView().tintColor!、バリアントよりもはるかに優れています。
ドミトリーコズロフ

@DmitryKozlovあなたが正しい、静的なメモリのパフォーマンスを使用する方が良い。それを指摘してくれてありがとう。しかし、それを「青」と呼ぶことはまだiOS 12まで機能し、macOSとはまったく関係ありません。macOSの場合、NSColorタイプを処理する必要があります。
Stanislau Baranouski、


10

このUIWindow.tintColorメソッドはiOS8では機能しなかったため(まだ黒でした)、これを行う必要がありました。

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

これはで見られる適切な青い色合いを与えました UIBarButtonItem


少し汚れていますが、時間の経過とともに変化するリンクの色をハードコーディングするよりはましです。
timgcarlson 2016年

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
Macの色は0.0と1.0の間の浮動小数点数だからです。
Malhal 14

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をお読みください。つまり、「根本的に質問に答えない回答」:外部サイトへのリンク以上のものではない
RadimKöhler

ええとhow'd私たちは、から入手blueするredには+ (instancetype)iOS7redColor;
ta.speot.is
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.