iOS 13 적합 한 실현 방법

6505 단어 iOS13어울리다
1.개인 KVC

[self setValue:baseTabBar forKey:@"tabBar"]; //  

[_textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];///  
[_textField setValue:[UIFont systemFontOfSize:14] forKeyPath:@"_placeholderLabel.font"];///  

_textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"  " attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14],NSForegroundColorAttributeName:[UIColor redColor]}]; ///    
Xcode 10 에서 컴 파일 하 는 것 은 문제 가 없 지만 Xcode 11 에서 컴 파일 하 는 것 은 무 너 집 니 다.그리고-(void)setValue:(nullable id)value forKey:(NSString*)key 방법 은 괜 찮 습 니 다.-(void)setValue:(nullable id)value forKeyPath:(NSString*)keyPath 는 붕 괴 됩 니 다.
질문
이러한 상황 이 발생 하 는 것 은 우리 가 이전에 UIViewController 의 속성,즉 modal PresentationStyle(이 속성 은 컨트롤 러 가 모드 보기에 서 사용 할 스타일)에 필요 한 종 류 를 설정 하지 않 았 기 때 문 입 니 다.iOS 13 에서 modal Presentation Style 의 기본 값 은 UIModal Presentation Automatic 로 바 뀌 었 으 며,이전 에는 UIModal Presentation FullScreen 이 기본 값 이 었 습 니 다.
이것 은 Xcode 버 전의 영향 을 받 지 않 습 니 다.iOS 13 시스템 이 라면 modal PresentationStyle 을 명시 적 으로 설정 하지 않 으 면 이 문제 가 발생 합 니 다.
3.곧 폐 기 될 LaunchImage
iOS 8 때 부터 애플 은 LaunchScreen 을 도 입 했 고 우 리 는 LaunchScreen 을 시작 페이지 로 설정 할 수 있 었 다.물론 지금 은 LaunchImage 를 사용 하여 시작 도 를 설정 할 수 있 습 니 다.그러나 LaunchImage 를 사용 하면 다양한 화면 크기 의 시작 그림 을 제공 하여 각종 장 치 를 맞 춰 야 합 니 다.애플 장치 의 크기 가 점점 많아 지면 서 이런 방식 은 Flexible 이 부족 합 니 다.LaunchScreen 을 사용 하면 상황 이 간단 해 집 니 다.LaunchScreen 은 AutoLayout+SizeClass 를 지원 하기 때문에 각종 화면 에 적합 합 니 다.조심 하 세 요.⚠️,2020 년 4 월 부터 iOS 13 SDK 를 사용 하 는 모든 앱 은 LaunchScreen 을 제공 해 야 하 며,LaunchImage 는 곧 역사 무대 에서 물 러 날 것 이다.
4.암흑 모드
의 원리
1.같은 자원 을 두 가지 모드 의 스타일 로 만 듭 니 다.시스템 은 현재 선택 한 스타일 에 따라 이 스타일 의 자원 을 자동 으로 가 져 옵 니 다.
2.시스템 이 스타일 을 업데이트 할 때마다 현재 존재 하 는 모든 요 소 를 호출 하여 해당 하 는 새로운 방법 으로 다시 보 기 를 하고 해당 하 는 방법 으로 변경 할 수 있 습 니 다.
자원 파일 적합
1.Assets 파일 만 들 기(또는 기 존 Assets 파일 에서)
2.그림 자원 파일(또는 색상 자원 파일 또는 기타 자원 파일)을 새로 만 듭 니 다.
3.이 자원 파일 을 선택 하고 Xcode->View->Inspectors->Show Attributes Inspectors(또는 Option+Command+4)보 기 를 열 고 Apperances 옵션 을 Any,Dark 로 변경 합 니 다.
4.세 번 째 단 계 를 실행 하면 자원 파일 은 Any Apperance 와 Dark Apperance 로 여러 개의 용기 상자 가 있 습 니 다.Any Apperance 는 기본 상황(Unspecified)과 하 이 라이트 상황(Light),Dark Apperance 는 어두 운 모드(Dark)에 적 용 됩 니 다.
5.코드 가 기본적으로 실 행 될 때 정상적으로 이름 을 통 해 사용 할 수 있 습 니 다.시스템 은 현재 모드 에 따라 해당 하 는 자원 파일 을 자동 으로 가 져 옵 니 다.
주의 하 다.
같은 프로젝트 에 여러 개의 Assets 파일 을 포장 하면 하나의 Assets.car 파일 이 생 성 되 므 로 Assets 내 자원 파일 의 이름 이 같 지 않도록 해 야 합 니 다.
UIView

traitCollectionDidChange(_:)
layoutSubviews()
draw(_:)
updateConstraints()
tintColorDidChange()
UIViewController

traitCollectionDidChange(_:)
updateViewConstraints()
viewWillLayoutSubviews()
viewDidLayoutSubviews()
UIPresentationController

traitCollectionDidChange(_:)
containerViewWillLayoutSubviews()
containerViewDidLayoutSubviews()
전역 암흑 모드 닫 기
방식 1  plist 파일 설정:Info.plist 파일 에 UIUserInterfaceStyle key 이름 을 User Interface Style 값 을 String 으로 추가 하고 UIUserInterfaceStyle key 값 을 Light 로 설정 합 니 다.
개발 중 사용 하 는 시스템 컨트롤(예 를 들 어 cell,tableview 의 배경 색)이 배경 색(또는 투명)을 설정 하지 않 으 면 어두 운 모드 에 들 어가 면 컨트롤 배경 색 이 검은색 으로 변 합 니 다.
모든 페이지 설정 이 가능 합 니 다.물론 전체 설정 도 가능 합 니 다.
일반적으로 우리 의 앱 은 모두 하나의 window 아래 에 있 으 므 로 전체 앱 의 window 를 설정 합 니 다.
방식 2:코드 가 어둠 모드 를 닫 고 어둠 모드 를 강제로 닫 습 니 다.

#if defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
if(@available(iOS 13.0,*)){
self.window.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
}
#endif
단일 인터페이스 는 암흑 모드 를 따 르 지 않 습 니 다.
  • UIViewController 와 UIView 모두 하나의 속성 을 추가 합 니 다.overrideUserInterfaceStyle
  • overrideUserInterfaceStyle 을 대응 하 는 모델 로 설정 하면 이 요소 와 하위 요 소 를 설정 한 모델 로 보 여 주 는 것 을 강제 적 으로 제한 하고 시스템 모델 에 따라 바 꾸 지 않 습 니 다.
  • ViewController 의 이 속성 을 설정 하면 보기 컨트롤 러 의 보기 와 하위 보기 컨트롤 러 가 이 스타일 을 사용 하 는 데 영향 을 줄 수 있 습 니 다
  • View 의 이 속성 을 설정 하면 보기 와 모든 하위 보기 가 이 스타일 을 사용 하 는 데 영향 을 줄 수 있 습 니 다
  • Window 의 이 속성 을 설정 하면 루트 보기 컨트롤 러 와 이 창 에 내용 을 표시 하 는 모든 프 리 젠 테 이 션 컨트롤 러(UIPresentationController)를 포함 하여 창의 모든 내용 에 스타일 을 사용 하 는 데 영향 을 줄 수 있 습 니 다
  • iOS 어 울 리 는 암흑 모드:https://www.jb51.net/article/169853.htm
    5.블 루 투 스 계속 사용 권한 추가 신청
    CBCentralManager,iOS 13 이전 에는 블 루 투 스 를 사용 할 때 직접 사용 할 수 있 고 권한 알림 이 나타 나 지 않 으 며 iOS 13 이후 에 사용 하면 알림 이 됩 니 다.
    info.plist 에 추가
    
    <key>NSBluetoothAlwaysUsageDescription</key> 
    <string>           ,        </string>`
    6.MJExtension 에서 NSNull 을 다 르 게 처리 하기
    이 로 인해 Crash 는 서버 데이터 사전 을 모델 로 변환 할 때 서버 가 준 데이터 가 NSNull 인 경우,
    mj_JSONobject,그 중 classcopy Property List 방법 으로 얻 은 속성 에 EFSQLBinding 형식의 물건 이 하나 더 있 고 속성 수량 도 정확 하지 않 아서 어 쩔 수 없습니다.저 는 이 방법 을 바 꿀 수 밖 에 없습니다.이 구성 요소 가 업데이트 되 지 않 은 상황 에서 swizzling 방법 을 썼 습 니 다.NSNull 을 만 났 을 때 바로 nil 로 바 꾸 었 습 니 다.
    7.WKWebView 에서 페이지 내용 의 높이 를 측정 하 는 방식 변경
    iOS 13 이전
    document.body.scrollHeight
    iOS 13 중
    document.documentElement.scrollHeight
    이들 의 차 이 는 55.브 라 우 저 정의 높이 가 바 뀌 었 을 것 이다.
    8.우 맹 메시지 전송,deviceToken 획득
    
    - (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    {
     if (![deviceToken isKindOfClass:[NSData class]]) return;
      const unsigned *tokenBytes = (const unsigned *)[deviceToken bytes];
      NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),ntohl(tokenBytes[6]),ntohl(tokenBytes[7])];
      pushDeviceToken = hexToken;
      NSLog(@"deviceToken:%@",hexToken);
    }
    
    9.StatusBar 는 이전 버 전과 다 릅 니 다.
    현재 상태 표시 줄 에 도 하나의 모델 이 추가 되 었 습 니 다.이전의 두 가지 에서 세 가지 로 바 뀌 었 습 니 다.그 중에서 default 는 이전의 검은색 내용 에서 시스템 모델 에 따라 현재 보 여 주 는 lightContent 인지 darkContent 인지 자동 으로 선택 합 니 다.
    10.fishhook 으로 인 한 Crash(https://github.com/facebook/fishhook/issues/61)
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기