WWDC/iOS

[iOS] WWDC23 - What's new in UIKit

유정주 2023. 6. 7. 23:06
반응형

서론

한글 자막을 지원하지 않아 파파고와 함께 정리를 해보았습니다.

ViewController Lifecycles, CollectionView 등등 아는 단어가 나오니 흥미가 더 생기는 거 같아요.

Internationalization 챕터에서는 한글에 대해서도 나옵니다 ㅎㅎ

 

또한, 매크로와 관련된 내용도 포함되어 있습니다.

매크로는 WWDC 23에서 Swift macros로 소개된 기능인데요.

[Swift] WWDC23 - What's new in Swift에서 소개를 다루고 있으니 참고 부탁드립니다.

 

WWDC23부터는 챕터 기능을 지원합니다.

따라서 포스팅도 챕터 단위로 문단을 나눴습니다.

 

Key feature: Xcode previews

UIKit으로 Xcode Preview를 사용할 수 있습니다.

 

Preview 매크로(#Preview)를 사용해 Preview 이름을 지정하고, ViewController를 반환하면 미리보기를 사용할 수 있습니다.

 

 

또한, ViewController 없이도 UIView를 미리 볼 수 있습니다.

Preview를 사용하면 UI 구성요소를 시각화하고 코드르 반복할 때 즉시 피드백을 받을 수 있습니다.

 

 

Key feature: View controller lifecycles

다음은 ViewController의 Lifecycle 내용입니다.

ViewController가 present 될 때, NavigationController에 의해 push, pop 될 때의 생명주기가 개선되었습니다.

 

 

viewIsAppearing(_:)이 새로 생겼습니다.

viewIsAppearing 메서드는 viewWillAppear 이후, viewDidAppear 이전에 호출됩니다.

이 생명주기 메서드는 View가 나타날 때마다 UI를 업데이트를 하는 작업에 적합합니다.

viewIsAppearing은 iOS 13부터 지원하므로 지금도 활용할 수 있습니다.

(참고로 https://developer.apple.com/documentation/uikit/uiviewcontroller/4195485-viewisappearing 공식 문서도 추가되었습니다.)

 

 

viewIsAppearing에 대해 조금 더 자세히 설명합니다.

viewWillAppear는 View가 계층에 추가되기 전에 호출되므로 View의 크기나 다른 기하학적 구조에 따라 달라지는 것을 수행하기엔 너무 이릅니다.

반대로 viewDidAppear는 모든 CATransaction이 완료된 후 호출되기 때문에 원하는 업데이트 내용을 표시하기에 너무 늦습니다.

viewIsAppearing은 viewWillAppear와 동일한 transaction에 호출됩니다.

따라서 transition의 첫 번째 프레임에서 사용자에게 동시에 표시됩니다.

 

 

마지막으로 viewIsAppearing와 viewWillLayoutSubviews에는 중요한 차이가 있습니다.

레이아웃 콜백은 View가 실행될 때마다 호출되기 때문에 transition 동안에, 혹은 View가 표시되는 동안에 언제든지 호출될 수 있습니다.

그러나 viewIsAppearing은 모양이 변할 때 단 한 번만 호출되며, view가 레이아웃이 필요 없을 때도 호출됩니다.

따라서 viewIsAppearing는 적절한 타이밍에 적절한 주기로 호출되므로 더 효율적입니다.

 

 

Key feature: Trait system enhancements

Trait system은 iOS 17에서 업그레이드 되었습니다.

Traits은 앱의 계층 구조를 통해 데이터를 자동으로 전파합니다.

 

UITraitCollection은 많은 시스템 Traits(사용자 인터페이스 스타일, 수평, 수직 크기 클래스, 선호되는 컨텐츠 크기 카테고리)을 포함하고 있습니다.

UITraitCollection을 통해 완전히 새로운 방법으로 앱의 View와 ViewController에 데이터를 전파할 수 있습니다.

또한, 새로운 API를 이용해 모든 View 또는 ViewController에서 trait을 쉽게 수정할 수 있으며,

하위 클래스에서 trafficCollectionDidChange 없이도 값이 변경될 때마다 콜백을 수신할 수 있습니다.

마지막으로 SwiftUI 환경키를 사용해 UIKit과 SwiftUI 구성 요소 간에 데이터를 원할하게 전달할 수 있습니다.

 

 

더 자세한 내용은 WWDC23 - Unleash the UIKit trait system 에서 다룹니다.

 

 

Key feature: Animation symbol images

SF 심볼즈를 이용하면 모든 플랫폼에서 일관된 아이콘을 사용할 수 있습니다.

 

 

iOS 17에서 UIKit은 애니메이션 심볼을 지원합니다.

이 효과는 모든 기호 이미지, 사용자 지정 이미지에도 적용됩니다.

 

 

UIImageView의 addSymbolEffect 메서드를 통해 효과를 적용할 수 있고,

removeSymbolEffect를 호출하면 효과를 지울 수 있습니다.

 

 

setSymbolImage 메서드를 이용하면 심볼 전환 효과를 넣을 수 있습니다.

 

 

더 많은 효과에 대해서는 WWDC23 - Animate symbols in your app에서 다룬다고 합니다.

 

 

Key feature: Empty states

인터넷 불량 등으로 인해 컨텐츠를 표시할 수 없을 때가 있습니다.

UIContentUnavailableConfiguration을 이용해 제공할 컨텐츠가 없음을 나타낼 수 있습니다.

 

 

loading 상태도 설정할 수 있습니다.

 

 

SwiftUI와도 함께 사용할 수 있습니다.

 

 

ViewController에서 컨텐츠 없음을 나타내는 가장 좋은 방법은 updateContentUnavailableConfiguration(using: state) 안에서 정의하는 것입니다.

위 예시는 search config를 사용해 검색 결과가 없음을 나타내고 있습니다.

 

 

Internationalization

이번 섹션에서는 동적 줄 높이 조정에 대해 설명합니다.

특정 글꼴 및 언어 텍스트 클리핑 및 충돌을 방지하는데 도움이 되는 기능입니다.

또한, 개선된 줄 바꿈, hyphenation 규칙, locale을 기준으로 이미지를 요청하는 새로운 API에 대해서도 다룹니다.

 

 

일부 폰트는 글자가 기준선 위아래로 넘습니다.

 

 

아랍어, 힌디어, 태국어와 같은 일부 언어의 경우 라틴 문자보다 훨씬 더 많은 세로 공간을 필요하므로 충돌이나 클리핑 문제가 생길 수 있습니다.

 

 

모든 언어에서 이러한 기준선 침범을 방지하기 위해 동적 선 높이 조정 기능을 도입했습니다.

UILabel과 TextView가 최적의 가독성을 위해 선 높이와 수직 치수를 자동으로 조정합니다.

 

 

또한, 중국어, 독일어, 일본어, 한국어에서 줄 바꿈 동작을 크게 개선했습니다.

이러한 개선 사항은 사용 중인 텍스트 스타일에 따라 다양한 규칙을 적용합니다.

 

 

텍스트 스타일을 채택하는 한 대부분의 경우 자동으로 동작하지만,

모든 언어에서 작동하는지 확인하는 방법을 알고 싶다면 WWDC23 - What's new with Text and Text Interactions을 참고하세요.

 

 

UIKit은 local에 따른 8개의 textbox SF Symbol을 지원합니다.

기본적으로는 현재 설정 언어와 동일한 이미지를 가져옵니다.

iOS 17에서는 locale로 특정 이미지를 요청할 수 있습니다.

 

 

iPad: Window dragging

드래그 제스처가 시작될 수 있는 영역을 확장하여 Stage Manager의 윈도우 드래깅 기능을 개선했습니다.

UINavigationBar 내부의 아무 곳이나 드래그를 하면 윈도우가 이동됩니다.

 

 

UINavigationBar를 사용하지 않는 경우 UIWindowSceneDragInteraction을 채택해서 추가할 수 있습니다.

또한, 충돌이 없도록 앱의 다른 제스처와의 관계를 설정할 수 있고, Mac Catalyst에서도 바로 사용할 수 있습니다.

 

 

iPad: Sidebar and Stage Manager

열 스타일(Column-style)인 UISplitViewControllers에서 Stage Manager의 크기 조정 동작이 새로워졌습니다.

 

 

사이드바는 자동으로 숨겨지며,

 

 

사이드바가 더 좁은 폭으로 요청되면 오버레이 또는 변위 동작을 사용합니다.

 

 

iPad: Document support

iPadOS 17에서 문서 중심 앱의 지원을 개선했습니다.

 

UIKit은 새로운 UIDDocumentViewController을 지원합니다.

시스템 기본 환경을 보장하며, 제목 메뉴 자동 구성, 공유, 드래그 앤 드롭, 주요 명령 등과 같은 많은 기능을 기본으로 제공합니다.또한 이제 UIDocument는 UINavigationItemRenameDelegate를 준수하며, 전체 이름 바꾸기 경험을 제공합니다.

 

더 자세한 내용은 WWDC23 - Build better document-centric apps에서 다룹니다.

 

 

iPad: Apple Pencil

애플펜슬은 새로운 iPad Pro와 iOS 16.4에서 호버를 도입했습니다.

UIHoverGestureRecognizer를 사용하여 애플펜슬로 호버를 캡처할 수 있습니다.

 

zOffset은 0 ~ 1 사이의 정규화된 호버 거리를 반영하고, 호버 범위에서 연필의 고도와 방위를 이용해 브러시 스트로크가 화면에 어떻게 표시되는지 미리 보여줍니다.

홈 화면과 앱의 toolbar 아이콘도 호버할 수 있습니다.

 

 

iOS 17의 PencilKit에서는 더 많은 잉크를 지원합니다.

이전 버전의 iOS에서는 새 잉크가 포함된 PKDrawings를 로드할 수 없습니다.

이전 버전과 호환셩을 유지할 수 없는 경우 maximumSupportedContentVersion API를 사용해 최대버전을 제한할 수 있습니다.

 

 

iPad: Keyboard scrolling

iOS 17에서는 키보드를 이용해 UIScrollView를 페이지 업, 다운, 홈 및 종료키를 사용하여 스크롤 할 수 있습니다.

 

 

General: Collection Views 

CollectionView 속도 개선

iOS 17은 1만 개의 항목이 포함된 CollectionView의 역정렬 속도가 iOS 16보다 2배 가까이 빠르며,

해당 항목의 절반을 삭제하는 업데이트 수행 속도도 3배 더 빠릅니다.

또한, 애니메이션 없이 업데이트를 수행하면 CollectionView 성능이 더욱 향상됩니다.

 

Snapshot을 이용한 DiffableDataSource를 사용하든, 수동으로 업데이트를 하든 iOS 17에서는 전체적으로 속도가 더 빠릅니다.

이러한 개선 사항은 앱의 응답성을 높입니다.

 

 

Compositional Layout

iOS 17에서는 UniformAscrossSiblings이 추가됩니다.

레이아웃의 자체 크기 조정 항목이 가장 큰 항목의 크기에 따라 일관된 크기로 설정될 수 있습니다.

 

이러한 레이아웃이 필요한 경우, estimated dimensions를 uniformAcrossSiblings로 설정하면 됩니다.

단, 그룹의 모든 항목을 만들고 크기를 가져와야 하므로 그룹에 항목이 많을 때는 사용하지 마세요.

 

 

General: Spring Animations

스프링 애니메이션을 더 쉽게 사용할 수 있도록 파라미터를 새롭게 개선하고 있습니다.

 

duration과 bounce 파라미터만 사용합니다.

 

더 자세한 내용은 WWDC23 - Animate with Springs에서 확인할 수 있습니다.

 

 

General: Text interactions

iOS 17에서는 텍스트와 상호작용하는 새로운 기능과 API가 추가됩니다.

 

 

텍스트 커서와 텍스트 선택 UI가 개선되었습니다.

사용자 정의 TextView를 만드는 개발자는 UITextInteraction 채택 없이도 시스템 제공 selection UI를 사용할 수 있습니다.

 

 

UITextViewDelegate의 새로운 API를 이용해 액션이나 메뉴를 사용할 수 있습니다.

 

Text Interaction과 관련된 더 자세한 내용은 WWDC23 - What's new with text and text interactions에서 확인할 수 있습니다.

 

 

General: Status bar

iOS 17에서 상태바는 앱의 컨텐츠에 따라 light-dark 모드가 자동으로 변경됩니다.

 

 

General: Drag and drop

iOS 17에서는 드래그 앤 드롭도 강화되었습니다.

 

 

지원되는 파일과 컨텐츠를 드롭하여 해당 앱에서 직접 열 수 있습니다.

이 기능은 아무 변경 없이도 자동으로 작동합니다.

 

앱에 파일이나 링크를 드롭하면 UIScene Delegate를 통해 열립니다.

이 기능을 선택하려면 앱에서 지원되는 문서 유형을 정의행 ㅑ합니다.

 

 

General: HDR images

UIImageView는 ISO HDR 이미지 지원이 되며, UIGraphicsImageRenderer로 조작할 수 있습니다.

또한, 새로운 UIImageReader는 카메라롤에서 ISO HDR로 변환하는 등 더 많은 제어를 제공합니다.

 

이에 대해서는 WWDC23 - Support HDR images in your app에서 자세히 다룹니다.

 

 

General: Page control

새로운 progress 및 timer progress API를 이용해 페이지가 변경되는 시기에 더 나은 context를 제공할 수 있습니다.

 

 

progress 속성을 이용해 UIPageControl에 속성을 설정하면 됩니다.

UIPageControlTimerProgress는 각 페이지의 지속 시간을 쉽게 나타낼 수 있도록 타이머가 내장되어 있습니다.

타이머가 완료되면 자동으로 다음 페이지로 이동합니다.

 

 

General: Palette menus

iOS 17과 맥 소노라에서는 팔레트 메뉴를 선보입니다.

 

 

이 팔레트는 아이템을 선택하는데 사용됩니다.

 

 

메뉴를 팔레트로 만들려면 .displayAsPalette 를 추가하면 됩니다.

 

 

선택 이미지를 설정할 수도 있습니다.

 

 

tvOS menus

tvOS 17부터는 모든 API를 새로운 appearance와 native tvOS에서 사용할 수 있습니다.

 

감사합니다.


아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

 

반응형