iOS 26부터 UI에 Liquid Glass 소재 도입 가능

UI Object 들이 투명도, 굴절 효과, 스펙큘러 하이라이트 등을 이용해 모습이 변화
inspector 공식 지원 : 이제 일련의 코드 작성 없이 간단하게 세부 정보를 보여주는 코드를 작성 지원
separator 지원 : 나눠진 두 화면 간의 선을 드래그하여 화면 크기 조절 가능

맥에서 지원되는 macOS 스타일 메뉴바를 iPad에 탑재
⚠️ 버전 26부터는 메뉴바를 storyBoard에서 구성 불가, 오로지 코드로만 구성되야 함.

Observable 매크로로 선언된 클래스의 객체를 layoutSubviews, updateProperties 등의 메서드에서 해당 객체의 속성을 참조시 종속성이 자동으로 설정
SwiftUI와 동일하게 Observable 객체의 속성이 변경되면 자동으로 해당 UI 업데이트
⚠️ 단 Observable 매크로로 선언된 클래스 여야 함. Observable 프로토콜을 준수하는 클래스는 불가.
Observable 매크로는 컴파일 단계에서 자동으로 관찰 기능 코드가 생성되고 해당 타입이 Observable 프로토콜을 준수하게 처리
반면, 프로토콜만 선언하면 관찰 로직이 삽입되지 않음.
https://stackoverflow.com/questions/78858949/swift-observable-vs-observable-protocol
Info.plist 파일에서 UIObservationTrackingEnabled 값을 YES로 설정하면 iOS 18+ 이상부터 추적 가능하도록 설정
iOS 26은 설정 불필요

layoutSubviews 직전에 실행되는 메서드layoutSobviews 메서드는 데이터 업데이트와 레이아웃 처리를 함께 하던 구조이기 때문에 속성 하나만 바뀌어도 전체 레이아웃을 재계산하는 경우가 발생 ➡️ 리소스 낭비updateProerties 메서드의 추가로 기능이 분리되어 데이터만 업데이트하고 레이아웃을 재계산하는 불필요한 과정 제거 가능
configurationHandler를 통해 종속성이 추적되고 데이터 업데이트에 따라 셀 자동 업데이트기존 에니메이션 방식
UIView.animate(withDuration: 0.3) {
model.badgeColor = .red // 상태 변경
view.layoutIfNeeded() // 레이아웃 업데이트 강제
}
layoutIfNeeded 메서드를 사용해서 강제로 레이아웃을 업데이트flushUpdates 사용
UIView.animate(withDuration: 0.3, options: [.flushUpdates]) {
model.badgeColor = .red // 상태만 변경하면 UIKit이 자동으로 알아서 처리
}
flushUpdates 옵션을 설정하면 UIKit이 내부에서 자동으로 updateProperties(), layoutSubviews() 메서드 호출 및 애니메이션 처리까지 자동으로 처리함.
기존 수동으로 속성과 뷰 의존성으로 생길 수 있는 오류 방지 및 불필요한 애니메이션 호출이 되지 않게 개선
animate 메서드 또한 Observable 종속성 추적 (자동으로 연결된 속성의 UI 업데이트 가능)
이를 통해 UIKit 기반의 앱에서 SwiftUI 씬을 자연스럽게 삽입하고 전환 가능
import UIKit
import SwiftUI
class ZenGardenSceneDelegate: UIResponder, UIHostingSceneDelegate {
static var rootScene: some Scene {
WindowGroup(id: "zengarden") {
ZenGardenView()
}
#if os(visionOS)
ImmersiveSpace(id: "zengardenspace") {
ZenGardenSpace()
}
.immersionStyle(selection: .constant(.full), in: .mixed, .progressive, .full)
#endif
}
}
func application(
_ application: UIApplication,
configurationForConnecting connectingSceneSession: UISceneSession,
options: UIScene.ConnectionOptions
) -> UISceneConfiguration {
let config = UISceneConfiguration(name: "Zen Garden Scene", sessionRole: connectingSceneSession.role)
config.delegateClass = ZenGardenSceneDelegate.self
return config
}
Delegate를 지정해 SwiftUI Scene 로딩을 수행 func openZenGardenSpace() {
let request = UISceneSessionActivationRequest(
hostingDelegateClass: ZenGardenSceneDelegate.self,
id: "zengardenspace"
)!
UIApplication.shared.activateSceneSession(for: request)
}

알림을 Message 타입으로 강화해 타입 안정성 강화
위의 코드에서는 [키보드가 나타남 알림]의 관련 정보를 타입으로써 안전하게 추출

iOS26 SDK로 빌드 시, UIScene 기반의 앱만 실행 가능
UIApplicationDelegate, LaunchOptions 등 기존 UIApplication 중심 API는 폐기 예고
HDR 색상: UIColor에 노출도(exposure) 지정 가능, UIColorPicker에도 HDR 색상 퍼포먼스 지원
UIImageView → 비디오에도 HDR‑to‑SDR 폴백 확장, UITraitHDRHeadroomUsage로 관리
Draw Off/On 애니메이션, variable draw로 진행 표시 및 매직 Replace 지원
UIButton Configuration에 symbolContentTransition으로 자동 심볼 전환 효과 적용
기울기(Gradient) 렌더링 모드 도입
참고
https://gizmodo.com/ios-26-might-be-apples-riskiest-redesign-yet-2000613526
https://developer.apple.com/kr/videos/play/wwdc2025/243/?time=65