프로그래밍 방식으로 iOS 7 기본 파란색을 얻으려면 어떻게해야합니까?


223

앱에서 사용자 지정 요소를 만들고 새 iOS의 모양과 느낌을 일치 시키려고합니다. iOS 7은 시스템 버튼, 세그먼트 제어 등 여러 요소에 대한 매우 일반적인 연한 파란색, 기본 색상 또는 색조를 소개했습니다. 여기에서 볼 수 있듯이 IB를 사용하여 색상을 쉽게 선택할 수 있습니다.

여기에 이미지 설명을 입력하십시오

그러나 프로그래밍 방식으로 색상에 쉽게 액세스하는 방법을 찾지 못했습니다. UIColor documentation을 확인했는데 클래스 자체에 파란색 시스템 색상에 대한 접근자가없는 것 같습니다.

내 질문은 다음과 같습니다.이 색상에 간단한 접근자가 있습니까? [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 (동일한 도구 사용)로 나타납니다. 애플이 최근에 그것을 변경했는지 궁금합니다.
Joel H.

@JoelH. 현재 사용중인 색 공간을 확인하십시오.
Richard J. Ross III

19
후속 iOS 릴리스에서 변경 될 수 있으므로 사용 방법에주의하십시오.
Zev Eisenberg

7
예, 잠재적으로 변경 될 수있는 값을 하드 코딩하는 것은 좋은 생각이 아닙니다. 특히 실제 값을 쿼리하는 API가있는 경우.
Nicolas Miari

1
스위프트 버전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이 기본 색조 색상을 변경하거나 사용자가 기본 색조 색상을 설정하도록 허용하면 앱이 올바른 색상을 얻지 못할 수 있습니다.
prewett

4
그리고 다른 시스템에서 : # 007AFF
daleijn

3
스위프트에서 : defaultTintColor = UIColor (빨간색 : 0.0, 녹색 : 122/255, 파랑 : 1.0, 알파 : 1)
Jervisbay

49

UIButton 설명서에 따르면 :

iOS v7.0에서 UIView의 모든 하위 클래스는 기본 클래스에서 tintColor에 대한 동작을 파생합니다. 자세한 내용은 UIView 수준에서 tintColor에 대한 설명을 참조하십시오.

기본값을 가져 오기 전에 tintColor를 변경하지 않는다고 가정하면 다음을 사용할 수 있습니다.

self.view.tintColor

색상을 잡는 가장 안전한 방법 인 것 같습니다.
Cliff Helsel

이것은 나를 위해 작동합니다. 내가 sharedApplication()이없는 keyWindowtintColor
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;
}

메인 스레드 물건을 위해 한 번 파견 할 필요가 없습니다. nil이면 충분합니다.
malhal

6
왜 메소드가 메인 스레드에서만 호출된다고 가정합니까? 에 대한 오버 헤드 dispatch_once는 상당히 낮으며 일반적인 경우에는 단일 검사입니다.

@Rick UIKit API는 백그라운드 스레드로부터 안전하지 않기 때문에 메인 스레드 외부에서 호출하는 것은 허용되지 않습니다.
Andrey Tarantsov

@AndreyTarantsov는 사실이지만 여러 스레드 에서 사용 하는 것이 안전 UIColor합니다. 그것을 감싸면 dispatch_once스레드 에서이 색상을 안전하게 가져올 수 있습니다. 그리고 다시, 오버 헤드가 매우 낮습니다.
Rick

3
@AndreyTarantsov는 빠른 테스트에서 제대로 작동하는 것 같습니다. UIVIew 문서에서 : "응용 프로그램의 사용자 인터페이스에 대한 조작은 기본 스레드에서 발생해야합니다. 따라서 항상 응용 프로그램의 기본 스레드에서 실행되는 코드에서 UIView 클래스의 메소드를 호출해야합니다. 뷰 오브젝트 자체를 작성할 때 필요하지만 다른 모든 조작은 기본 스레드에서 발생해야합니다. "


16

신속한 4 방법 :

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

UIKit Framework의 기본 동작이 다음 버전에서 변경 될 경우 응용 프로그램 충돌을 일으킬 수 있으므로 강제 래핑 해제를 사용하지 않는 것이 좋습니다. 또한 UIView 인스턴스에서 색조 색상을 얻는 것이이 색상이 시스템 색조 색상임을 보장 할 수 없습니다.
Stanislau Baranouski 8

@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
이것은 시스템 블루를 요청할 때마다 UIButton을 생성 하여이 색상을 한 번 초기화하는 것이 좋습니다. 내부 확장에 내부 단어를 사용하는 것은 사용자 친화적이지 않습니다. 정적 대신 클래스를 사용하는 것과 같습니다. 그리고 "Blue"라고 부르는 것이 옳지 않습니다.이 색상이 macOS Mojave에서와 같이 나중에 변경 될 수 있습니다. 따라서 static let system = UIView().tintColor!여전히 변종보다 훨씬 낫습니다.
Dmitry Kozlov

@DmitryKozlov는 정적 메모리 성능을 사용하는 것이 좋습니다. 지적 해 주셔서 감사합니다. 그러나 "파란색"이라고 부르면 여전히 iOS 12까지 작동하며 macOS와 전혀 관련이 없습니다. macOS의 경우 NSColor 유형을 처리해야합니다.
Stanislau Baranouski 8

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.0rgb값 으로 작성해야하는 이유는 무엇 입니까?
Adil Malik

7
Mac의 색상은 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

우리가에서 얻을 어 어떻게 bluered에하는 것은+ (instancetype)iOS7redColor;
ta.speot.is
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.