View in English

  • 메뉴 열기 메뉴 닫기
  • Apple Developer
검색
검색 닫기
  • Apple Developer
  • 뉴스
  • 둘러보기
  • 디자인
  • 개발
  • 배포
  • 지원
  • 계정
페이지에서만 검색

빠른 링크

5 빠른 링크

비디오

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

더 많은 비디오

스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.

  • 소개
  • 요약
  • 자막 전문
  • 코드
  • 새로운 디자인으로 UIKit 앱 빌드하기

    UIKit 앱을 업데이트하고 새로운 디자인 시스템을 최대한 활용하세요. 탭 뷰, Split View, 바, 프레젠테이션, 검색 및 제어에 대한 주요 변경 사항을 자세히 살펴보고 맞춤형 UI에서 Liquid Glass를 사용하는 방법을 보여드립니다. 이 비디오를 최대한 활용하려면 일반 디자인 가이드를 제공하는 ‘새로운 디자인 시스템과 더 친숙해지는 법'을 먼저 시청하는 것이 좋습니다.

    챕터

    • 0:00 - Introduction
    • 1:55 - Tab views and split views
    • 7:19 - Navigation and toolbars
    • 13:31 - Presentations
    • 15:18 - Search
    • 17:24 - Controls
    • 19:15 - Custom elements
    • 25:01 - Next steps

    리소스

    • Adopting Liquid Glass
    • Human Interface Guidelines
      • HD 비디오
      • SD 비디오

    관련 비디오

    WWDC25

    • 새로운 디자인 시스템과 더 친숙해지는 법
    • Liquid Glass 만나보기
    • UIKit 앱을 더욱 유연하게 만들기
    • UIKit의 새로운 기능

    WWDC24

    • iPadOS에서 탭 및 사이드바 경험 향상하기
    • UI 애니메이션 및 전환 효과 향상하기
  • 비디오 검색…

    '새로운 디자인으로 UIKit 앱을 빌드하기'에 오신걸 환영합니다 저는 UIKit 팀 엔지니어 Sanaa입니다 이 비디오에서는 새 디자인 적용 방법을 알려드리고 Liquid Glass를 당신의 앱에 가져오는 방법을 소개합니다

    iOS 26에는 아름다운 새 디자인이 적용됩니다 시스템 전반에서 재료 및 제어 기능의 디자인이 달라졌습니다 이 디자인의 핵심은 Liquid Glass라는 새 재료입니다 반투명하고 역동적이며 살아 움직이죠 시스템 전반에서 UIKit의 구성 요소와 재료는 Liquid Glass로 업데이트되었습니다

    새로운 SDK로 다시 컴파일하면 당신의 앱도 새로운 모습을 얻게 됩니다 아직 확인하지 못 했다면 디자인 비디오 'Liquid Glass 만나보기'와 'Liquid Glass 디자인 시스템으로 디자인하기'를 꼭 확인해서 디자인 개요를 알아보고 새 디자인을 적용하는 모범 사례도 배워보세요

    탭 뷰와 Split View에 새 디자인 시스템을 적용하고 콘텐츠 위에 띄우는 법으로 시작해 보겠습니다

    그리고 탐색 막대와 도구 막대의 새로운 모습과 작동 방식도 알아보겠습니다 이제 모두 투명해졌으며 Liquid Glass 버튼을 포함합니다 콘텐츠에 더 많은 공간을 주죠

    그리고 나선 표시 방식의 개선 사항을 알아보겠습니다 여기에는 개선된 줌 전환과 알림 및 작업 시트의 새 작동 방식이 포함됩니다

    검색 경험이 어떻게 개선되었는지도 설명하겠습니다 검색 막대 위치 옵션이 더욱 늘어났죠

    그 다음 버튼, 스위치, 슬라이더 등 제어 기능으로 넘어가고 맞춤형 UI 요소에 Liquid Glass의 모양과 분위기를 적용하는 방법으로 마무리합니다

    탭 뷰와 Split View로 시작해보죠

    UITabBarController와 UISplitViewController는 새로운 Liquid Glass 디자인으로 업데이트되었습니다

    탭 막대는 고정되어 앱에서 최고 수준의 탐색이 가능합니다 한 눈에 앱의 개요를 볼 수 있게 해 주고 섹션 간 빠른 전환을 도와줍니다 새 디자인을 적용하면 iPhone의 탭 막대는 콘텐츠 위에 떠오르고

    스크롤 시 최소화되어 콘텐츠에 계속 집중하도록 구성될 수 있습니다

    스크롤 시 탭 막대를 최소화하려면 tabBarMinimizeBehavior을 원하는 방향으로 설정하세요 여기 TV 앱에 .onScrollDown을 설정했습니다 반대 방향으로 스크롤하면 탭 막대는 다시 커집니다

    탭 막대 위에는 액세서리 보기가 있습니다 음악 앱의 미니 플레이어와 비슷합니다 UITabBarController는 탭 막대 위에 액세서리 보기를 표시해 디자인을 맞춥니다 탭 막대를 최소화하면 액세서리 보기가 아래로 내려가 탭 막대와 나란히 표시됩니다

    하단 액세서리를 설정하려면 콘텐츠 보기로 UITabAccessory를 생성하고 bottomAccessory 속성을 UITabBarController에 설정합니다

    액세서리가 탭 막대와 나란히 배치되면 표시할 공간이 더 줄어들게 되죠 음악 앱은 줄어든 공간을 수용해 미니 플레이어의 미디어 제어 기능 일부를 숨긴 것을 볼 수 있습니다

    액세서리 뷰를 조정하려면 tabAccessoryEnvironmental 속성의 변화를 감지하도록 등록하세요 액세서리 뷰가 탭 막대와 나란히 배치되었는지 확인하고 필요한 경우 뷰를 업데이트합니다

    updateProperties를 사용해서 자동 특성 추적 방식으로 액세서리 뷰를 업데이트 할 수도 있습니다

    자동 특성 추적과 새 updateProperties 메서드를 'UIKit의 새로운 기능'으로 자세히 알아보세요

    iPad에서도 탭 막대와 사이드바가 Liquid Glass로 떠오릅니다 UITabBar 컨트롤러를 사용하면 앱 콘텐츠 위에 떠 있게됩니다 UITab과 UITabGroup을 적용하면 당신의 앱에 자동으로 맞춤 적용되어 iPad의 탭 막대와 사이드바 사이를 전환하게 해줍니다 자세한 내용은 WWDC24의 'iPadOS에서 탭 및 사이드바 경험 향상하기'와 WWDC 25의 'UIKit 앱을 더욱 유연하게 만들기'를 확인하세요

    새 디자인 덕분에 사이드바가 더 멋져 보입니다 아래에 메인 스크롤 뷰와 어울리는 생생한 콘텐츠가 있을 때 특히 그렇죠 iOS 26의 TV 앱이 아주 좋은 예시입니다 아트워크가 화면 전체를 비롯하여 사이드바 아래에까지 펼쳐진 것 처럼 보입니다 가운데 정렬되고 전부 보이죠 이 효과는 iOS 26의 많은 앱에서 사용됩니다 새 UIBackgroundExtentionView로 당신의 앱도 멋지게 만드세요

    확장 뷰는 전체 너비로 확장되어야 합니다 여기에는 사이드바를 위한 안전 영역 여백도 포함되죠 효과에 당신이 제공하는 콘텐츠 뷰를 입력합니다 이미지 뷰를 예로 들 수 있죠 뷰 계층에 위치하여 매끄럽게 확장돼 빈 공간을 채웁니다

    목적에 따라 사용하는 특수한 효과죠 에피소드 목록과 같은 하단의 섹션은 사이드바 아래에서 자연스럽게 스크롤되어 확장이 불필요합니다

    프로그램의 제목이나 설명 등 아트워크 위에 있는 요소 또한 연장돼선 안 됩니다 반드시 하위 뷰가 아닌 확장 뷰의 형제로 추가하세요

    프로그램 뷰 컨트롤러에는 이미 포스터 아트워크의 이미지 뷰가 있습니다 backgroundExtentionView를 생성해 효과를 추가하고 이미지 뷰를 contentView 속성에 할당합니다 계층에 확장 뷰를 추가하세요 마지막으로 세부사항 뷰를 확장 뷰의 형제로 추가하세요 기본적으로 콘텐츠 보기는 확장 보기의 안전 영역을 채웁니다 안전 영역 여백의 가장자리가 전부 확장돼 빈 공간을 채웁니다 이 경우에는 탐색 및 상태 막대의 상단 가장자리와 사이드바의 왼쪽 가장자리입니다 TV 앱에는 아트워크를 가릴만한 탐색 막대 콘텐츠가 적기 때문에 상단 확장 효과가 필요없습니다 대신에 콘텐츠 뷰는 수동으로 안전 영역 밖의 상단에 배치됩니다

    효과 레이아웃 수동 조정을 위한 코드 예제로 돌아가죠 automaticallyPlacesContentView를 확장 뷰에 false로 먼저 지정하고 AutoLayout 제약 조건을 사용해 이미지 뷰를 화면 상단에 배치합니다 그리고 이미지 뷰를 사이드바 아래로 확장하고 extentionView의 safeAreaLayoutGuide에 맞춰 leadingAnchor에 제약 조건을 추가하세요

    끝 방향과 하단 앵커에도 제약 조건을 추가하는 걸 잊지 마세요

    이제 탐색 막대와 도구 막대의 디자인과 작동 방식을 살펴보겠습니다 iOS26에서 탐색 막대와 도구 막대에도 새 Glass 디자인이 적용돼 콘텐츠 위에 떠오릅니다 도구 막대나 탐색 barButton 항목을 지정할 때 시스템은 자동으로 각 항목을 시각적 그룹으로 나눕니다 각 그룹은 글래스 배경을 공유하죠

    기본적으로 이미지를 사용하는 막대 버튼 항목은 다른 이미지 버튼과 배경을 공유합니다 다중 항목이 있는 그룹도 배경을 공유하죠

    텍스트 버튼과 '완료’ 및 '닫기'버튼 눈에 띄는 스타일의 버튼은 각각의 글래스 배경을 가집니다 실제 작동 예시를 살펴보죠 '선택' 버튼이 맨 앞에 있고 '완료' 버튼이 맨 뒤에 있을 때 글래스 배경을 중앙 네 개의 이미지 버튼과 공유하면 안 됩니다 navigationBar를 설정하려면 BarButtonItems를 직접 navigationItem의 rightBarButtonItems에 할당합니다 이런 방법으로 아까 설명한 기본 시스템 작동 방식을 갖습니다 항목을 다른 그룹으로 세분화하려면 fixedSpace 항목을 사용하세요 여기서 저는 '공유' 버튼을 분리하고 싶기 때문에 공유와 정보 버튼 사이에 fixedSpace를 삽입합니다

    막대 버튼은 기본적으로 labelColor를 사용해 가독성을 높입니다 만약 색상이 동작 정보를 제공해야 한다면 다른 색상을 지정하면 됩니다

    예를 들어, 저는 깃발 버튼을 업데이트하려고 합니다 tintColor로 systemOrange를 사용해서요

    깃발 기호에만 색이 입혀집니다

    배경의 버튼에 색조를 입히고 싶으면 눈에 띄는 스타일을 적용하세요

    이전에는 조정 가능한 공간을 사용해 도구 막대 항목을 균일하게 나눴을 수 있습니다 Liquid Glass를 이용하면 각각의 flexibleSpace 항목이 기본으로 각 항목의 배경을 나눕니다

    항목을 균일하게 나누고 단일 배경에서 그룹화하려면 hidesSharedBackground를 false로 설정해 조정 가능 공간을 쓰세요

    iOS 26에서 UINavigationItem으로 navigationBar의 제목과 대형 제목 영역을 더 많이 제어하도록 하세요 여기에는 새 자막 추가도 포함됩니다 제목 아래에 렌더링 되죠

    속성이 지정된 문자열을 사용해 제목과 자막 전부를 세밀하게 조정하세요

    맞춤형 뷰를 지정하여 상호작용 요소를 추가합니다

    이제 콘텐츠 스크롤 뷰의 상단에 큰 제목이 배치되고 막대 아래에서 콘텐츠와 함께 스크롤됩니다

    대형 제목이 보이게 하려면 스크롤 뷰를 navigationBar 아래까지 크게 확장하세요

    이 예시에서 메일은 도구 막대의 검색 필드에 위치하며 새 subtitle API를 이용해 읽지 않은 이메일 수를 탐색 막대에 보여줍니다

    이메일을 필터링할 때 메일은 현재 적용된 필터를 대형 제목 아래의 버튼에 보여줍니다 버튼은 navigationItem에 largeSubtitleView로 설정되며 navigationBar의 대형 제목 아래에 나타납니다 iOS26의 새 디자인 시스템 중 하나로 이제 투명한 막대 배경이 기본값으로 적용됩니다 탐색 및 도구 모음에서 배경 사용자 지정을 제거하세요 UIBarAppearance나 backgroundColor를 사용하면 글래스 디자인에 영향을 줍니다

    막대 버튼은 Glass 배경을 사용합니다 당신의 customView 콘텐츠를 레이아웃 여백을 이용해 배치하고 알맞은 간격을 설정하세요 탐색 및 도구 막대 아래의 모든 스크롤 뷰에는 자동으로 시각적 효과가 적용되어 막대에서 겹치는 콘텐츠의 가독성을 높이죠 이걸 에지 효과라고 부릅니다 새 에지 효과는 시스템 막대만을 위한 게 아닙니다 스크롤 뷰 에지를 덮는 맞춤형 뷰 컨테이너와도 함께 사용할 수 있습니다 스크롤 뷰 하단 가장자리와 겹치는 버튼 두 개를 보여주는 예시입니다 버튼 스택 뒤에 가장자리 효과를 추가하려면 scrollEdgeElementContainerInteraction을 생성하고 contentScrollView와 에지를 할당한 다음 buttonsContainerView에 추가합니다 떠 있는 요소가 많은 밀도 높은 UI의 경우 스크롤 뷰 에지에 단단한 에지 스타일을 사용하죠 iOS 18의 표준 막대 배경과 비슷하게 생겼는데요 가장자리 효과 스타일을 .hard로 설정해서 활성화합니다

    iOS 18은 늘 상호작용 가능하고 중단 가능한 줌 전환을 도입했죠 iOS 26은 표준 탐색 슬라이드 전환에 같은 유동성을 제공합니다

    메모 앱을 써보겠습니다 메모를 열어볼게요 전환 과정에서도 앱은 반응성을 유지합니다

    메모를 잘못 선택한 경우 바로 스와이프해 뒤로 갈 수 있죠

    전환되는 도중에 스크롤할 수도 있습니다 비슷한 방식으로 뒤로 가기 버튼을 여러번 눌러 더 이전으로 빠르게 갈 수 있죠

    사용자가 앱과 언제든 상호작용할 수 있으니 정말 멋진 일이죠 물론 앱도 언제든 상호작용할 준비가 되어 있어야겠죠 중단 가능한 전환을 올바르게 다루는 방법을 알아보려면 'UI 애니메이션 및 전환 효과 향상하기'를 확인하세요 왼쪽 에지 뿐만 아니라 콘텐츠 영역 어디에서든 스와이프해서 뒤로 갈 수 있습니다 새 콘텐츠 백스와이프 제스처가 충돌하는 상호작용을 자동으로 확인합니다

    스와이프 동작이 있으면 콘텐츠 백스와이프가 불가능하지만 비상호작용 영역에서는 가능하도록 하는 겁니다

    콘텐츠 백스와이프보다 우선적으로 작동하게 하려면 interactiveContentPopGestureRecognizer에서 맞춤형 제스쳐에 실패 조건을 설정해야합니다

    새 디자인은 표시 방식으로도 확장되는데요 새로운 동적 줌 전환도 여기 포함됩니다 메뉴나 팝오버 등 표시 방식이 Glass 버튼에서 시작될 때 버튼은 오버레이로 변형됩니다

    덕분에 소스와 표시 방식간의 시각적 연속성을 유지하죠 애니메이션을 통해서요

    이 작동 방식은 메뉴에 자동 적용됩니다 소스가 barButtonItem이면 팝오버에 같은 애니메이션이 적용되죠 업데이트된 줌 전환으로 시트가 이 효과를 채택할 수 있습니다 선호하는 전환을 viewController에서 .zoom으로 설정하고 소스 barButtonItem을 클로저에서 반환합니다

    시트는 iOS 26에서 업데이트된 디자인을 갖고 있죠 디자인을 화면 높이에 맞게 조정합니다 새 Glass 디자인을 최대한 활용하려면 맞춤형 배경은 제거하는 것이 좋습니다

    iPad의 ActionSheet는 소스 뷰에 고정되어 있습니다 iOS 26부터 iPhone에서도 동일하게 작동하여 시작 뷰 위에 바로 나타납니다

    alertController에서 소스 아이템이나 소스 뷰를 popoverPresentationController에 반드시 설정하세요 표시될 기기와는 상관 없습니다 소스 뷰를 할당하면 새로운 전환이 동작 시트에도 마찬가지로 적용됩니다

    인라인으로 표시된 동작 시트는 취소 버튼이 없는데 다른 곳을 탭하면 취소되도록 암시되어 있기 때문이죠 소스를 지정하지 않으면 동작 시트는 가운데 정렬되고 취소 버튼을 갖게 됩니다 iOS 26은 새롭고 더 통합된 검색 경험을 제공하여 당신의 앱에 가장 알맞는 곳에 검색 필드를 놓을 수 있게 합니다 iPhone에서 검색 막대는 자동으로 도구 막대로 이동되며 이에 따라 검색 필드에 손쉽게 접근 가능하도록 합니다

    이미 도구 막대가 있다면 searchBarPlacementBarButtonItem를 막대의 다른 버튼에 추가하세요 정확히 원하는 위치에 검색 필드를 둘 수 있습니다

    확장된 필드 혹은 도구 막대 버튼으로 나타나는데 사용 가능한 공간에 따라 다릅니다

    iPad에서는 어디에서나 접근 가능한 검색을 위해 macOS 도구 막대 패턴을 따릅니다 navigationBar의 뒤쪽 에지에 검색을 배치하는 것이 Split View에 가장 잘 어울립니다 이 작동 방식을 활성화하려면 searchBarPlacementAllowsExternalIntegration을 탐색 항목에서 true로 설정하세요

    뷰 사이에서 전환하며 검색을 가능하게 하려면 UITabBarController를 사용하세요 끝쪽에 검색을 위한 별도의 탭을 포함할 수 있습니다 탭 하면 검색 버튼이 검색 필드로 확장되고 다른 버튼은 축소됩니다

    이 tabView는 검색 제안을 배치하기에 좋은 위치입니다 기본적으로 제안 사항 중 하나를 선택하거나 검색 필드를 탭하여 검색을 시작합니다

    검색 탭을 눌렀을 때 검색 필드가 자동으로 활성화되게 하려면 automaticallyActivateSearch를 탭에서 true로 설정하세요

    검색 전용 뷰에서는 검색이 사이드바나 탭 막대의 섹션이라고 생각하세요 검색 막대는 탐색 막대의 iPad에서 끝쪽 가장자리와 통합되고, 쌓이고 표준 너비로 가운데 정렬됩니다 serachBar를 가운데 정렬하려면 integratedCentered를 preferredSearchBarPlacement로 사용하세요 tabBar가 표시되면 searchBar는 그 아래에 위치합니다

    이제 개선된 디자인과 제어 기능을 살펴보죠

    iOS의 컨트롤은 익숙한 느낌을 유지하면서 새 모습과 분위기로 다시 디자인되었습니다 UISwitch같은 제어 기능의 크기가 약간 바뀌었습니다 레이아웃이 크기 업데이트를 수용하도록 설정됐는지 확인하세요 스위치나 segmentedControl에 있는 것과 같은 제어 기능 핸들은 상호 작용을 위해 자동으로 새 Liquid Glass 디자인을 갖죠

    UIButtonConfiguration을 통해 기존 버튼 스타일 외 두 개의 새 글래스 디자인을 사용할 수 있습니다 .glass() 구성으로 표준 글래스를 사용하세요 .prominentGlass()로 앱에 글래스 색조를 입힐 수 있죠 슬라이더 사용시, 핸들에는 Liquid Glass 효과뿐만 아니라 움직임에 따른 모멘텀과 스트레치 효과도 함께 유지합니다 iOS 26는 TrackConfiguration으로 이제 슬라이더에 눈금을 표시하죠 이 구성은 슬라이더의 모양과 작동 방식 설정에 사용됩니다 예를 들어, 이 속도 슬라이더를 5개의 값으로 제한하려면 TickValuesOnly와 5개의 눈금으로 트랙 구성을 설정하세요

    슬라이더는 중립 값을 사용하도록 구성돼 슬라이더 채움 영역이 최솟값에 고정되는 것이 아니라 트랙을 따라 어디에든 고정됩니다 슬라이더의 채움 영역이 선택한 값과 중립 값의 차이를 보여주는 거죠 이 예시에서 슬라이더 채움 영역은 사용자가 선택한 기본값보다 빠른 속도를 표시하죠 핸들이 없는 스타일의 슬라이더를 사용해 상호작용하지 않을 때는 진행 표시줄처럼 보이게 해보세요 미디어 재생 시 유용한 기능입니다 미디어가 재생 중일 때 큰 핸들이 방해되지 않도록 해주죠 시스템 제어 기능에 Liquid Glass가 적용되는 경우를 알아봤습니다 UIKit은 다양한 경우에 사용 가능하도록 API를 제공해 Liquid Glass의 새로운 모습과 분위기를 채택하게 해주죠 당신의 Ui에 Liquid Glass를 사용할 때 Liquid Glass의 디자인 인텐트를 기억하는 것이 중요합니다 Liquid Glass는 UIBlurEffect등 다른 시각 효과와 구분됩니다 따라서 사용하기 적합한 특정 위치가 존재하죠 Liquid Glass는 상호작용 레이어로 설계되어 콘텐츠 위, 사용자의 손가락 아래에 떠 있으며 사용자가 직접 터치하는 주요 제어 기능을 제공하죠 따라서 Liquid Glass는 앱의 가장 중요한 요소에 제한적으로 사용해야 합니다 가능하다면 시스템 뷰와 제어 기능을 이용해서 최고의 경험을 만드세요

    지도에서 위에 떠있는 맞춤형 버튼에 Liquid Glass를 사용해보세요 별도의 제어 기능 레이어로 자연스럽게 느껴집니다 Glass 효과를 이용해 떠 있는 시각 효과를 내는 좋은 방법입니다 시트가 확장되면 지도는 버튼을 사라지게 만들어 Glass 요소가 다른 Glass요소와 겹치는 것을 방지합니다 그리고 단일 플로팅 레이어 시각 효과를 글래스로 유지하죠

    맞춤형 뷰에 글래스를 사용하려면 UIVisualEffectView와 새 UIGlassEffect를 생성하고

    애니메이션 블록에서 효과를 설정하세요

    글래스는 물리화된 특별한 애니메이션으로 나타납니다

    기본적으로 글래스는 캡슐 모양입니다 모양을 사용자화하려면 corner configuration API를 사용하세요

    글래스에는 라이트 모드와 다크 모드가 있어 선택된 userInterfaceStyle에 맞게 적용됩니다 글래스를 기존 Glass 컨테이너에 추가하면 자동으로 새 디자인이 맞춤 적용됩니다 모서리가 컨테이너에 맞게 자동 적용되게 하려면 .containerRelative corner Configuration을 사용하세요 뷰를 컨테이너의 모서리에 더 가깝게 옮기면 cornerRadius가 자동으로 맞춤 적용됩니다

    더 멀리 옮기면 모서리 반경이 줄어들어 자동으로 중심 정렬을 유지하죠 글래스는 크기에 따라 모양을 맞춤 조정합니다

    크기가 커지면 불투명해지고

    크기가 작으면 투명해지죠 라이트 및 다크 모드로 자동으로 전환하며 대비를 높입니다

    레이블이나 이미지같은 콘텐츠를 추가하려면 visualEffectView의 contentView를 사용하세요 레이블이 텍스트 색상에 맞게 생동감 있는 색으로 변해 다양한 배경에 대한 가독성을 보장하죠

    아래의 색상에 따라 글래스와 글래스 콘텐츠는 라이트 및 다크 모드로 자동 전환됩니다 동적 색상을 사용하는 경우에요

    눈에 띄는 뷰를 강조하려면 글래스에 .tintClolor를 설정하고 다른 글래스 속성과 함께 애니메이션을 적용하세요 텍스트 색 등 콘텐츠 변경 사항에 동시에 애니메이션을 적용하세요

    글래스에서 맞춤형 색조 색상을 사용하려면 새 UIGlassEffect를 생성하고 맞춤형 tintColor를 지정해 새 UIGlassEffect로 효과를 애니메이션 적용합니다 글래스 색상은 자동으로 생생한 버전에 맞게 조정됩니다 글래스 위의 콘텐츠를 제거하려면 콘텐츠의 알파를 0으로 만들어 애니메이션을 적용합니다

    버튼과 같은 상호작용 시스템 요소는 사용자 상호작용에 반응합니다 버튼을 탭하면 크기가 커지며 튀어 오르죠 맞춤형 보기에도 같은 상호작용을 적용하려면 glassEffect의 isInteractive를 true로 설정하세요

    마지막으로 더 이상 화면 위 글래스가 필요하지 않으면 effect를 nil로 설정해 사라지게 만들 수 있죠

    글래스가 애니메이션과 함께 사라지게 하거나 나타나게 할 때 알파 값을 조정하는 것보다 효과 속성을 설정하는 게 항상 더 낫습니다 예시에는 Liquid Glass를 사용한 단일 뷰만 있었습니다 글래스에는 다중 요소 상호작용 시 추가적인 내장 작동 방식도 있죠 Liquid Glass는 다양한 모양과 매끄럽게 섞이죠

    글래스 뷰를 동적으로 결합하려면 UIGlassContainerEffect를 사용해 UIVisualEffectView를 구성하고 나만의 글래스 뷰를 만든 다음 컨테이너의 contentView 하위 뷰에 추가하세요 둘 사이에 공간이 있다면 두 개의 분리된 뷰로 나타나고

    가까워진다면 물방울처럼 결합합니다 서로 영향을 미치기 시작하는 거리를 제어하려면 UIGlassContainerEffect에서 공간 속성을 사용하세요

    겹치는 프레임으로 애니메이션을 적용할 때 글래스 뷰는 하나의 모양으로 결합됩니다 글래스를 여러 요소로 나누려면 우선 애니메이션 없이 같은 위치에 추가하고 그런 다음 함께 애니메이션화 하세요

    UIGlassContainerEffect에는 애니메이션 외에도 기능이 많죠 균일한 맞춤 적용도 강화해줍니다 글래스가 배경에 역동적으로 맞춤 적용되면서도 디자인 일관성을 유지하죠

    Liquid Glass에서 개선된 UIKit 구성 요소, 재료를 검토해봤습니다 UIKit은 당신의 앱을 새 디자인으로 업데이트하는 데 필요한 모든 도구를 제공하죠 Xcode 26으로 앱을 구축하는 것부터 시작하세요 새 디자인의 대부분은 앱에 즉시 적용될 것입니다 화면별로 앱을 확인하고 어떤 뷰가 눈에 띄는지 알아보세요

    맞춤형 제어 기능이 있다면 표준 UIKit 제어 기능이 더 잘 어울릴지 고민해보세요 마지막으로, 다양한 상황에서 Liquid Glass를 활용해 눈에 띄게 디자인하는 법을 생각해보세요

    새로운 디자인 시스템을 적용한 당신의 앱을 얼른 확인하고 싶네요 시청해 주셔서 감사합니다

    • 2:31 - Minimize tab bar on scroll

      // Minimize tab bar on scroll
      
      tabBarController.tabBarMinimizeBehavior = .onScrollDown
    • 3:08 - Add a bottom accessory

      // Add a bottom accessory
      
      let nowPlayingView = NowPlayingView()
      let accessory = UITabAccessory(contentView: nowPlayingView)
      tabBarController.bottomAccessory = accessory
    • 3:35 - Update the accessory with the tabAccessoryEnvironment trait

      // Update the accessory with the trait
      
      registerForTraitChanges([UITraitTabAccessoryEnvironment.self]) { (view: MiniPlayerView, _) in
          let isInline = view.traitCollection.tabAccessoryEnvironment == .inline
          view.updatePlayerAppearance(inline: isInline)
      }
      
      // Automatic trait tracking with updateProperties()
      override func updateProperties() {
          super.updateProperties()
          let isInline = traitCollection.tabAccessoryEnvironment == .inline
          updatePlayerAppearance(inline: isInline)
      }
    • 5:51 - Extend content under the sidebar

      // Extend content underneath the sidebar
      
      let posterImageView = UIImageView(image: ...)
      
      let extensionView = UIBackgroundExtensionView()
      extensionView.contentView = posterImageView
      view.addSubview(extensionView)
      
      let detailsView = ShowDetailsView()
      view.addSubview(detailsView)
    • 6:51 - Adjust the effect layout

      // Adjust the effect layout
      
      let posterImageView = UIImageView(image: ...)
      
      let extensionView = UIBackgroundExtensionView()
      extensionView.contentView = posterImageView
      extensionView.automaticallyPlacesContentView = false
      view.addSubview(extensionView)
      
      posterImageView.translatesAutoresizingMaskIntoConstraints = false
      NSLayoutConstraint.activate([
          posterImageView.topAnchor.constraint(equalTo: extensionView.topAnchor),
          posterImageView.leadingAnchor.constraint(equalTo: extensionView.safeAreaLayoutGuide.leadingAnchor),
          posterImageView.trailingAnchor.constraint(equalTo: extensionView.safeAreaLayoutGuide.trailingAnchor),
          posterImageView.bottomAnchor.constraint(equalTo: extensionView.safeAreaLayoutGuide.bottomAnchor),
      ])
    • 8:38 - Custom grouping

      // Custom grouping
      
      navigationItem.rightBarButtonItems = [
          doneButton,
          flagButton,
          folderButton,
          infoButton,
          .fixedSpace(0),
          shareButton,
          selectButton
      ]
    • 8:53 - UIBarButtonItem tint color and style

      // Tint color and style
      
      let flagButton = UIBarButtonItem(image: UIImage(systemName: "flag.fill"))
      flagButton.tintColor = .systemOrange
      flagButton.style = .prominent
    • 9:10 - Toolbar with evenly distributed items in a single background

      // Toolbar with evenly distributed items, grouped in a single background.
      
      let flexibleSpace = UIBarButtonItem.flexibleSpace()
      flexibleSpace.hidesSharedBackground = false
      
      toolbarItems = [
         .init(image: UIImage(systemName: "location")),
         flexibleSpace,
         .init(image: UIImage(systemName: "number")),
         flexibleSpace,
         .init(image: UIImage(systemName: "camera")),
         flexibleSpace,
         .init(image: UIImage(systemName: "trash")),
      ]
    • 10:15 - Titles and subtitles

      // Titles and subtitles
      
      navigationItem.title = "Inbox"
      navigationItem.subtitle = "49 Unread"
    • 10:27 - Large subtitle view

      // Titles and subtitles
      
      navigationItem.title = "Inbox"
      navigationItem.largeSubtitleView = filterButton
    • 11:20 - Edge effect for a custom container

      // Edge effect’s custom container
      
      let interaction = UIScrollEdgeElementContainerInteraction()
      interaction.scrollView = contentScrollView
      interaction.edge = .bottom
      
      buttonsContainerView.addInteraction(interaction)
    • 11:48 - Hard edge effect style

      // Hard edge effect style
      
      scrollView.topEdgeEffect.style = .hard
    • 13:55 - Morph popover from its source button

      // Morph popover from its source button
      
      viewController.popoverPresentationController?.sourceItem = barButtonItem
    • 14:07 - Morph sheet from bar button

      // Morph sheet from bar button
      
      viewController.preferredTransition = .zoom { _ in 
           folderBarButtonItem
      }
    • 14:46 - Source item for action sheets

      // Setting source item for action sheets
      
      alertController.popoverPresentationController?.sourceItem = barButtonItem
    • 15:36 - Placing search in the toolbar

      // Place search bar in a toolbar
      
      toolbarItems = [
          navigationItem.searchBarPlacementBarButtonItem,
          .flexibleSpace(),
          addButton
      ]
    • 16:01 - Universally accessible search on iPad

      // Place search at the trailing edge of the navigation bar
      
      navigationItem.searchBarPlacementAllowsExternalIntegration = true
    • 16:47 - Activate the search field when search bar is tapped

      // Activate the search field when search bar is tapped
      
      searchTab.automaticallyActivatesSearch = true
    • 17:03 - Search as a dedicated view

      // Search as a dedicated view
      
      navigationItem.preferredSearchBarPlacement = .integratedCentered
    • 17:52 - Buttons

      // Standard glass
      button.configuration = .glass()
      
      // Prominent glass
      tintedButton.configuration = .prominentGlass()
    • 18:16 - Neutral slider with 5 ticks and a neutral value

      // Neutral slider with 5 ticks and a neutral value
      slider.trackConfiguration = .init(allowsTickValuesOnly: true,
                                        neutralValue: 0.2,
                                        numberOfTicks: 5)
    • 18:59 - Thumbless slider

      // Thumbless slider
      slider.sliderStyle = .thumbless
    • 20:28 - Glass for custom views

      // Adopting glass for custom views
      
      let effectView = UIVisualEffectView()
      addSubview(effectView)
      
      let glassEffect = UIGlassEffect()
      // Animating setting the effect results in a materialize animation
      UIView.animate {
          effectView.effect = glassEffect
      }
    • 20:49 - Custom corner configuration

      // Custom corner configuration
      
      UIView.animate {
          effectView.cornerConfiguration = .fixed(8)
      }
    • 20:54 - Dark mode

      // Adapting to dark mode
      
      UIView.animate {
          view.overrideUserInterfaceStyle = .dark
      }
    • 21:02 - Adding glass to an existing glass container

      // Adding glass to an existing glass container
      
      let container = UIVisualEffectView()
      container.effect = UIGlassEffect()
      
      container.contentView.addSubview(effectView)
    • 21:08 - Container relative corners

      // Container relative corners
      
      UIView.animate {
          effectView.cornerConfiguration = .containerRelative()
          effectView.frame.origin = CGPoint(x: 10, y: 10)
      }
    • 21:23 - Container relative corners, animated

      // Container relative corners
      
      UIView.animate {
          effectView.frame.origin = CGPoint(x: 30, y: 30)
      }
    • 21:30 - Glass adapts based on its size

      // Glass adapts based on its size
      
      UIView.animate {
          view.overrideUserInterfaceStyle = .light
          effectView.bounds.size = CGSize(width: 250, height: 88)
      }
      
      UIView.animate {
          effectView.bounds.size = CGSize(width: 150, height: 44)
      }
    • 21:49 - Adding content to glass views

      // Adding content to glass views
      
      let label = UILabel()
      label.text = "WWDC25"
      label.textColor = .secondaryLabel
      
      effectView.contentView.addSubview(label)
    • 22:15 - Applying tint color to glass

      // Applying tint color to glass
      
      let glassEffect = UIGlassEffect()
      glassEffect.tintColor = .systemBlue
      
      UIView.animate {
          effectView.effect = glassEffect
          label.textColor = .label
      }
    • 22:33 - Using custom colors with glass

      // Using custom colors with glass
      
      let glassEffect = UIGlassEffect()
      glassEffect.tintColor = UIColor(displayP3Red: r,
                                      green: g,
                                      blue: b,
                                      alpha: 1)
      
      UIView.animate {
          effectView.effect = glassEffect
          // Animate out the label
          label.alpha = 0
      }
    • 23:03 - Enabling interactive glass behavior

      // Enabling interactive glass behavior
      
      let glassEffect = UIGlassEffect()
      glassEffect.isInteractive = true
      
      effectView.effect = glassEffect
    • 23:20 - Animating glass out using dematerialize animation

      // Animating glass out using dematerialize animation
      
      UIView.animate {
          effectView.effect = nil
      }
    • 23:52 - Adding glass elements to a container

      // Adding glass elements to a container
      
      let container = UIGlassContainerEffect()
      let containerView = UIVisualEffectView(effect: container)
      
      let glassEffect = UIGlassEffect()
      let view1 = UIVisualEffectView(effect: glassEffect)
      let view2 = UIVisualEffectView(effect: glassEffect)
      
      containerEffectView.contentView.addSubview(view1)
      containerEffectView.contentView.addSubview(view2)
    • 24:12 - Adjusting the container spacing

      // Adjusting the container spacing
      
      let containerEffect = UIGlassContainerEffect()
      containerEffect.spacing = 20
      containerEffectView.effect = containerEffect
    • 24:27 - Merging two glass views

      // Merging two glass views
      
      UIView.animate {
          view1.frame = finalFrame
          view2.frame = finalFrame
      }
    • 24:33 - Dividing glass into multiple views

      // Dividing glass into multiple views
      
      UIView.performWithoutAnimation {
          for view in finalViews {
              containerEffectView.contentView.addSubview(view)
              view.frame = startFrame
          }
      }
      
      UIView.animate {
          for view in finalViews {
              view.frame = finalFrame(for: view)
          }
      }
    • 0:00 - Introduction
    • Learn how you can incorporate the new design language of iOS 26 into your apps. The new design, centered around the dynamic and translucent material called Liquid Glass, automatically updates the appearance of apps recompiled with the latest SDK. This video covers various aspects of the new design, including the updated look and behavior of tab views, split views, navigation bars, toolbars, and more, which now feature Liquid Glass elements. There is also guidance on bringing the Liquid Glass to custom UI elements.

    • 1:55 - Tab views and split views
    • 'UITabBarController' and 'UISplitViewController' now have a modern Liquid Glass appearance. Tab bars on iPhone now float above content and can minimize on scroll, enhancing focus. You can customize this behavior and add an accessory view above the tab bar, which animates down when minimized. On iPad, tab bars and sidebars also float in Liquid Glass. Apps adopting 'UITab' and 'UITabGroup' automatically adapt between tab bar and sidebar views. Sidebars look best with vibrant content extending underneath, achieved using the new 'UIBackgroundExtensionView', which creates a seamless visual effect.

    • 7:19 - Navigation and toolbars
    • In iOS 26, navigation and toolbars feature a new glass-like appearance, floating above content with automatic grouping of bar button items into visual groups sharing glass backgrounds. Text buttons, system "Done" and "Close" buttons, and prominent style buttons have separate backgrounds. You can customize button groups, tint colors, and backgrounds. 'UINavigationItem' gives more control over title and large title areas, and also allows to set subtitles. Scroll views underneath navigation bars or toolbars apply an edge effect for legibility.

    • 13:31 - Presentations
    • The design of presentations, menus, popovers, sheets, and action sheets is now updated to enhance visual continuity. Glass buttons morph into overlays for menus and popovers, and sheets now adapt their appearance from smaller to larger heights. Action sheets on both iPhone and iPad are anchored to their source views, appearing directly over them. Remove custom backgrounds from sheets, and specify source views for action sheets and alert controllers to apply the new transitions and behaviors. Inline action sheets on iPhone no longer have a cancel button because tapping anywhere else dismisses them.

    • 15:18 - Search
    • The search experience across iPhone and iPad is enhanced in iOS 26. On iPhone, the search bar now sits in the toolbar, appearing as an expanded field or button based on space. On iPad, search is at the trailing edge of the navigation bar for split views, or as a dedicated tab in a 'UITabBarController', which expands into a search field when tapped. You can also customize search placement in sidebars, tab bars, and navigation bars, and enable automatic search field activation upon tab selection.

    • 17:24 - Controls
    • iOS controls have undergone a subtle redesign, maintaining their familiarity while incorporating new Liquid Glass effects. Sliders have enhanced features such as momentum preservation, stretching, and the option to display tick marks, neutral values, and a thumbless style resembling a progress bar. Two new Liquid Glass appearances are available for buttons. Make sure that your layouts accommodate the updated control sizes.

    • 19:15 - Custom elements
    • UIKit provides APIs for you to bring Liquid Glass to your custom UI. Use Liquid Glass sparingly for the most important elements. Apply the effect to custom views using a 'UIVisualEffectView' and 'UIGlassEffect', and customize shape, appearance, and tint color. You can animate Liquid Glass elements to materialize, dematerialize, and merge seamlessly like water droplets when overlapping. The 'UIGlassContainerEffect' ensures uniform adaptation and consistency across different backgrounds. Interactive elements can scale and bounce upon user interaction, enhancing the experience.

    • 25:01 - Next steps
    • Liquid Glass introduces new UIKit components and materials that you can easily integrate into apps. Build your apps with Xcode 26, audit each screen, and consider replacing custom controls with standard UIKit ones. Leverage Liquid Glass to enhance your app's design while making special use cases stand out.

Developer Footer

  • 비디오
  • WWDC25
  • 새로운 디자인으로 UIKit 앱 빌드하기
  • 메뉴 열기 메뉴 닫기
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    메뉴 열기 메뉴 닫기
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    메뉴 열기 메뉴 닫기
    • 손쉬운 사용
    • 액세서리
    • 앱 확장 프로그램
    • App Store
    • 오디오 및 비디오(영문)
    • 증강 현실
    • 디자인
    • 배포
    • 교육
    • 서체(영문)
    • 게임
    • 건강 및 피트니스
    • 앱 내 구입
    • 현지화
    • 지도 및 위치
    • 머신 러닝
    • 오픈 소스(영문)
    • 보안
    • Safari 및 웹(영문)
    메뉴 열기 메뉴 닫기
    • 문서(영문)
    • 튜토리얼
    • 다운로드(영문)
    • 포럼(영문)
    • 비디오
    메뉴 열기 메뉴 닫기
    • 지원 문서
    • 문의하기
    • 버그 보고
    • 시스템 상태(영문)
    메뉴 열기 메뉴 닫기
    • Apple Developer
    • App Store Connect
    • 인증서, 식별자 및 프로파일(영문)
    • 피드백 지원
    메뉴 열기 메뉴 닫기
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi 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 © 2025 Apple Inc. 모든 권리 보유.
    약관 개인정보 처리방침 계약 및 지침