-
Crie um app em SwiftUI com o novo design
Descubra como o Liquid Glass transforma a aparência e experiência do seu app. Confira como esse novo material aprimora barras de ferramentas, controles e estruturas de apps em todas as plataformas, proporcionando interações fluidas e integrando perfeitamente seu app ao sistema. Saiba como adotar novas APIs que ajudam você a aproveitar ao máximo o Liquid Glass.
Capítulos
- 0:00 - Introdução
- 3:07 - Estrutura do app
- 7:49 - Barras de ferramentas
- 11:10 - Busca
- 14:03 - Controles
- 17:57 - Efeitos de Liquid Glass
- 21:31 - Próximas etapas
Recursos
- Applying Liquid Glass to custom views
- Landmarks: Building an app with Liquid Glass
- Adopting Liquid Glass
Vídeos relacionados
WWDC25
-
Buscar neste vídeo...
-
-
1:11 - Segmented Picker
Picker("View", selection: $selection) { Text("Map").tag(ViewMode.map) Text("List").tag(ViewMode.list) } .pickerStyle(.segmented) -
3:59 - Extend background images
// Extend background images struct LandmarkDetailView: View { let landmark: Landmark var body: some View { ScrollView { VStack { Image(landmark.backgroundImageName) .resizable() .aspectRatio(contentMode: .fill) .backgroundExtensionEffect() } } } } -
4:23 - Adding an inspector
// Adding an inspector NavigationSplitView { // sidebar } detail: { // detail } .inspector(isPresented: $presentInspector) { LandmarkDetailInspectorView(landmark: landmark) } -
5:07 - Minimize tab bar on scroll
// Minimize tab bar on scroll TabView { // tabs } .tabBarMinimizeBehavior(.onScrollDown) -
5:39 - Tab bar accessory
// Tab bar accessory TabView { // tabs } .tabBarMinimizeBehavior(.onScrollDown) .tabViewBottomAccessory { MusicPlaybackView() } struct MusicPlaybackView: View { @Environment(\.tabViewBottomAccessoryPlacement) var placement var body: some View { if placement == .inline { // compact layout } else { // full layout } } } -
6:20 - Sheets with presentation detents
// Sheets CollectionDetailView() .sheet(isPresented: $isShowingLandmarksSelection) { LandmarksSelectionList() .presentationDetents([.height(180), .medium, .large]) } -
6:53 - Presentation background
// Presentation background CollectionDetailView() .sheet(isPresented: $isShowingLandmarksSelection) { LandmarksSelectionList() .presentationDetents([.height(180), .medium, .large]) .presentationBackground(.thickMaterial) } -
7:10 - Zoom transition
// Zoom transition @Namespace private var namespace ContentView() .toolbar { ToolbarItem(placement: .bottomBar) { Button { isPresented = true } label: { Image(systemName: "map") } .matchedTransitionSource( id: "transition-id", in: namespace) } } .sheet(isPresented: $isPresented) { SheetContent() .navigationTransition( .zoom( sourceID: "transition-id", in: namespace)) } -
7:27 - Toolbar menus
// Toolbar menus LandmarkDetailView() .toolbar { ToolbarItemGroup { Button { } label: { Image(systemName: "square.and.arrow.up") } Menu( "Collections", systemImage: "book.closed" ) { // menu items } } } -
7:41 - Confirmation dialog
// Confirmation dialog CollectionDetailView() .toolbar { Button("Delete", systemImage: "trash") { presentDialog = true } .confirmationDialog( "Delete?", isPresented: $presentDialog ) { Button("Delete", role: .destructive) { } } } -
8:26 - Visually separate toolbar items
// Visually separate toolbar items struct LandmarkDetailView: View { var body: some View { ScrollView { ScrollContent() } .toolbar { ToolbarItem { ShareLink() } ToolbarSpacer(.fixed) ToolbarItem { FavoriteButton() } ToolbarItem { CollectionsButton() } ToolbarSpacer(.fixed) ToolbarItem { InspectorToggle() } } } } -
8:47 - Toolbar items with flexible spacing
// Toolbar items with flexible spacing struct InboxView: View { var body: some View { ScrollView { ScrollContent() } .toolbar { ToolbarItem(placement: .bottomBar) { FilterPicker() } ToolbarSpacer(.flexible, placement: .bottomBar) DefaultToolbarItem( kind: .search, placement: .bottomBar) ToolbarSpacer(.fixed, placement: .bottomBar) ToolbarItem(placement: .bottomBar) { NewMessageButton() } } } } -
9:07 - Hide shared glass background
// Hide shared glass background struct HomeView: View { var body: some View { ContentView() .toolbar { ToolbarItem { ProfileButton() } .sharedBackgroundVisibility(.hidden) } } } -
9:40 - Toolbar item with a badge
// Toolbar item with a badge @Environment(ModelData.self) var modelData CollectionsView() .toolbar { ToolbarItemGroup { Button("Notifications", systemImage: "bell") { } .badge(modelData.notifications.count) Button("Add", systemImage: "plus") { } } } -
10:57 - Hard scroll edge effect
// Hard scroll edge effect ScrollView { // content } .scrollEdgeEffectStyle(.hard, for: .top) -
11:44 - Search in top-trailing position
// Search in the top-trailing position struct TopTrailingSearch: View { @State private var searchText = "" var body: some View { NavigationSplitView { SidebarContent() } detail: { DetailContent() } .searchable(text: $searchText) } } -
12:51 - Minimized search in toolbar
// Minimized search in the toolbar struct MinimizedSearch: View { @State private var searchText = "" var body: some View { NavigationStack { DetailContent() } .searchable(text: $searchText) .searchToolbarBehavior(.minimize) } } -
13:17 - TabView with a search tab
// TabView with a search tab struct ContentView: View { @State private var searchText = "" var body: some View { TabView { // other tabs Tab(role: .search) { NavigationStack { SearchTabContent() } } } .searchable(text: $searchText) } } -
14:25 - Capsule buttons
Button(…) .buttonBorderShape(.capsule) -
15:09 - Button sizes: high density layouts
// Button sizes: high density layouts VStack { Picker("Inspector View Mode", selection: $mode) { // options } .controlSize(.large) InspectorStackView() .controlSize(.small) } -
15:33 - Glass button styles
// Prominent glass button Button("Get Started") { } .buttonStyle(.glassProminent) // Standard glass button Button("Learn More") { } .buttonStyle(.glass) -
16:32 - macOS menu icons
// Menus Menu("Edit") { Section { Button("Undo", systemImage: "arrow.uturn.backward") { } Button("Redo", systemImage: "arrow.uturn.forward") { } } Section { Button("Copy", systemImage: "document.on.document") { } Button("Duplicate", systemImage: "plus.square.on.square") { } } } -
17:27 - Concentric rectangle shape
// Concentric rectangle shape CustomControl() .background(.tint, in: .rect(corner: .containerConcentric)) -
18:30 - Glass effect
// Glass effect Label("Desert", systemImage: "sun.max.fill") .padding() .glassEffect() -
18:52 - Glass effect: custom shape
// Customize shape Label("Desert", systemImage: "sun.max.fill") .padding() .glassEffect(in: .rect(cornerRadius: 16)) -
18:59 - Glass effect: tinted
// Tinted glass Label("Desert", systemImage: "sun.max.fill") .padding() .glassEffect(.regular.tint(.green)) -
19:21 - Glass effect: interactive
// Interactive glass Label("Desert", systemImage: "sun.max.fill") .padding() .glassEffect(.regular.interactive()) -
19:51 - Glass morphing with GlassEffectContainer
// GlassEffectContainer @Namespace var namespace GlassEffectContainer { VStack { if isExpanded { VStack(spacing: 16) { ForEach(badges) { badge in BadgeLabel(badge: badge) .glassEffect() .glassEffectID(badge.id, in: namespace) } } } BadgeToggle() .buttonStyle(.glass) .glassEffectID("badgeToggle", in: namespace) } }
-
-
- 0:00 - Introdução
O iOS 26 e o macOS Tahoe trazem o Liquid Glass, um novo material adaptativo para controles e elementos de navegação inspirados em vidro e líquido. Esse material muda de cor conforme alguém rola a tela e torna controles, como botões de alternância e controles deslizantes, mais interativos e visualmente atraentes. As atualizações se aplicam a todas as plataformas Apple e incluem alterações em componentes estruturais, como "TabView" e "NavigationSplitView", barras de ferramentas, experiências de pesquisa e a introdução de novas APIs para desenvolvedores personalizarem a interface de seus apps. O app Landmarks demonstra esses novos recursos.
- 3:07 - Estrutura do app
A estrutura do app é atualizada com APIs refinadas, incluindo "NavigationSplitView", "TabView" e "Sheets", todas com o novo design do Liquid Glass. "NavigationSplitView" agora tem uma barra lateral flutuante de Liquid Glass com um modificador "backgroundExtensionEffect", que permite que as visualizações se estendam além da área segura sem serem cortadas. "TabViews" no iPhone têm uma barra de abas flutuante, que pode se minimizar ao rolar a tela, melhorando a visibilidade do conteúdo, e pode incluir uma visualização acessória na parte inferior para controles adicionais. "Sheets" agora têm um fundo Liquid Glass que faz a transições suaves entre alturas parcial e total. Elas também podem surgir a partir dos botões que as apresentam, criando uma experiência de usuário fluida e integrada. Outras apresentações, como menus, alertas e popovers, também fluem suavemente a partir de controles de Liquid Glass. As caixas de diálogo agora se transformam automaticamente a partir dos botões que as apresentam.
- 7:49 - Barras de ferramentas
O novo design do app apresenta barras de ferramentas flutuantes em superfícies Liquid Glass com agrupamento automático de itens. Você pode usar a API ToolbarSpacer para criar agrupamentos e espaçamentos personalizados, melhorando a clareza visual. Adicione badges com uma única linha de código para indicar notificações. Ícones monocromáticos reduzem o ruído visual, e um efeito automático na borda de rolagem desfoca o conteúdo sob barras de ferramentas para facilitar a legibilidade. É possível remover fundos extras e ajustar a interface para um design mais compacto.
- 11:10 - Busca
O novo design apresenta dois padrões principais de busca em todas as plataformas: Busca na barra de ferramentas. O campo de busca fica na parte inferior da tela no iPhone, no canto superior direito no iPad e Mac, ou minimizado em um botão que se expande ao ser tocado. Página de busca dedicada. A busca é acessada por meio de uma aba, substituindo a barra de abas por um campo de busca e pelo conteúdo do app. O campo de busca aparece centralizado acima das sugestões no iPad e no Mac.
- 14:03 - Controles
O novo design apresenta uma aparência familiar e consistente entre plataformas para diverso controles. Por padrão, os botões agora têm uma forma de cápsula, com alturas maiores no macOS para facilitar a leitura e oferecer alvos de clique maiores. Botões extragrandes e novos estilos de vidro também estão disponíveis. Os controles deslizantes agora aceitam marcações, posicionamento manual dessas marcações e preenchimento inicial da faixa com valores específicos. Os menus receberam um design renovado com posicionamento consistente de ícones entre as plataformas. O novo design também inclui concentricidade de cantos, garantindo que os controles se alinhem perfeitamente dentro dos seus contêineres.
- 17:57 - Efeitos de Liquid Glass
Para personalizar ainda mais um app, você pode criar elementos Liquid Glass personalizados. Por exemplo, o app Landmarks usa selos com o efeito Liquid Glass. Para isso, aplique o modificador "glassEffect" a visualizações personalizadas, que você pode moldar e colorir para dar ênfase. O modificador "interactive" está disponível para os controles do iOS, permitindo dimensionamento, oscilação e cintilação após a interação. Agrupe vários elementos de vidro dentro de um "GlassEffectContainer" para garantir resultados visuais consistentes, pois o vidro não pode amostrar outros vidros. Crie transições entre elementos de vidro usando o modificador "glassEffectID", que permite efeitos de transformação fluida. Essa técnica realça o apelo visual e a singularidade de um app, destacando-o.
- 21:31 - Próximas etapas
O novo design do Xcode 26 inclui controles padrão que fornecem melhorias automáticas e Liquid Glass para criar componentes expressivos. Revise os fluxos do seu app, remova cores de fundo desnecessárias e aproveite o Liquid Glass para destacar seus apps.