View in English

  • Apple Developer
    • 시작하기

    시작하기 탐색

    • 개요
    • 알아보기
    • Apple Developer Program

    알림 받기

    • 최신 뉴스
    • Hello Developer
    • 플랫폼

    플랫폼 탐색

    • Apple 플랫폼
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    • App Store

    피처링

    • 디자인
    • 배포
    • 게임
    • 액세서리
    • 웹
    • 홈
    • CarPlay
    • 기술

    기술 탐색

    • 개요
    • Xcode
    • Swift
    • SwiftUI

    피처링

    • 손쉬운 사용
    • 앱 인텐트
    • Apple Intelligence
    • 게임
    • 머신 러닝 및 AI
    • 보안
    • Xcode Cloud
    • 커뮤니티

    커뮤니티 탐색

    • 개요
    • Apple과의 만남 이벤트
    • 커뮤니티 주도 이벤트
    • 개발자 포럼
    • 오픈 소스

    피처링

    • WWDC
    • Swift Student Challenge
    • 개발자 이야기
    • App Store 어워드
    • Apple 디자인 어워드
    • 문서

    문서 탐색

    • 문서 라이브러리
    • 기술 개요
    • 샘플 코드
    • 휴먼 인터페이스 가이드라인
    • 비디오

    릴리즈 노트

    • 피처링 업데이트
    • iOS
    • iPadOS
    • macOS
    • watchOS
    • visionOS
    • tvOS
    • Xcode
    • 다운로드

    다운로드 탐색

    • 모든 다운로드
    • 운영 체제
    • 애플리케이션
    • 디자인 리소스

    피처링

    • Xcode
    • TestFlight
    • 서체
    • SF Symbols
    • Icon Composer
    • 지원

    지원 탐색

    • 개요
    • 도움말
    • 개발자 포럼
    • 피드백 지원
    • 문의하기

    피처링

    • 계정 도움말
    • 앱 심사 지침
    • App Store Connect 도움말
    • 새로 추가될 요구 사항
    • 계약 및 지침
    • 시스템 상태
  • 빠른 링크

    • 이벤트
    • 뉴스
    • 포럼
    • 샘플 코드
    • 비디오
 

비디오

메뉴 열기 메뉴 닫기
  • 컬렉션
  • 전체 비디오
  • 소개

더 많은 비디오

  • 소개
  • 요약
  • 자막 전문
  • 코드
  • UIKit 앱 현대화하기

    UIKit의 최신 업데이트를 살펴보세요. iPhone 미러링 사용 시 및 iPad에서 크기를 조정할 때 원활하게 구현될 수 있도록 iPhone 앱 레이아웃을 업데이트하는 방법을 알아보세요. 탭 및 탐색 막대용 새로운 API를 살펴보고, 새로운 Apple Intelligence 기능을 위해 앱을 준비하는 방법을 알아보며, 선택한 코딩 에이전트에 적용하여 코드베이스를 현대화할 수 있는 기술을 소개합니다.

    챕터

    • 0:00 - Introduction
    • 0:34 - App adaptivity
    • 2:10 - Legacy API: App lifecycle
    • 2:51 - Legacy API: Main screen
    • 5:46 - Full-screen mode for games
    • 6:17 - Legacy API: User interface idiom
    • 6:50 - Legacy API: Interface orientation
    • 7:55 - UIView Body protocols for motion & location
    • 8:19 - Test your resizable iPhone app
    • 9:18 - Tab bars and sidebars
    • 10:52 - Navigation bars
    • 12:37 - Menus
    • 13:01 - Integrate with Apple Intelligence
    • 14:07 - Agentic coding
    • 15:32 - Next steps

    리소스

    • TN3208: Preparing your app’s launch screen to meet App Store requirements
    • TN3210: Optimizing your app for iPhone Mirroring
    • Make your UIKit app more flexible
    • Adapting your app when traits change
    • Transitioning to the UIKit scene-based life cycle
    • Automatic trait tracking
    • Human Interface Guidelines: Menus
      • HD 비디오
      • SD 비디오

    관련 비디오

    WWDC26

    • Device Hub 최대한 활용하기
    • Siri 및 Apple Intelligence를 위한 고급 앱 인텐트 기능 살펴보기

    WWDC25

    • UIKit 앱을 더욱 유연하게 만들기

    WWDC24

    • iPadOS에서 탭 및 사이드바 경험 향상하기
  • 비디오 검색…

    안녕하세요, 저는 UI Frameworks 팀의 엔지니어링 매니저 Michael Ochs입니다.

    오늘은 UIKit 앱을 현대화하는 방법을 알려드리겠습니다. 이 영상에서는 앱 적응성 요구사항의 주요 변경 사항을 설명합니다. 그리고 iPhone 앱이 완전히 크기 조절 가능해진 방법도 다룹니다. 다음으로 탭 바, 내비게이션 바, 메뉴의 새로운 API를 소개합니다. 그런 다음 Apple Intelligence를 지원하는 방법과 알아야 할 몇 가지 변경 사항을 다룰 예정입니다.

    마지막으로 에이전트가 작업을 처리할 수 있도록 도와주는 새로운 스킬을 소개합니다. 이 현대화 작업의 대부분을 자동으로 처리해 줍니다.

    앱 적응성부터 시작하겠습니다. 여러분의 앱은 이미 다양한 환경에서 실행될 수 있습니다. 화면 크기가 다양하고 앱이 나란히 실행될 수 있습니다. 다른 앱과 함께 또는 자기 자신과 함께 실행됩니다. iPad에서 사람들은 앱이 크기를 조절하고 외부 디스플레이로 원활하게 이동하길 기대합니다. iPhone에서 사람들은 앱이 세로 및 가로 방향 모두에서 작동하길 기대합니다. 또한 iPhone을 Mac에 미러링할 수 있길 기대합니다. iOS와 macOS 27에서 이 경험이 개선되었으며 이러한 환경에서 실행되는 앱은 이제 노출됩니다. 해당 플랫폼의 기본 앱이 지원해야 하는 다양한 동적 변경 사항에 노출됩니다.

    Mac에서 iPhone Mirroring을 사용하면 iPhone 창을 완전히 크기 조절할 수 있어 앱이 크기를 조절하고 적응할 수 있습니다. 마찬가지로 iPad에서 실행되는 iPhone 전용 앱도 완전히 크기 조절이 가능합니다. 다른 iPad 앱처럼 동작합니다. 이 때문에 앱이 동적으로 조정되는 것이 중요합니다. 런타임에 사용 가능한 씬 크기에 맞게 조정되어야 합니다. 앱이 유니버설 바이너리라면 좋은 시작입니다. 하지만 앱을 완전히 적응형으로 만들고 동적으로 동작하게 하려면 더 해야 할 일이 있습니다. 실행 중인 환경에 맞게 조정해야 합니다. 앱을 더 적응형으로 만들 때 가장 중요한 단계와 자주 겪는 문제들을 다루겠습니다. 앱이 더 이상 앱 라이프사이클을 사용하지 않는지 확인하고 씬 라이프사이클을 채택하는 것이 중요합니다. 이것이 모든 적응형 앱의 기반입니다.

    앱이 메인 화면 참조를 사용하지 않는지 확인하세요. 그리고 사용자 인터페이스 관용구와 인터페이스 방향 확인을 처리하는 방법도 다룹니다.

    첫 번째 단계는 앱 라이프사이클에서 씬 라이프사이클로 이동하는 것입니다. 대부분의 앱은 이미 씬 라이프사이클을 사용하고 있습니다. 이것은 적응형 앱의 기반이며 다른 많은 작업의 기초입니다. 이 영상에서 보여드릴 작업들의 기반이 됩니다. UIScene 라이프사이클은 이제 최신 SDK로 빌드 시 필수입니다. 이것 없이는 앱이 더 이상 실행되지 않습니다. 앱이 UISceneDelegate를 사용하는지 확인하세요. 이것이 씬 라이프사이클의 기반입니다.

    씬 라이프사이클로 아직 마이그레이션하지 않았다면 다음 영상을 확인하세요. WWDC25의 "Make your UIKit app more flexible"를 보고 "Transitioning to the UIKit scene-based lifecycle"을 읽어보세요. 문서에서 확인할 수 있습니다. 다음으로 iPhone 앱이 Mac에서 미러링될 때 또는 사용자가 iPad의 앱을 외부 디스플레이로 이동할 때 씬과 연결된 화면이 변경됩니다. 즉, 코드에서 메인 화면에 대한 참조는 잘못된 정보를 제공합니다. 앱이 실행되는 환경에 대해 잘못된 정보를 제공합니다. 앱에서 메인 화면을 참조하지 않는 것이 중요합니다. 대신 창의 window scene에서 화면에 동적으로 접근하세요. 뷰나 뷰 컨트롤러가 즉각적인 컨텍스트에서 사용 불가능할 때 필요한 메서드에 화면 참조를 전달하세요. 올바른 화면을 가져오는 것보다 더 좋은 방법은 화면 참조를 완전히 제거하는 것입니다. 적응형 앱에 더 적합한 다른 API들이 많이 있습니다. 두 가지 일반적인 패턴을 안내해 드리겠습니다. 화면 배율에 접근하는 방법은 대체되어야 합니다. 트레이트 컬렉션의 displayScale로 대체하세요. 뷰와 뷰 컨트롤러는 자동으로 트레이트 컬렉션을 업데이트하고 합리적인 폴백을 제공합니다. 보이는 계층의 일부가 아닐 때도 폴백을 제공합니다. 많은 일반적인 오버라이드 지점도 추적됩니다. 변경 사항을 명시적으로 모니터링할 필요가 없다는 의미입니다. 대신 시스템이 사용 중인 트레이트 컬렉션 속성을 추적합니다. layoutSubviews, updateProperties 같은 일반적인 레이아웃 및 드로잉 메서드 내에서 drawRect 등 많은 메서드에서 추적됩니다. 추적된 트레이트의 변경이 감지되면 시스템이 이 메서드들을 다시 호출하여 UI가 자동으로 업데이트되도록 합니다. 자세한 내용은 문서의 "Automatic trait tracking"을 확인하세요. 자동 트레이트 추적을 사용할 수 없는 곳에서는 registerForTraitChanges를 사용하여 변경 사항을 관찰할 수 있습니다. 이 메서드를 사용하면 특정 트레이트가 변경될 때 호출되는 클로저를 설정할 수 있습니다. 수신 뷰에서 변경이 발생할 때 호출됩니다. 이를 사용하여 캐시를 무효화하거나 해당 뷰와 관련된 데이터를 업데이트하세요. 문서의 "Adapting your app when traits change"를 확인하세요. 자세한 내용을 알아볼 수 있습니다. 화면의 또 다른 일반적인 사용은 bounds를 확인하는 것입니다. 앱에 사용 가능한 공간을 확인하기 위해서입니다. 그러나 적응형 환경에서 씬이 사용할 수 있는 공간은 항상 전체 화면이 아닙니다. 앱에 화면 bounds 참조가 아직 남아 있다면 지금이 이것들을 제거할 때입니다. window scene의 effective geometry는 앱이 사용할 수 있는 공간에 대한 정보를 제공합니다. effective geometry의 변경 사항을 모니터링해야 한다면 씬 델리게이트에서 windowScene:didUpdateEffectiveGeometry:를 구현하세요. 뷰와 뷰 컨트롤러에서 씬 bounds를 참조하는 대신 뷰 컨트롤러 뷰나 슈퍼뷰의 사용 가능한 크기를 사용하세요. 사용 가능한 공간이 얼마나 되는지 결정하기 위해서입니다.

    이렇게 하면 UI가 표시 방식에 덜 의존하게 됩니다. 뷰 컨트롤러가 다른 컨텍스트에서 나타날 때 더 잘 조정됩니다. 예를 들어 split view controller 내부에서 나타날 때입니다. 게임의 경우 크기 조절이 어려울 수 있습니다. 이 때문에 UIRequiresFullscreen은 크기 조절 가능한 환경의 iPhone에서 iOS 27부터 적용됩니다. 동작도 업데이트되었습니다. 더 이상 앱을 크기 조절에서 완전히 제외하지 않습니다. 대신 지원하는 인터페이스 방향을 따르는 이산적 크기 조절을 활성화합니다.

    지원하는 인터페이스 방향을 따릅니다. 이산적 크기 조절에서 사용자가 씬 크기를 변경할 때마다 시스템이 씬을 새로운 화면 구성으로 전환합니다. 해당 크기에 맞는 화면 구성으로 전환됩니다. 게임이 항상 사용 가능한 공간에서 최고 품질로 렌더링됩니다. 앱이 User Interface idiom 트레이트를 사용하고 있다면 이 트레이트는 더 이상 레이아웃 결정에 의미가 없다는 것을 알아두세요. 앱은 추가 공간을 의미 있는 방식으로 활용해야 합니다. phone 또는 pad 사용자 인터페이스 관용구에서 실행되는 것과 관계없이 그렇습니다. iPhone 앱이 iPad에서 실행되거나 Mac의 iPhone Mirroring에서 실행될 때 완전히 크기 조절이 가능하지만 phone 사용자 인터페이스 관용구로 계속 실행됩니다. 코드에서 레이아웃 결정을 위해 사용자 인터페이스 관용구 확인을 중단하세요.

    대신 size class를 사용하여 메뉴 축소 같은 크기 제약을 처리하세요. 그리고 사용 가능한 공간에 맞게 앱 레이아웃을 업데이트하세요. 더 세밀한 제어가 필요하다면 주변 뷰의 크기를 사용하세요. 앞서 언급한 대로입니다. 인터페이스 방향도 더 이상 레이아웃 결정에 유용하지 않습니다. iOS 27에서 앱의 지원되는 인터페이스 방향은 시스템에 제공되는 기본 설정입니다. 앱이 크기 조절 가능한 환경에서 실행될 때 무시됩니다. 레이아웃 계산에 인터페이스 방향을 고려하지 마세요. Mac의 iPhone Mirroring에서 앱은 항상 세로 인터페이스 방향으로 실행됩니다. 세로 인터페이스 방향으로 실행됩니다. 앱 씬의 종횡비와 관계없이 그렇습니다. 앱의 인터페이스 방향 확인도 size class를 사용하도록 업데이트해야 합니다. 이 개념적 전환은 iOS 8에서 도입되었습니다.

    WWDC2014에서 Bruce Nilo가 말했습니다. "기기 회전은 단지 애니메이션된 bounds 변경입니다." 다양한 기기 크기, iPad의 크기 조절 가능한 창 Mac의 크기 조절 가능한 iPhone 앱까지 오늘날 이 통찰은 그 어느 때보다 더 관련성이 높습니다. 인터페이스 방향에 대해 말하자면, iOS 27에서 UIView도 새로운 CoreMotion과 CoreLocation의 Body 프로토콜을 준수합니다.

    이를 통해 모션 및 위치 관리자를 훨씬 쉽게 구성할 수 있습니다. 모션 데이터를 시각화하는 뷰에 연결하세요. 나침반이나 지도 뷰 같은 것입니다. 이렇게 하면 데이터가 항상 올바른 좌표 공간에 있습니다. 인터페이스 방향과 관계없이 그렇습니다. 주요 적응성 변경 사항은 여기까지입니다. 이제 앱에서 이 변경 사항을 테스트하는 방법을 알아보겠습니다. Xcode 27은 다양한 화면 크기에서 앱 동작을 반복 테스트하는 새로운 방법을 제공합니다. 여러 별도의 시뮬레이터나 기기에 앱을 설치하지 않아도 됩니다.

    새로운 Device Hub 앱과 Xcode Previews에서 "enter resize mode" 아이콘을 클릭하세요. 그런 다음 기기 모서리를 드래그하여 자유롭게 크기를 조절하세요. 이를 통해 변경 사항을 더 빠르게 반복 테스트할 수 있습니다. 결과에 만족하면 실제 기기로 iPhone Mirroring을 테스트하세요. 그리고 실제 기기로 iPad도 테스트하세요.

    Device Hub 앱과 도구에 대해 자세히 알아보려면 "Get the most out of Device Hub"를 시청하세요. 이상으로 적응성을 마칩니다. 앱을 완전히 적응형으로 만드는 데 도움이 되는 새로운 에이전틱 코딩 스킬을 보여드리기 전에 앱을 완전히 적응형으로 만드는 데 필요한 두 가지 주제가 더 있습니다. 먼저 바와 메뉴입니다. iPad에서 탭 바는 전체 사이드바 표시로 확장될 수 있습니다. 앱 계층의 더 많은 섹션을 표시하기 위해서입니다. 현재 환경이 사이드바를 지원할 때 그렇습니다. iPhone에서 하단 탭 바는 기본적으로 모든 크기에서 표시됩니다.

    iOS 27의 새 기능으로 iPhone 앱도 사이드바를 선택할 수 있습니다. 탭 바 컨트롤러의 sidebar.preferredPlacement를 .sidebar로 설정하면 됩니다. iPad와 달리 이것은 앱의 선택임을 유의하세요. 앱이 사이드바 표시를 선택하면 UI에서 전환할 방법이 없습니다. 사이드바와 탭 바 레이아웃 사이에서 전환할 수 없습니다. 대신 시스템이 사이드바를 표시할 충분한 공간이 있는지 결정합니다. 예를 들어 수평 size class가 regular일 때입니다.

    탭 바의 사이드바 표시를 사용할 수 있는지 확인하려면 사이드바의 isAvailable 속성을 사용하세요. 사이드바를 현재 사용할 수 없다면 중첩 탭 뒤의 UI를 앱의 다른 부분에 표시하세요. 탭 그룹 관리에 대해 자세히 알아보려면 WWDC25의 "Make your UIKit app more flexible"를 시청하고, 탭 바와 사이드바 통합에 대해 자세히 알아보려면 WWDC24의 "Elevate your tab and sidebar experience in iPadOS"를 시청하세요.

    UITabBarController를 사용하면 강조 탭을 커스터마이즈할 수 있습니다. 강조 탭은 항상 표시됩니다. 스크롤 중 탭 바가 축소되어도 항상 표시됩니다. iOS 27에서 prominentTabIdentifier를 설정하여 어떤 탭이든 강조할 수 있습니다. prominentTabIdentifier를 설정하면 됩니다. 탭 바는 여기까지입니다. 이제 내비게이션 바에 대해 알아보겠습니다.

    내비게이션 바는 사람들이 스크롤할 때 인터랙티브하게 슬라이드 사라질 수 있습니다. 앱 콘텐츠를 위해 화면에 더 많은 공간을 제공합니다. 기본적으로 내비게이션 바는 시스템이 정의한 특정 조건에서 최소화됩니다.

    이 동작을 강제할 수 있습니다. 어느 방향으로든 가능합니다. 내비게이션 항목에서 barMinimizationBehavior 속성을 설정하면 됩니다. .always 또는 .never로 설정할 수 있습니다. safe area 회피를 직접 처리한다면 barMinimizationSafeAreaAdjustment를 .never로 설정하여 바 최소화가 자동으로 업데이트하지 않게 하세요. inset을 자동으로 업데이트하지 않게 됩니다.

    스크롤 인터랙션 중 또 다른 변경 사항은 업데이트된 모양입니다. 스크롤 엣지 효과에 대한 업데이트된 모양입니다. 따라서 디자인을 검토해야 합니다. 특히 이전에 기본값을 재정의한 경우에 주의하세요. OS가 제공하는 기본값을 재정의한 경우입니다. 특히 .automatic 스타일은 더 이상 기존의 soft와 hard 스타일 간에 전환하지 않습니다. 기존의 soft와 hard 스타일 간에 전환하지 않습니다. 추가적인 명확성을 위해 자체적인 비주얼을 제공합니다. 이전에 .automatic에서 스타일을 재정의했다면 해당 결정을 재평가해야 합니다. 특히 .soft로 설정한 경우 더 이상 일치하지 않습니다. 기본 시스템 모양과 일치하지 않습니다.

    Liquid Glass의 세련된 외관으로 메뉴 요소에 설정한 이미지는 일부 컨텍스트에서 기본적으로 표시되지 않을 수 있습니다. iPadOS와 macOS의 메뉴 바처럼 표시되지 않을 수 있습니다.

    이미지를 계속 표시해야 한다면 preferredImageVisibility 속성을 설정하세요. 기본 시스템 동작을 재정의하기 위해서입니다. 업데이트된 Human Interface Guidelines를 검토하세요. 메뉴 요소에 표시되는 이미지를 언제 포함할지 결정할 때 참고하세요. 이상으로 바와 메뉴를 마칩니다. 이제 앱에서 Apple Intelligence를 지원하는 방법을 알아보겠습니다.

    iOS 27의 메뉴에는 Siri에게 물어보기 버튼이 있습니다. 앱에서 바로 Siri와의 대화를 시작할 수 있게 해줍니다. 이것은 사람들이 관심 있는 컨텍스트와 상호작용할 수 있게 해주는 강력한 진입점입니다.

    메뉴는 Siri와 관련된 콘텐츠가 있을 때 자동으로 이 항목을 표시합니다. 앱에 특화된 더 관련성 있는 정보를 제공하려면 새로운 View Annotations API를 사용하세요. 이를 통해 특정 뷰에 AppEntities를 주석으로 달 수 있습니다. 확인해 보세요. "Explore advanced App Intents features for Siri and Apple Intelligence"를 시청하면 자세히 알 수 있습니다.

    앱이 드래그 앤 드롭을 지원한다면 Siri가 리소스를 로드할 수 있습니다. 앱의 드래그 핸들러에서 리소스를 로드합니다. 컨텍스트 메뉴에서 Apple Intelligence가 호출되면 시스템이 호출합니다. 사용 가능한 드래그 델리게이트 메서드를 호출하여 콘텐츠를 로드합니다. sessionWillBegin에서 애니메이션을 수행하거나 모달 UI를 표시하지 마세요. 드래그 세션은 사용자 제스처 없이 시작될 수 있습니다. 사용자가 드래그를 시작할 때 표시되는 상태 있는 UI가 앱에 있다면 해당 코드를 sessionDidMove에 넣으세요.

    제가 설명한 적응성 변경 사항이 많은 작업처럼 들린다면 걱정하지 마세요. 모두가 주목하는 것에 대해 이야기해 봅시다. 에이전틱 코딩입니다!

    Xcode 27의 새 기능으로 앱 현대화 스킬이 있습니다. 제가 설명한 적응성 작업에 대한 깊은 이해를 갖추고 있습니다. 프로젝트의 컨텍스트와 함께 이러한 변경 사항의 많은 부분을 자동으로 적용할 수 있습니다. Xcode의 인텔리전스 기능을 사용하여 에이전트에게 앱을 더 적응형으로 만들도록 요청하세요. 자동으로 메인 화면 호출을 traitCollection으로 변환합니다. 또는 씬 bounds 확인으로 변환합니다. 필요한 경우 무효화 로직을 추가합니다. 인터페이스 방향 확인을 size class 확인으로 대체합니다. 앱을 씬 라이프사이클을 사용하도록 변환하기도 합니다. 더 복잡한 작업의 경우 명확화 질문을 합니다. 단일 세션에서 처리하기에 너무 큰 작업의 경우 진행 상황을 파악하는 데 도움이 되는 주석을 추가합니다. 남은 작업을 추적하는 데 도움이 됩니다.

    다른 도구에서 스킬을 사용하려면 Xcode가 사용하는 스킬을 내보낼 수 있습니다. "xcrun agent skills export"를 사용하면 됩니다. 그러면 마크다운 파일이 생성되어 워크플로에서 가져올 수 있습니다. 이런 스킬은 앱을 크기 조절 가능한 환경에 대비시키는 강력한 방법입니다. 크기 조절 가능한 환경에 대비시킵니다.

    그게 전부입니다! 앱을 현대화하는 데 가장 중요한 사항들입니다.

    iOS 27 SDK로 앱을 빌드하고 크기 조절 가능한 시뮬레이터를 사용해 보세요. 새로운 Device Hub 앱에서 사용할 수 있습니다. 그리고 macOS 27의 iPhone Mirroring에서 앱을 테스트하세요. 앱에서 조금 더 유연하게 만들어야 할 부분을 찾아보세요. 에이전틱 코딩이 마음에 든다면 새 스킬을 사용해 보세요. 자동으로 얼마나 많은 작업을 처리할 수 있는지 알아보세요. 함께해 주셔서 감사합니다. 여러분의 앱을 빨리 리사이즈해 보고 싶습니다.

    • 3:24 - Use local screen references

      // Use local screen references
      // Access the correct screen through a windowScene
      let screen = window?.windowScene?.screen
      
      // Pass in local screen references
      func generateThumbnail(_ image: UIImage, screen: UIScreen) -> UIImage {
          // existing code, replacing main screen with local screen reference
          // ...
      }
    • 3:49 - Replace screen scale with displayScale

      // Replace the screen's scale with trait collection's displayScale
      override func layoutSubviews() {
          super.layoutSubviews()
      
          // layoutSubviews will be called again automatically when displayScale changes
          let displayScale = traitCollection.displayScale
          // ...
      }
    • 4:36 - Register for trait changes

      // Manually register for trait changes
      let displayScaleTrait: [UITrait] = [UITraitDisplayScale.self]
      registerForTraitChanges(displayScaleTrait) {
          (view: GalleryView, previousTraitCollection: UITraitCollection) in
          view.cache.invalidate()
      }
    • 5:19 - Monitor effective geometry changes

      // UIWindowSceneDelegate
      func windowScene(
          _ windowScene: UIWindowScene,
          didUpdateEffectiveGeometry previousEffectiveGeometry: UIWindowScene.Geometry
      ) {
          let geometry = windowScene.effectiveGeometry
          let availableSpace = geometry.coordinateSpace.bounds
          // ...
      }
    • 5:35 - Check available space using view bounds

      // Checking available space
      override func viewDidLayoutSubviews() {
          super.viewDidLayoutSubviews()
      
          let availableSpace = view.bounds.size
          // ...
      }
    • 8:12 - Configure motion and location body

      // Configure motion and heading bodies
      override func viewDidLoad() {
          super.viewDidLoad()
      
          motionManager.deviceMotionBody = view
          locationManager.headingBody = view
      }
    • 9:51 - Opt into sidebar layout

      tabBarController.sidebar.preferredPlacement = .sidebar
    • 10:22 - Check sidebar availability

      tabBarController.sidebar.isAvailable
    • 10:53 - Set prominent tab identifier

      // Set the prominent tab
      let tabs = [
          // ...
      ]
      let tabBarController = UITabBarController(tabs: tabs)
      tabBarController.prominentTabIdentifier = "cart"
    • 11:30 - Customize bar minimization behavior

      // Customize bar minimization behavior
      override init(
          nibName nibNameOrNil: String?,
          bundle nibBundleOrNil: Bundle?
      ) {
          super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
      
          navigationItem.barMinimizationBehavior = .always
          navigationItem.barMinimizationSafeAreaAdjustment = .never
      }
    • 15:05 - Export Xcode skills for use in other tools

      xcrun agent skills export
    • 0:00 - Introduction
    • A modern UIKit app dynamically adjusts to the environment it runs in. iOS 27 introduces new requirements and APIs to help you get there. Discover new APIs in tab bars, navigation bars, and menus; Apple Intelligence support; and a new skill that helps an agent handle much of this modernization work automatically.

    • 0:34 - App adaptivity
    • iPhone apps are now fully resizable in iPhone Mirroring on Mac and when running on iPad. Your app needs to dynamically adjust to any available scene size at runtime. The four areas to audit are scene lifecycle adoption, main screen references, user interface idiom checks, and interface orientation checks.

    • 2:10 - Legacy API: App lifecycle
    • UIScene lifecycle is now required when building with the latest SDKs; apps without it will no longer launch. If you haven't migrated from app lifecycle yet, start here.

    • 2:51 - Legacy API: Main screen
    • UIScreen.main always refers to the device's main screen, but in resizable environments your scene may be running on a different screen entirely. Replace it with screen references from the window scene, trait collections for scale, and effective geometry for available space.

    • 5:46 - Full-screen mode for games
    • UIRequiresFullscreen is now honored on iPhone in resizable environments, enabling discrete resizing that respects your supported interface orientations so games always render at full quality.

    • 6:17 - Legacy API: User interface idiom
    • The user interface idiom trait is no longer meaningful for layout. An iPhone app running on iPad stays in the phone idiom but is fully resizable. Use size classes instead.

    • 6:50 - Legacy API: Interface orientation
    • Supported interface orientations are treated as a preference only and are ignored in resizable environments, including iPhone Mirroring which always reports portrait. Replace orientation checks with size classes.

    • 7:55 - UIView Body protocols for motion & location
    • UIView now conforms to the new Body protocols from CoreMotion and CoreLocation in iOS 27, making it straightforward to keep motion and location data in the correct coordinate space regardless of interface orientation.

    • 8:19 - Test your resizable iPhone app
    • Xcode 27's Device Hub app and Xcode Previews let you freely drag the edges of the simulator to test any screen size without needing multiple devices. Test with real devices for iPhone Mirroring and iPad.

    • 9:18 - Tab bars and sidebars
    • iPhone apps can now opt into a sidebar layout by setting tabBarController.sidebar.preferredPlacement to .sidebar, with the system deciding when there's enough space to show it. Check tabBarController.sidebar.isAvailable to determine if the system can show the sidebar, and use tabBarController.prominentTabIdentifier to pin any tab so it stays visible even when the tab bar collapses during scroll.

    • 10:52 - Navigation bars
    • Navigation bars can now slide away during scroll to give people more room. The system determines when this happens by default; override it with barMinimizationBehavior. The .automatic scroll edge effect style has new visuals; apps that previously overrode it to .soft should re-evaluate their design.

    • 12:37 - Menus
    • Menu element images may no longer appear by default in some contexts like menu bars on iPadOS and macOS. Use preferredImageVisibility to override this behavior where needed.

    • 13:01 - Integrate with Apple Intelligence
    • Menus automatically display an Ask Siri button when there's content relevant for Siri. If your app supports drag and drop, Siri can load resources from your drag handlers. Drag sessions can be initiated without a user gesture, so avoid triggering animations or presenting modal UI from sessionWillBegin.

    • 14:07 - Agentic coding
    • Xcode 27's app modernization skill can automatically convert mainScreen calls, replace orientation checks with size class checks, and migrate your app to scene lifecycle. Skills can also be exported for use in other tools.

    • 15:32 - Next steps
    • Build with the iOS 27 SDK, test in Device Hub and iPhone Mirroring on macOS 27, identify flexibility gaps in your app, and try the agentic modernization skill.

Developer Footer

  • 비디오
  • WWDC26
  • UIKit 앱 현대화하기
  • 메뉴 열기 메뉴 닫기
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    메뉴 열기 메뉴 닫기
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    메뉴 열기 메뉴 닫기
    • 손쉬운 사용
    • 액세서리
    • Apple Intelligence
    • 앱 확장 프로그램
    • App Store
    • 오디오 및 비디오(영문)
    • 증강 현실
    • 디자인
    • 배포
    • 교육
    • 서체(영문)
    • 게임
    • 건강 및 피트니스
    • 앱 내 구입
    • 현지화
    • 지도 및 위치
    • 머신 러닝 및 AI
    • 오픈 소스(영문)
    • 보안
    • Safari 및 웹(영문)
    메뉴 열기 메뉴 닫기
    • 문서(영문)
    • 튜토리얼
    • 다운로드
    • 포럼(영문)
    • 비디오
    메뉴 열기 메뉴 닫기
    • 지원 문서
    • 문의하기
    • 버그 보고
    • 시스템 상태(영문)
    메뉴 열기 메뉴 닫기
    • Apple Developer
    • App Store Connect
    • 인증서, 식별자 및 프로파일(영문)
    • 피드백 지원
    메뉴 열기 메뉴 닫기
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(영문)
    • Mini Apps Partner Program
    • News Partner Program(영문)
    • Video Partner Program(영문)
    • Security Bounty Program(영문)
    • Security Research Device Program(영문)
    메뉴 열기 메뉴 닫기
    • Apple과의 만남
    • Apple Developer Center
    • App Store 어워드(영문)
    • Apple 디자인 어워드
    • Apple Developer Academy(영문)
    • WWDC
    최신 뉴스 읽기.
    Apple Developer 앱 받기.
    Copyright © 2026 Apple Inc. 모든 권리 보유.
    약관 개인정보 처리방침 계약 및 지침