[ios] iOS 13에서 다크 모드를 옵트 아웃 할 수 있습니까?

내 응용 프로그램의 대부분은 웹 구현으로 구성되어 기본 구현으로는 아직 사용할 수없는 기능을 제공합니다. 웹 팀은 웹 사이트에 어두운 테마를 구현할 계획이 없습니다. 따라서 내 앱은 iOS 13에서 다크 모드를 지원하면 절반의 절반으로 보입니다.

앱이 웹 사이트 테마와 일치하도록 항상 라이트 모드를 표시하도록 다크 모드 지원을 선택 해제 할 수 있습니까?



답변

첫째, 다음은 어두운 모드 선택 해제와 관련된 Apple의 항목 입니다.
이 링크의 내용은 Xcode 11 및 iOS 13 용으로 작성되었습니다 .

이 섹션은 Xcode 11 사용법에 적용됩니다


ENTIRE 신청을 거부하려면

접근법 # 1

info.plist 파일 에서 다음 키를 사용하십시오 .

UIUserInterfaceStyle

그리고 값을 할당하십시오 Light.

XML 에 대한 UIUserInterfaceStyle할당 :

<key>UIUserInterfaceStyle</key>
<string>Light</string>

접근법 # 2

overrideUserInterfaceStyle앱의 window변수 에 대해 설정할 수 있습니다 .

프로젝트 생성 방법에 따라 AppDelegate파일 또는 에있을 수 있습니다 SceneDelegate.

if #available(iOS 13.0, *) {
    window?.overrideUserInterfaceStyle = .light
}


UIViewController를 개별적으로 선택 해제하려면

override func viewDidLoad() {
    super.viewDidLoad()
    // overrideUserInterfaceStyle is available with iOS 13
    if #available(iOS 13.0, *) {
        // Always adopt a light interface style.
        overrideUserInterfaceStyle = .light
    }
}

overrideUserInterfaceStyle에 대한 Apple 문서

위의 코드는 Xcode 11에서 어떻게 보일까요?

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

이 섹션은 Xcode 10.x 사용법에 적용됩니다


제출에 Xcode 11을 사용하는 경우이 줄 아래의 모든 내용을 무시해도됩니다.

iOS 12에는 관련 API가 없으므로 위에 제공된 값을 사용하려고하면 오류가 발생합니다.

overrideUserInterfaceStyle귀하의 설정 에UIViewController

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

UIViewController를 개별적으로 선택 해제하려면

컴파일러 버전과 iOS 버전을 테스트하여 Xcode 10에서 처리 할 수 ​​있습니다.

#if compiler(>=5.1)
if #available(iOS 13.0, *) {
    // Always adopt a light interface style.
    overrideUserInterfaceStyle = .light
}
#endif

ENTIRE 신청을 거부하려면

AppDelegate파일에 다음 코드를 추가하여 위의 스 니펫을 수정하여 Xcode 10의 전체 응용 프로그램에서 작동하도록 할 수 있습니다.

#if compiler(>=5.1)
if #available(iOS 13.0, *) {
    // Always adopt a light interface style.
    window?.overrideUserInterfaceStyle = .light
}
#endif

그러나 Xcode 버전 10.x를 사용하는 경우 plist 설정이 실패합니다.

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

에 신용 @Aron 넬슨 , @Raimundas Sakalauskas , @NSLeaderrmaddy 그들의 피드백이 답변을 향상.


답변

“iOS에서 다크 모드 구현”( https://developer.apple.com/videos/play/wwdc2019/214/ 31:13에서 시작) 에 대한 Apple의 세션에 따르면 모든 뷰 컨트롤러 또는 뷰에서 설정 하거나 설정할 overrideUserInterfaceStyle수 있습니다 하위 뷰 또는 뷰 컨트롤러에 사용될 것 입니다.UIUserInterfaceStyleLightUIUserInterfaceStyleDarktraitCollection

이미 SeanR에서 언급 한 바와 같이, 당신은 설정할 수 UIUserInterfaceStyleLight또는 Dark전체 앱이 변경 앱을 plist 파일에.


답변

Xcode 11 이상 (iOS 13 이상 SDK)을 사용하지 않는 경우 앱이 자동으로 다크 모드를 지원하지 않도록 선택했습니다. 따라서 어두운 모드를 선택 해제 할 필요가 없습니다.

Xcode 11 이상을 사용하는 경우 시스템에서 앱에 대해 어두운 모드가 자동으로 활성화되었습니다. 선호도에 따라 어두운 모드를 비활성화하는 두 가지 방법이 있습니다. 특정 창,보기 또는보기 컨트롤러에 대해 완전히 비활성화하거나 비활성화 할 수 있습니다.

앱에서 다크 모드를 완전히 비활성화

앱의 Info.plist 파일에서 UIUserInterfaceStyle와 같이 키를 값으로 포함하여 어두운 모드를 비활성화 할 수 있습니다 Light.
사용자의 선호도를 무시하고 항상 앱에 밝은 모양을 적용합니다.
빛으로 UIUserInterfaceStyle

Window, View 또는 View Controller에 대해 어두운 모드 비활성화

overrideUserInterfaceStyle적절한 창, 뷰 또는 뷰 컨트롤러 의 속성을 설정하여 인터페이스가 항상 밝거나 어두운 스타일로 표시되도록 할 수 있습니다 .

컨트롤러보기 :

override func viewDidLoad() {
    super.viewDidLoad()
    /* view controller’s views and child view controllers
     always adopt a light interface style. */
    overrideUserInterfaceStyle = .light
}

견해:

// The view and all of its subviews always adopt light style.
youView.overrideUserInterfaceStyle = .light

창문:

/* Everything in the window adopts the style,
 including the root view controller and all presentation controllers that
 display content in that window.*/
window.overrideUserInterfaceStyle = .light

참고 : Apple은 앱에서 다크 모드를 지원할 것을 적극 권장합니다. 따라서 일시적으로 어두운 모드 만 비활성화 할 수 있습니다.

자세한 내용은 여기를 참조하십시오 : iOS 앱을위한 특정 인터페이스 스타일 선택


답변

********** Xcode 11 이상을위한 가장 쉬운 방법 ***********

전에 info.plist에 추가하십시오 </dict></plist>

<key>UIUserInterfaceStyle</key>
<string>Light</string>


답변

해결책을 찾았습니다. 나는 처음에 UIUserInterfaceStyle-Information Property ListUIUserInterfaceStyle-UIKit 에서 한 조각을 만들었지 만, 실제로 iOS 앱을위한 특정 인터페이스 스타일 선택에 문서화되어있는 것을 발견했다 .

당신의에서 info.plist설정 UIUserInterfaceStyle( 사용자 인터페이스 스타일 에) 1 ( UIUserInterfaceStyle.light).

편집 : dorbeetle의 답변에 따라 더 적합한 설정 UIUserInterfaceStyle은입니다 Light.


답변

위의 답변은 전체 앱을 선택 해제하려는 경우 작동합니다. UI가있는 lib에서 작업 중이고 .plist를 편집 할 권한이없는 경우 코드를 통해 수행 할 수도 있습니다.

iOS 13 SDK에 대해 컴파일하는 경우 다음 코드를 간단히 사용할 수 있습니다.

빠른:

if #available(iOS 13.0, *) {
    self.overrideUserInterfaceStyle = .light
}

Obj-C :

if (@available(iOS 13.0, *)) {
    self.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
}

그러나 iOS 12 SDK 에 대해 코드를 컴파일하려면 (현재 여전히 안정적인 최신 SDK 임) 선택기를 사용해야합니다. 선택기가있는 코드 :

Swift (XCode는이 코드에 대한 경고를 표시하지만 SDK 12에 속성이 없으므로 컴파일하지 않기 때문에 지금이 유일한 방법입니다) :

if #available(iOS 13.0, *) {
    if self.responds(to: Selector("overrideUserInterfaceStyle")) {
        self.setValue(UIUserInterfaceStyle.light.rawValue, forKey: "overrideUserInterfaceStyle")
    }
}

Obj-C :

if (@available(iOS 13.0, *)) {
    if ([self respondsToSelector:NSSelectorFromString(@"overrideUserInterfaceStyle")]) {
        [self setValue:@(UIUserInterfaceStyleLight) forKey:@"overrideUserInterfaceStyle"];
    }
}


답변

최근 업데이트-

Xcode 10.x를 사용하는 경우 기본값 UIUserInterfaceStylelightiOS 13.x입니다. iOS 13 기기에서 실행하면 기기는 라이트 모드에서만 작동합니다.

UIUserInterfaceStyleInfo.plist 파일에 키 를 명시 적으로 추가 할 필요가 없습니다. 키를 추가하면 앱을 확인할 때 오류가 발생합니다.

잘못된 Info.plist 키입니다. Payload / AppName.appInfo.plist 파일의 ‘UIUserInterfaceStyle’키가 유효하지 않습니다.

UIUserInterfaceStyleXcode 11.x를 사용할 때는 Info.plist 파일에 키만 추가하십시오 .