iOS 11 의 새로운 특성 에 대한 실천 총화

머리말
iOS 11 이 발 표 된 지 꽤 됐 고,수기 팀 도 일찌감치 어 울 렸 다.여기 서 우 리 는 iOS 11 의 새로운 특성 에 대한 적절 한 조합 을 여러분 과 함께 공유 하 는 정 리 를 했 습 니 다.
UIView & UIViewController
Layout Margins
iOS 11 에서 공식 적 으로 새로운 레이아웃 방법 인 layot margins 를 통 해 레이아웃 을 제공 합 니 다.공식 문서 Positioning Content Within Layout Margins 에 따 르 면 이 레이아웃 을 사용 하면 각 콘 텐 츠 간 에 서로 겹 치지 않도록 할 수 있 습 니 다.
전체적으로 말 하면 layot margins 는 보기 의 내용 과 내용 사이 의 공간 으로 볼 수 있 습 니 다.이것 은 각 변 의 insetValues 로 구성 되 어 있 으 며,각각 top,bottom,leading and trailing 입 니 다.대응 하 는 것 은 위,아래,왼쪽,오른쪽 입 니 다.

Auto Layout with Layout Margins
Auto Layout 를 사용 하여 레이아웃 을 하고 layot margins 를 따 르 려 면 Xcode 에서 Constrain to margins 옵션 을 열 어야 합 니 다.이렇게 하면 부모 보기 의 layot margins 가 바 뀌 면 부모 보기 margins 에 연 결 된 모든 하위 보기 가 레이아웃 을 업데이트 합 니 다.

주의 하 다.
이 옵션 을 열지 않 으 면 모든 제약 조건 은 부모 보기 의 bounds 에 의존 합 니 다.
Manually Layout with Layout Margins
Auto Layout 를 사용 하지 않 고 frame 레이아웃 을 설정 하면 layot margins 를 따 르 는 것 도 어렵 지 않 습 니 다.레이아웃 을 계산 할 때 directional LayoutMargins 라 는 속성 을 사용 해 야 합 니 다.

var directionalLayoutMargins: NSDirectionalEdgeInsets { get set }
공식 문서 에 따 르 면 view contrller 의 루트 보기 에 대해 directional LayoutMargins 의 기본 값 은 system MinimumLayoutMargins 와 Safearea Insets 에 의 해 결 정 됩 니 다.아이 폰 X 에서 루트 보 기 를 인쇄 하 는 이 세 가지 속성 은 관 계 를 볼 수 있 습 니 다.

override func viewDidAppear(_ animated: Bool) {
 super.viewDidAppear(animated)
 print("SafeAreaInsets :" + "\(self.view.safeAreaInsets)")
 print("systemMinimumLayoutMargins :" + "\(self.systemMinimumLayoutMargins)")
 print("directionalLayoutMargins: " + "\(self.view.directionalLayoutMargins)")
 
 // SafeAreaInsets :UIEdgeInsets(top: 88.0, left: 0.0, bottom: 34.0, right: 0.0)
 // systemMinimumLayoutMargins :NSDirectionalEdgeInsets(top: 0.0, leading: 16.0, bottom: 0.0, trailing: 16.0)
 // directionalLayoutMargins: NSDirectionalEdgeInsets(top: 88.0, leading: 16.0, bottom: 34.0, trailing: 16.0)
}
결 과 는 directional LayoutMargins 의 기본 값 은 system MinimumLayoutMargins 와 safeareaInsets 로 구성 되 어 있 음 을 알 수 있다.
주의 하 다.
system MinimumLayoutMargins 속성 을 view controller 의 불 값 속성 view Respects System MinimumLayoutMargins 에서 결정 할 수 있 는 지 여 부 는 기본 값 은 true 입 니 다.
directional LayoutMargins 에 수 동 으로 값 을 부여 하면 view Respects System MinimumLayoutMargins 가 열 린 상황 에서 시스템 은 할당 후의 directional LayoutMargins 와 system MinimumLayoutMargins 를 비교 하고 큰 값 을 최종 margins 로 합 니 다.

print("systemMinimumLayoutMargins :" + "\(self.systemMinimumLayoutMargins)")
print("origin directionalLayoutMargins: " + "\(self.view.directionalLayoutMargins)")

//     leading   trailing          systemMinimumLayoutMargins     20    10
self.view.directionalLayoutMargins = NSDirectionalEdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 10)
print("assigned directionalLayoutMargins: " + "\(self.view.directionalLayoutMargins)")

//          leading           ,trailing       systemMinimumLayoutMargins
systemMinimumLayoutMargins :NSDirectionalEdgeInsets(top: 0.0, leading: 16.0, bottom: 0.0, trailing: 16.0)
origin directionalLayoutMargins: NSDirectionalEdgeInsets(top: 88.0, leading: 16.0, bottom: 34.0, trailing: 16.0)
assigned directionalLayoutMargins: NSDirectionalEdgeInsets(top: 88.0, leading: 20.0, bottom: 34.0, trailing: 16.0)
주의 하 다.
system MinimumLayoutMargins 의 영향 을 받 지 않 으 려 면 view controller 의 view Respects System MinimumLayoutMargins 를 false 로 설정 하면 됩 니 다.
Navigation bar
iOS 11 에 들 어가 면 애플 은 더 예 쁘 고 눈 에 띄 는 큰 제목 의 스타일 을 제공 하 는데 이런 기능 을 켜 려 면 간단 하 다.
navigation bar 의 prefers Large Titles 를 true 로 설정 하면 iOS 11 의 큰 제목 스타일 이 자동 으로 생 깁 니 다.

self.navigationController.navigationBar.prefersLargeTitles = true
prefers Large Titles 는 navigation controller 에 설 치 된 navigation bar 에 있 음 을 알 수 있 습 니 다.이 navigation contrller 용기 에 있 는 모든 view contrller 가 이 설정 을 하면 영향 을 받는다 는 것 이다.따라서 현재 navigation contrller 에 새로운 view contrller 를 추가 하려 면 이 view contrller 도 큰 제목 이 될 것 입 니 다.따라서 이 문 제 를 피하 기 위해 UIKit 는 UINavigation Item 에 largeTitle DisplayMode 속성 을 제공 합 니 다.
이 속성 은 기본적으로 UINavigation Item.LargeTitle DisplayMode.automatic 입 니 다.앞 에 표 시 된 navigation item 과 일치 하 는 스타일 을 유지 합 니 다.나중에 view contrller 에서 큰 제목 스타일 을 피 하려 면 이렇게 설정 할 수 있 습 니 다.

self.navigationItem.largeTitleDisplayMode = .never
큰 제목 외 에 도 iOS 11 에 서 는 UIKit 가 navigation item 에 검색 관리 에 편리 한 인 터 페 이 스 를 제공 했다.
구체 적 인 참 고 는 다음 과 같다.

self.navigationItem.searchController = self.searchController
self.navigationItem.hidesSearchBarWhenScrolling = true
검색 컨트롤 러 를 설정 한 후 navigation item 의 searchController 속성 을 직접 제공 할 수 있 습 니 다.이렇게 하면 네 비게 이 션 표시 줄 에서 예 쁜 검색 상 자 를 볼 수 있 습 니 다.
또한 navigation item 의 속성 hides Search BarWhen Scrolling 을 true 로 설정 할 수 있 습 니 다.view contrller 에서 관리 하 는 scroll view 가 미 끄 러 질 때 자동 으로 search bar 를 숨 길 수 있 습 니 다.
Scroll view
view contrller 를 사용 하여 scroll view 를 관리 한 적 이 있다 면 automatically Adjusts Scroll View Insets 라 는 속성 이 낯 설 지 않 을 것 입 니 다.iOS 11 이전에 이 속성 은 view contrller 가 scroll view 의 content inset 을 자동 으로 관리 할 수 있 습 니 다.그러나 실제 개발 과정 에서 이러한 자동 관리 방식 은 번 거 로 움 을 가 져 올 수 있 습 니 다.특히 content inset 에서 동적 조정 이 필요 한 경우 도 있 습 니 다.
이 를 위해 iOS 11 에서 UIKit 는 automatically Adjusts ScrollViewInsets 속성 을 폐기 하고 이 직책 을 scroll view 자체 로 이전 합 니 다.따라서 iOS 11 에 서 는 이 문 제 를 해결 하기 위해 두 개의 scroll view 의 새로운 속성 이 있 습 니 다.하 나 는 콘 텐 츠 inset 행 위 를 조정 하 는 속성 을 관리 하 는 콘 텐 츠 Inset Adjustment Behavior 이 고,다른 하 나 는 조 정 된 채 워 진 속성 adjusted ContentInset 을 가 져 오 는 것 입 니 다.또한 UIScrollViewDelegate 는 개발 자가 inset 변 화 를 가 져 올 수 있 도록 새로운 프 록 시 방법 을 제공 합 니 다.

optional func scrollViewDidChangeAdjustedContentInset(_ scrollView: UIScrollView)
이로써 이'자동 으로 개발 자 에 게 inset 설정'의 특성 에 대해 애플 은 상당히 완 비 된 인 터 페 이 스 를 제공 한 셈 이다.
그러나 개발 자로 서 우리 가 주의해 야 할 것 은 contentInset 속성 을 자동 으로 설정 하 는 행위 에 의존 하면 새로운 iOS 11 의 어댑터 에서 조정 해 야 할 수도 있다 는 것 이다.
또한 개발 자가 scroll view 에서 Auto Layout.UIKit 를 사용 하 는 데 편리 하도록 두 개의 새로운 속성 을 제공 합 니 다.하 나 는 contentLayoutGuide 입 니 다.현재 scroll view 에 있 는 내용 을 가 져 오 는 layot guides 입 니 다.다른 하 나 는 frameLayoutGuide 입 니 다.실제 내용 을 가 져 오 는 layot guides 입 니 다.이렇게 말 하면 좀 번 거 롭 습 니 다.WWDC 의 원 도 를 보 세 요.

Table view
실제로 table view 의 가장 큰 업 데 이 트 는 새로운 기능 인 Drag and Drop 에 있 습 니 다.그러나 이 특성 은 적당 한 배합 에서 잠시 고려 할 필요 가 없다.본 고 는 소개 하지 않 고 다른 재 미 있 는 변 화 를 살 펴 보 자.
먼저 iOS 11 에서 table view 는 기본적으로 self-sizing 을 열 었 습 니 다.estimated Row Height,estimated Section Header Height,estimated Section Footer Height 가 기본 값 으로 UITable View Automatic Dimension 으로 설정 되 어 있 음 을 알 수 있 습 니 다.하지만 table View:height ForRow AtIndexPath 와 같은 방법 이 있 었 다 면 높이 로 되 돌아 간 것 을 알 고 있 습 니 다.그렇다면 레이아웃 에 영향 을 미 치지 않 을 것 이 며 iOS 11 에 적합 하 다 는 것 은 좋 은 소식 이다.
iOS 11 에 서 는 새로운 layot margins 개념 이 생 겨 UIKit 도 separator inset 에 추가 로 보완 했다.현재 separator inset 은 두 개의 소스 를 가 질 수 있 습 니 다.하 나 는 cell 의 가장자리 에서 시작 합 니 다(UITableView SeparatorInsetReference.from CellEdges).다른 하 나 는 table view 의 기본 충전 부터 시작 합 니 다(UITableView SeparatorInsetReference.from AutomaticInsets).이 가운데 기본 충전 은 table view 의 layot margins 가 제어 합 니 다.
이 밖 에 iOS 11 은 table view 에 더 많은 미끄럼 조작 제어 능력 을 추가 했다.다음 두 가지 UITableView Delegate 방법 을 통 해
실현:

func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
두 가지 방법 모두 UISwipe Actions Configuration 인 스 턴 스 를 되 돌려 달라 고 요구 하 는 것 을 알 수 있 습 니 다.이 인 스 턴 스 를 구성 하기 위해 서 는 UI ContextualAction 인 스 턴 스 로 구 성 된 배열 이 필요 합 니 다.UIContextualAction 은 원래 의 UITable View Row Action 과 대체적으로 유사 하지만 contextual action 의 매개 변수 handler 에서 handler 매개 변수 중의 completionHandler 를 호출 해 야 작업 을 완성 할 수 있 습 니 다.이 점 에서 우 리 는 새로운 action 에서 비동기 작업 과 관련 된 일 을 할 수 있 는 것 같다.
다음은 삭제 작업 의 예제 입 니 다.

override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
 let contextualAction = UIContextualAction.init(style: .destructive, title: "Delete") { (style, title, completionHandler) in
  //        
  completionHandler(true)
 }
 
 let actionsConfiguration = UISwipeActionsConfiguration.init(actions: [contextualAction])
 return actionsConfiguration
}
swipe actions configuration 에서 우 리 는 주의해 야 할 것 이 있 습 니 다.그것 이 바로 새로운 perms First Action With FullSwipe 속성 입 니 다.이 속성 설정(기본 오픈)을 열 면 첫 번 째 동작 에 full swipe 작업 을 제공 할 수 있 습 니 다.(과도 한 미끄럼 을 통 해 동작 을 촉발 하 는 상호작용)
기 존의 편집 프 록 시 방법 만 실현 된다 면 iOS 11 에서 첫 번 째 동작 은 full swipe 를 기본적으로 지원 하고 닫 을 수 없습니다.
Face ID
이미 Touch ID 를 만 들 었 다 면 실제로 Face ID 를 맞 추 는 것 은 어렵 지 않 을 것 이다.어떠한 변경 도 하지 않 더 라 도 Face ID 는 직접 사용 할 수 있 을 것 으로 예상 된다(글 을 쓸 때 아이 폰 X 가 아직 출시 되 지 않 았 다).물론 관련 체험 은 할인 을 받 을 것 이다.문안 과 관련 된 제시 작업 은 Touch ID 만 있 는 전제 에서 이 루어 지기 때문이다.
기 존 과 마찬가지 로 LAContext 류 를 통한 생체 인식 인증 이 가능 하 다.그러나 주의해 야 할 것 은 새로운 Face ID 인증 을 지원 하기 때문에 애플 은 LAContext 류 에 새로운 인터페이스 biometry Type 을 추가 하여 Touch ID 와 Face ID 를 구분 하 는 데 사용 했다.또한,기 존 에는 Touch ID 만 포 함 된 오류 유형 도 iOS 11 에서 폐기 되 었 으 며,이에 따라 애플 은 더욱 통용 되 는 새로운 오류 유형 을 제공 하여 대체 하 였 다.
IOS 11 은 UITableView 에 적합 합 니 다.
UIScrollView 와 그 하위 클래스 는 IOS 11 이전 버 전의 UI 가 완전히 정상 으로 표시 되 지만 IOS 11 에 서 는 기이 한 화면 이 표 시 됩 니 다.
 (1)먼저 UITablevIew 를 살 펴 본다.
VC 에 있 던 automatically Adjusts ScrollView Insets 가 만 료 되 었 습 니 다.IOS 11 에서 APPLE 는 UIScrollView 의 contentInset Adjustment Behavior 속성 을 사용 하여 스크롤 보기 의 내용 경 계 를 자동 으로 계산 하 는 것 을 추천 합 니 다.

@property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets
IOS 11 SDK 에서 UIScrollView 의 이 속성

@property(nonatomic) UIScrollViewContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior //            

{

UIScrollViewContentInsetAdjustmentAutomatic,//scrollView                    scrollView      ,       .

UIScrollViewContentInsetAdjustmentScrollableAxes, //      

UIScrollViewContentInsetAdjustmentNever, //  automaticallyAdjustsScrollViewInsets=NO       ,      

UIScrollViewContentInsetAdjustmentAlways//  safeAreaInsets (    )     

 }
따라서 IOS 11 에서 ScrollView 를 설정 해 야 합 니 다.

 self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
전역 설정 이 필요 하 다 면 이렇게 설정 해 야 합 니 다:

if (@available(iOS 11.0, *)) {

 

 [[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];

}
이렇게 설정 하면 UITableview,UICollectionView,UIScrollview 를 사용 할 때 이 속성 을 따로 설정 할 필요 가 없습니다.UIView 와 그의 하위 클래스 는 모두 UIAppearance 프로 토 콜 을 따 르 기 때 문 입 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
Reference
  • Positioning Content Within Layout Margins
  • directionalLayoutMargins
  • systemMinimumLayoutMargins
  • SafeAreaInsets
  • 좋은 웹페이지 즐겨찾기