https://developer.apple.com/videos/play/wwdc2022/10068/
생산성을 위한 UIKit 개선
1. 커스텀이 가능한 네비게이션바
2개의 네비게이션 방식을 추가해서 문서 기반의 앱을 제공함
- 브라우저 스타일
웹과 문서 브라우저처럼 이력이나 폴더 구조 탐색하기 적합
- 편집기 스타일
문서 편집을 고려해서 만든 것
하위 그룹에 속한 버튼들이고 위 버튼은 Customize Toolbar를 통해 순서를 바꿀 수 있음
이렇게 분할화면의 경우 공간이 좁아질 때는 하위그룹 버튼은 우상단 더보기 버튼을 통해 접근 가능하다.
2. Title menu
새로운 네비게이션 스타일에 맞는 Title menu도 제공한다.
- 복제, 이동, 이름변경, 내보내기, 인쇄 등을 제공
- delegate 내의 메소드를 통해 자동으로 메뉴가 제공되고, 커스텀 항목도 추가 가능
Mac Catalyst로 빌드하면 개선된 네비바를 사용할 수 있는데 추가 코딩이 필요없다.
3. 새로운 텍스트 편집 방식, Find and replace
UIKit에 내장되어 있는 UITextView, WKWebView, PDFView에서 flag를 설정하면 이 기능을 활성화 가능함
4. Edit menu 대규모 업데이트 (편집 인터렉션)
입력 방식에 따라 다르게 보임
터치 인터렉션도 다시 설계함
포인터를 사용하면 모든 기능이 있는 context menu가 나타남
-> UIEditMenuInteraction을 도입하고, UIMenuController를 대체함
Materials in Sidebar
Slide over 모드의 사이드바는 추가 코드 없이도 활성화된다.
Control enhancements
UICalendarView
기존에는 UIDatePicker를 썼다면 이건 모든 기능이 있는 독립요소임
- 단일 날짜, 여러 날짜 선택이 가능하고
- 여러 범위의 날짜를 선택할 수 있고,
- 가능한 날짜 범위를 선택 가능하고
- 선택 범위에서 일부 날짜를 제외시키는 것도 가능
- 각 날짜 장식도 가능
가장 큰 차이는
캘뷰가 날짜를 표현할 때 NSDate가 아닌 NSDateComponent로 표현한다는 것임
NSDate는 시간의 한 지점을 나타냄
그래서 데컴이 개념이 유연해서 명확하게 지정해야 함
그레고리력을 사용하고 싶으면 이제는 그레고리력이라고 명확하게 지정해야 한다는 것임
UICalendarView 사용방법
캘뷰를 만들어서 델리게이트 대리자 위임처리해주고
캘뷰 설정을 그레고리력으로 하고 싶으면 Gregorian NSCalendar로 그렇게 지정해줘야 함
캘뷰에 장식을 하고 싶으면 decorationForDateComponents 메소드를 사용한다.
- 장식이 없으면 nil을 반환하고
- default 값은 회색 점이다.
- 색을 커스텀할 수 있는 이미지 뷰도 반환할 수 있다.
- customView를 만들어서 반환하면 더 다양한 형태를 추가할 수 있다. (대신 인터렉션이 제공되진 않고, 고정됨)
UIPageControl 개선
- 페이지컨트롤의 방향이나 지향을 커스텀할 수 있다. (가로 외에도 세로도 가능)
보안 중심의 UIPasteControl
애플은 보안 이슈를 중요시 여겨서 매번 복사하면 클립보드에 추가됐다고 배너가 뜨는데
iOS16에선느 배너 대신에 클립보드의 사용허가를 묻는 알림창이 나타남
사용자가 시스템의 붙여넣기 시스템을 사용하면 암묵적인 허가라고 판단해 알림을 피할 수 있다.
이 UIPasteControl은 어딘가에서 복사하기를 한 후에 클립보드에 동일한 콘텐츠를 붙여넣기를 할 경우에 활성화된다.
API refinement
1. sheets
iOS15에서는 sheets가 유동적으로 움직이게 하는 dynamic UI를 적용했는데
iOS16에서는 detent를 통해 다양한 사이즈로 조절할 수 있게 했다.
이 기능을 활용하려면 .custom detent를
사용해서 sheet의 높이를 줘야 한다.
- 최대 높이에서의 비율값을 반환해도 되고
- 특정 값을 반환해도 된다.
그리고 safeArea를 알아서 고려해주니까 신경쓰지 않아도 됨
2. SF Symbols
SF Symbol도 이번에 업데이트 됐는데 아래처럼 4가지 렌더링 모드를 제공한다.
iOS15와 그 이전에는 별도의 선택을 안하면 모노크롬으로 제공했는데
iOS16에서는 계층형 렌더링을 기본모드로 사용
Variable Symbols 변수 렌더링
더 나아가서, 0과 1 사이의 값으로 symbol의 변화를 나타낼 수 있다.
아래처럼 0인 경우에는 볼륨음파가 없고, 1로 가까워지면 볼륨 음파가 더 많아지게 설정함
변수가 제거된 형태의 심벌도 제공하고,
변수가 있는 심벌의 경우는 아래처럼 코드를 작성하고
변수 이외에도 렌더링 모드 같은 것도 함께 설정 가능하다.
커스텀 심벌을 업데이트해서 다양한 변수 심벌을 제공할 수 있음
3. Swift Concurrency
(내용 추가 필요)
4. Stage Manager
외부 디스플레를 위해 강력한 성능을 지원함
앱 업데이트 안해도 되는데 UIScreen API를 사용하는 경우에는 지원 안함
UIScene API를 사용하면 제공 -> 다중 창 사용 가능
5. Self Resizing Cells
셀이 알아서 크기를 바꿈
새로운 콘텐츠에 맞춰서 자동으로 셀 크기를 조정함, 기본적으로 활성화되어 있음
selfSizingInvalidation을 통해 제어가 가능함
- 활성화되어 있으면 셀은 크기 조정을 요청
- UIListContentConfigurtaion으로 셀을 설정하면, 셀의 설정이 바뀔 때마다 자동으로 invalidation됨
- 셀의 invalidateIntrinsicContentSize 메소드를 호출해서 조정해라
(내용 추가 필요)
UIKit과 SwiftUI를 같은 앱에 동시 적용하게 했다.
스유를 통해 테블뷰, 컬렉션뷰를 만들 수 있다. = UIHostingConfiguration을 통해 가능한데
이 코드 한 줄이면 따로 셀이 필요 없고 바로 셀 안에 코드를 작성할 수 있다.
사용자가 추적되는 것을 방지하기 위해
UIDevice.name은
유저의 커스텀한 디바이스 이름이 아닌 모델 이름을 반환한다.
커스텀 설정한 이름을 반환하려면 권한을 받아야 한다.
UIDevice.orientation은 지원하지 않고 대신 PreferredInterfaceOrientation을 사용해서 핸드폰 가로/세로 모드 사용하자