ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • What's new in UIKit (feat. WWDC 2025)
    UIKit 2025. 6. 21. 20:20

    안녕하세요. 그린입니다 🍏

    이번 포스팅에서는 WWDC 2025에서 발표한 What's new in UIKit 세션에 대해 알아보겠습니다 🙋🏻

     


    New Design System

     

    역시나 Liquid Glass에 대한 소개죠.

    막대 및 서치, 알림, 팝오버, 스플릿 뷰까지 모두 Liquid Glass가 적용된 디자인이 나왔다는걸 설명해주는 스텝입니다.

     

    이 부분에 대해서는 바로 이전 포스팅에서 아주 상세히 다뤄봤으니 관심이 있다면 참고해주세요 🙏🏻

     

     

    Build a UIKit app with the new design (feat. WWDC 2025)

    안녕하세요. 그린입니다 🍏이번 포스팅에서는 WWDC 2025에서 소개된 Build a UIKit app with the new design 세션을 정리해보겠습니다 🙋🏻 Build a UIKit app with the new designLiquid Glass를 앱에 가져와서 적용하는

    green1229.tistory.com

     


    Containers and adaptivity

    이제 앱 컨텐츠가 다양한 장치와 화면에 맞춰 적응하도록 도와주는 개선 사항들에 대해 살펴봅니다.

    iOS 26에서는 UISplitViewController는 Inspector 지원을 받습니다.

     

     

    Inspector는 선택한 컨텐츠의 추가 사항을 제공해주죠.

    사진에 대한 메타데이터 등도 표시해줄 수 있죠.

    또한 스플릿 뷰에서 컨테이너 뷰의 크기도 제어할 수 있습니다.

     

    이에 대해 더 관심이 있다면 아래 세션을 참고해주세요!

     

     

    Make your UIKit app more flexible - WWDC25 - Videos - Apple Developer

    Find out how your UIKit app can become more flexible on iPhone, iPad, Mac, and Apple Vision Pro by using scenes and container view...

    developer.apple.com

     


    The menu bar

    iOS 26에선 iPad에 macOS 메뉴 바가 등장했습니다.

     

     

    상단에서 스와이프 시 앱의 전체 메뉴가 표시되죠.

    이를 통해 앱의 전체 메뉴와 키보드 단축키가 없는 명령어까지 앱의 모든 명령어가 표시됩니다.

    즉, 사용자가 앱의 모든 기능을 알 수 있도록 해줍니다.

     

    앱은 여전히 UIMenuBuilder로 메인 메뉴를 사용자화 합니다.

    iOS 26에선 UIKit에 다수 새 API가 추가되어 메뉴 바가 더 향상되었어요.

     

    해당 API들을 이용하면 기존에 메인 메뉴에 제공된 시스템 명령을 앱이 사용자 지정할 수 있어요.

    또한 각 요소 그룹들도 세밀하게 구성하고 스타일도 지정할 수 있죠.

    UIMenuBuilder 블럭을 미리 제공해 맞춤 항목을 추가하면 앱과 공유 확장 프로그램이 키보드 단축키를 정의하는데 동일한 코드를 사용하도록 합니다.

     

     

    위 코드를 보면 먼저 구성 객체를 만들어 앱이 메인 메뉴에 원하는 명령을 기본적으로 지정합니다.

    Inspector 패널을 토글하는 새 명령어 등 특정 기본 명령어는 선택을 해제하겠습니다.

    또한 구성을 통해 시스템 검색 명령을 단일 검색 항목으로 변환하는 등 기본 명령에 대한 스타일도 제공할 수 있죠.

    위 search 부분은 텍스트보다 컨텐츠를 검색하는 사진 혹은 음악 앱에서 사용하기에 적합하죠.

     

     

    마지막으로 메인 메뉴 시스템에서 구성을 설정해 구성을 원하는 요소의 초기 셋으로 구축할 수도 있죠.

    선택적으로 핸들러도 제공할 수 있죠.

     

    iOS 및 macOS의 메뉴 바에는 표준 동작과 메뉴가 새로 추가되었어요.

    Perform close는 cmd-W에 매핑되어 기본적으로 창을 닫습니다.

    클립보드에서 새로 만들기 메뉴 명령을 사용해 붙여넣기 경고를 트리거하지 않고도 붙여넣기 보드 컨텐츠로 문서를 만들 수 있죠.

    또한, 텍스트 정렬과 사이드바 토글, Inspector 토글 시 표준 작업이 노출되어 앱에서 커스텀이 가능합니다.

     

     

    기본적으로 키보드 단축키는 키가 눌렸을때 반복되지만, UIKeyCommand에서 repeatBehavior 속성을 설정하면 이 동작을 사용자화할 수 있죠.

    validateCommand를 사용해 응답자별로 설정할 수도 있어요.

    삭제 키를 눌러 이메일을 삭제하는 등 말이죠.

    실수로 반복적으로 트리거하지 않도록 할 수 있기 때문이죠.

     

    메뉴바를 만들때 명심해야될 부분이 있습니다.

     

    1️⃣ UIKit 앱에서 스토리보드에 정의된 메뉴 바가 이제는 지원되지 않아 앱이 스토리보드에 메뉴를 실행하지 않기 때문에 이제는 코드로 직접 구현해야 합니다.

    2️⃣ 메뉴 바가 항상 있는것이 아니니 메뉴 바 없이도 앱의 기능에 접근할 수 있는지 확인해야 해요.

     


    Automatic observation tracking

    UIKit의 Swift Observable 객체를 위한 내장 지원 기능입니다.

    UIKit은 Swift 관찰을 중심으로 update 메서드에 통합합니다.

    layoutSubView() 메서드에 말이죠.

    참조하는 Observable을 자동 추적하여 종속성을 연결하죠.

    수동으로 setNeedsLayout을 할 필요가 없어요.

    iOS 18에서 Info.plist에 UIObservation TrackingEnabled를 추가해 다시 배포할 수 있습니다.

    iOS 26에선 기본적으로 활성화 되어 있죠.

     

     

    우리가 알던 iOS 17에서 나온 Observation 프레임워크의 @Observable을 사용할 수 있죠.

    viewWillLayoutSubviews()에서 관찰 가능한 모델로 설정할 수 있어요.

     

    다른 또 하나의 예를 볼까요?

     

     

    컬렉션뷰에서도 쓰임이 편리합니다.

    configurationUpdateHandler에서 관찰 추적을 지원하기에 이 안에서 Observable 객체를 사용하면 편하죠.

    이제 모델의 속성이 변경되면 UIKit이 이 핸들러를 재실행하여 업데이트를 해주죠.

     


    New UI update method

    또한, 이제는 UIKit에 일반적인 용도의 업데이트 메서드가 추가되어 자동 특성 및 관찰 추적 기능이 지원됩니다.

    updatePropertites() 메서드가 추가되었어요.

    layoutSubviews() 메서드 직전에 실행되지만 독립적이라 레이아웃을 강제하지 않고 속성을 무효화시킬 수 있습니다.

    혹은 setNeedsUpdateProperties()를 수동으로 호출하여 사용할 수도 있죠.

     

    예시를 볼까요?

     

     

    요렇게 updateProperties에 구현해둘 수 있습니다.

    즉, 불필요한 작업은 줄이고 성능은 개선할 수 있죠.

     

    updateProperties()의 작동 방법을 설명하기 위해 UIKit 업데이트 패스의 작동 방식을 알아볼께요.

     

     

    UIKit 업데이트 뷰가 화면에 표시되기 전의 모습입니다.

    레이아웃 패스가 먼저고 UIKit은 계층 뷰를 위에서부터 가로지르며 각 뷰의 특성을 업데이트하고 layoutSubView()를 호출하죠.

    이 패스로 인해서 다른 뷰에 레이아웃이 요구될 경우에 모든 레이아웃이 마칠 때까지 레이아웃 패스가 반복되죠.

    레이아웃이 자리를 잡으면 그 후 UIKit이 디스플레이 패스를 실행해 각 뷰에서 드로우 메서드를 호출하는 식이죠.

    이 두 패스가 다 끝난 프레임을 렌더링하여 화면에 표시됩니다.

     

    그럼 여기서 새로운 메서드죠!

     

     

    updateProperties()죠.

    layoutSubViews() 직전에 호출되죠.

    Update traits이 먼저 실행되기에 updateProperties에서 잘 읽을 수 있죠.

    항상 layoutSubviews()보다 앞서 포함된 레이아웃 무효화가 가능하고 레이아웃 경로는 그 직후에 실행되죠.

     


    Improvements to animations

    해당 메서드 보완과 새 추적 기능을 위해 애니메이션 방식도 개선되었어요.

     

    iOS 18 이전 버전에서는 이렇습니다.

     

     

    해당 단계에서 layoutIfNeeded에 의존하죠.

    수동으로 속성과 뷰 의존성을 유지하면 오류가 발생할 수 있고 업데이트 또는 애니메이션이 너무 많거나 적을 수 있죠.

     

    iOS 26에서는 UIViews에 flushUpdates라는 새 애니메이션을 사용할 수 있어요.

    이 활성화를 통해 UIKit은 보류하던 업데이트를 애니메이션 직전과 직후에 적용해 더 이상 layoutIfNeeded()를 호출할 필요가 없죠.

    flashUpdates를 작동시키려면 무효화 상태 변경사항을 애니메이션 클로저 내에서만 적용해야 합니다.

     

     

    요렇게 사용할 수 있죠.

    모든 뷰가 필요한 업데이트를 자동으로 실행해요.

     


    Scene updates

    UIHostingSceneDelegate이 생겼습니다.

    UIKit에서 SwiftUI 씬이 지원되어 점진적인 SwiftUI 도입에 도움을 주죠.

     

     

    이렇게 사용될 수 있습니다.

     

     

    새 씬이 연결될 때 UISceneConfiguration에서 위임 클래스 유형을 설정하면 되는것이죠.

     

     

    요렇게 특정 SwiftUI 씬을 메서드로 요청할 수도 있습니다.

     


    HDR Color support

    iOS 26에선 HDR을 이미지뿐 아니라 색상에도 활용합니다.

    새로운 인터페이스를 강조하거나 경험을 줄 수 있죠.

     

     

    밝기도 지원이 가능해요.

     

     

    UIColorPickerViewController와 UIColorWell에서 이제 HDR 선택 기능도 활성화 할 수 있습니다.

    앱의 렌더링 역량에 따라 설정하면 됩니다.

    iOS 18에서 UIImageView는 HDR에서 SDR로 지능적으로 폴백하여 UI의 주요 컨텐츠가 눈에 띄도록 합니다.

    UITraitHDRHeaderoomUsage를 이용할 수 있어요.

     

     


    Swift notifications

    iOS 26에서 NSNotification.Name API와 UIKit으로 구축하면 각 알림이 전용 NotificationCenter.Message로 타입으로 나타납니다.

    이러면 관찰자 등록 및 이벤트 세부사항 불러오기를 위한 값들을 받을 수 있죠.

     

     

    여기서 핸들러에서 메시지로부터 직접 애니메이션 지속 시간과 키보드 프레임을 추출합니다.

    userInfo 룩업이나 수동 캐스팅 없이도 이런 값을 사용할 수 있죠.

     


    Migrate to scene-based life cycle

    이제 레거시인 UIApplicationDelegate 콜백과 UIApplicationLaunchOptionKeys는 더 이상 사용되지 않고, UIWindow용 이니셜라이저만 남습니다.

     

    iOS 26 이후 릴리즈에서 최신 SDK로 구축된 UIKit 앱은 전부 UIScene 라이프사이클을 사용해야만 실행할 수 있습니다.

    UIScene 라이프사이클을 멀티 윈도우 앱뿐 아니라 모든곳에 활용합니다.

     

    이에 대해서는 더 자세히 알아보는것이 좋을것 같아요 🥲

     

     

    TN3187: Migrating to the UIKit scene-based life cycle | Apple Developer Documentation

    Update your app to receive scene-based life-cycle events and manage your user interface using scene objects and methods.

    developer.apple.com

     


    OpenURL support for file URLs

    다양한 문서 유형을 다루는 앱이라면 외부 뷰어를 자주 실행해야 할 수 있어요.

    iOS 26에선 이제 기존 openURL 메서드에 파일 URL이 허용되어 앱에서 기본적으로 지원되지 않는 문서도 배포가 가능해졌어요.

    해당 파일 지원을 위한 앱이 존재할 경우 시스템이 앱을 실행하고 URL을 따라 전달합니다.

    그렇지 않으면 openURL은 false를 반환하여 퀵 룩 미리보기 제어기를 사용하는 등 폴백을 직접 처리하는 옵션을 제공합니다.

     


    SF symbols 7

    SF symbols 7는 기호를 그릴 수 있으며 두가지 효과가 있습니다.

     

     

    이제 변수 값의 새로운 모드인 변수 드로우를 지원해요.

    즉, 이제 더 애니메이션화가 잘 되었고 지원된다는 소리죠.

    이건 사실 뭐 더 살펴볼건 없고 좀 더 애니메이션 버튼 지원이 된다로 보면 좋을것 같습니다 😃

     

     

    UIButton 전환에 힘을 쓸 수 있죠.

     

     

    마지막으로 이렇게 렌더링 모드 설정도 가능합니다.

    그라디언트를 명시해 더 표현해줄 수 있죠.

     


    Conclusion

    변화가 엄청 많은건 아니지만, 우리에게 체감되는건 Scene 기반으로 해야 이제는 우리 프로젝트가 돌아갈 수 있다는것과 Observation을 UIKit에서도 편리하게 적용해볼 수 있다는 점입니다.

    iOS 26으로 컴파일 해볼까요?

     


    References

     

    What’s new in UIKit - WWDC25 - Videos - Apple Developer

    Modernize your app with the latest APIs in UIKit, including enhanced menu bar support, automatic observation tracking, a new UI update...

    developer.apple.com

    'UIKit' 카테고리의 다른 글

    Build a UIKit app with the new design (feat. WWDC 2025)  (3) 2025.06.18
Designed by Tistory.