-
Novidades do SwiftUI
Conheça as novidades do SwiftUI para criar ótimos apps para qualquer plataforma Apple. Vamos explorar como dar uma nova aparência ao seu app com o Liquid Glass. Descubra como aumentar o desempenho com melhorias no framework e novos instrumentos e como integrar recursos avançados, como conteúdo da web e edição de texto avançado. Também mostraremos como o SwiftUI está expandindo para mais lugares, incluindo a disposição das visualizações em três dimensões.
Capítulos
- 0:00 - Introdução
- 1:22 - Fazer o novo design brilhar
- 6:59 - Fundamentos do framework
- 14:33 - SwiftUI em todo o sistema
- 20:04 - Expandir visualizações do SwiftUI
- 25:01 - Próximas etapas
Recursos
- Applying Liquid Glass to custom views
- Populating SwiftUI menus with adaptive controls
- Adopting Liquid Glass
- Human Interface Guidelines
Vídeos relacionados
WWDC25
- Adote os recursos de concorrência do Swift
- Aprimore o design do seu app para iPad
- Codificação guiada: crie uma experiência com texto avançado no SwiftUI com o AttributedString
- Codificação guiada: explore recursos de localização no Xcode
- Conheça o layout espacial do SwiftUI
- Conheça o WebKit para SwiftUI
- Crie um app em SwiftUI com o novo design
- Explore a concorrência no SwiftUI
- Leve o Swift Charts para a terceira dimensão
- Melhor juntos: SwiftUI e RealityKit
- Novidades do visionOS 26
- Novidades dos widgets
- Novidades na renderização no Metal para apps imersivos
- Otimize o desempenho do SwiftUI com o Instruments
- Personalize seu app para Acesso Assistivo
- Prepare o ambiente com o SwiftUI no visionOS
-
Buscar neste vídeo...
-
-
2:27 - Toolbar spacer
import SwiftUI struct TripDetailView: View { var body: some View { NavigationStack { TripList() .toolbar { ToolbarItemGroup(placement: .primaryAction) { UpButton() DownButton() } ToolbarSpacer(.fixed, placement: .primaryAction) ToolbarItem(placement: .primaryAction) { SettingsButton() } } } } } struct TripList: View { var body: some View { Text("TripList") } } struct UpButton: View { var body: some View { Button("Up", systemImage: "chevron.up") { } } } struct DownButton: View { var body: some View { Button("Down", systemImage: "chevron.down") { } } } struct SettingsButton: View { var body: some View { Button("List Settings", systemImage: "ellipsis") { } } } -
2:52 - Toolbar item tint
import SwiftUI struct InspectorView: View { var body: some View { NavigationStack { InspectorMap() .toolbar { ToolbarItem(placement: .primaryAction) { SaveLocationButton() .buttonStyle(.borderedProminent) .tint(.pink) } } } } } struct InspectorMap: View { var body: some View { Text("InspectorMap") } } struct SaveLocationButton: View { var body: some View { Button("SaveLocationButton") { } } } -
3:30 - Searchable
import SwiftUI struct PlannerSplitView: View { @State private var query: String = "" var body: some View { NavigationSplitView { Text("Sidebar") } detail: { Text("Detail") } .searchable( text: $query, prompt: "What are you looking for?" ) } } -
4:12 - Search tab
import SwiftUI struct HealthTabView: View { @State private var text: String = "" var body: some View { TabView { Tab("Summary", systemImage: "heart") { NavigationStack { Text("Summary") } } Tab("Sharing", systemImage: "person.2") { NavigationStack { Text("Sharing") } } Tab(role: .search) { NavigationStack { Text("Search") } } } .searchable(text: $text) } } -
4:37 - Glass effect
import SwiftUI struct ToTopButton: View { var body: some View { Button("To Top", systemImage: "chevron.up") { scrollToTop() } .padding() .glassEffect() } func scrollToTop() { // Scroll to top of view } } -
5:20 - Menu bar commands
import SwiftUI @main struct TravelPhotographyApp: App { var body: some Scene { WindowGroup { RootView() } .commands { TextEditingCommands() } } } struct RootView: View { var body: some View { Text("RootView") } } -
6:40 - Window resize anchor
import SwiftUI struct SettingsTabView: View { @State private var selection: SectionTab = .general var body: some View { TabView(selection: $selection.animation()) { Tab("General", systemImage: "gear", value: .general) { Text("General") } Tab("Sections", systemImage: "list.bullet", value: .sections) { Text("Sections") } } .windowResizeAnchor(.top) } } enum SectionTab: Hashable { case general case sections } -
11:24 - @Animatable macro
import SwiftUI @Animatable struct LoadingArc: Shape { var center: CGPoint var radius: CGFloat var startAngle: Angle var endAngle: Angle @AnimatableIgnored var drawPathClockwise: Bool func path(in rect: CGRect) -> Path { // Creates a `Path` arc using properties return Path() } } -
12:15 - Spatial overlay
import RealityKit import SwiftUI struct Map: View { @Binding var timeAlignment: Alignment3D var body: some View { Model3D(named: "Map") .spatialOverlay( alignment: timeAlignment ) { Sun() } } } struct Sun: View { var body: some View { Model3D(named: "Sun") } } -
13:04 - Manipulable and surface snapping
import ARKit import RealityKit import SwiftUI struct BackpackWaterBottle: View { @Environment(\.surfaceSnappingInfo) var snappingInfo: SurfaceSnappingInfo var body: some View { VStackLayout().depthAlignment(.center) { waterBottleView .manipulable() Pedestal() .opacity( snappingInfo.classification == .table ? 1.0 : 0.0) } } var waterBottleView: some View { Model3D(named: "waterBottle") } } struct WaterBottleView: View { var body: some View { Model3D(named: "waterBottle") } } struct Pedestal: View { var body: some View { Model3D(named: "pedestal") } } -
15:00 - SwiftUI scenes
import SwiftUI @main struct PhotoWalk: App { var body: some Scene { WindowGroup(id: "AppContents") { PhotoWalkContent() } } } struct PhotoWalkContent: View { var body: some View { Text("PhotoWalkContent") } } -
16:28 - Assistive Access scene
import SwiftUI @main struct PhotoWalk: App { var body: some Scene { WindowGroup { ContentView() } AssistiveAccess { AssistiveAccessContentView() } } } struct ContentView: View { var body: some View { Text("ContentView") } } struct AssistiveAccessContentView: View { var body: some View { Text("AssistiveAccessContentView") } } -
17:52 - SwiftUI presentations from RealityKit
import RealityKit import SwiftUI struct PopoverComponentView: View { @State private var popoverPresented: Bool = false var body: some View { RealityView { c in let mapEntity = Entity() let popover = Entity() mapEntity.addChild(popover) popover.components[PresentationComponent.self] = PresentationComponent( isPresented: $popoverPresented, configuration: .popover(arrowEdge: .bottom), content: DetailsView() ) } } } struct DetailsView: View { var body: some View { Text("DetailsView") } } -
19:24 - Level of detail
import SwiftUI import WidgetKit struct PhotoCountdownView: View { @Environment(\.levelOfDetail) var levelOfDetail: LevelOfDetail var body: some View { switch levelOfDetail { case .default: RecentPhotosView() case .simplified: CountdownView() default: Text("Unknown level of detail") } } } struct RecentPhotosView: View { var body: some View { Text("RecentPhotosView") } } struct CountdownView: View { var body: some View { Text("CountdownView") } } -
20:28 - WebView
import SwiftUI import WebKit struct HikeGuideWebView: View { var body: some View { WebView(url: sunshineMountainURL) } var sunshineMountainURL: URL { URL(string: "sunshineMountainURL")! } } -
20:44 - WebView with WebPage
import SwiftUI import WebKit struct InAppBrowser: View { @State private var page = WebPage() var body: some View { WebView(page) .ignoresSafeArea() .onAppear { page.load(URLRequest(url: sunshineMountainURL)) } } var sunshineMountainURL: URL { URL(string: "sunshineMountainURL")! } } -
21:35 - 3D charts
import Charts import SwiftUI struct HikePlotView: View { var body: some View { Chart3D { SurfacePlot( x: "x", y: "y", z: "z") { x, y in sin(x) * cos(y) } .foregroundStyle(Gradient(colors: [.orange, .pink])) } .chartXScale(domain: -3 ... 3) .chartYScale(domain: -3 ... 3) .chartZScale(domain: -3 ... 3) } } -
22:18 - macOS drag and drop
import SwiftUI struct DragDropExample: View { @State private var selectedPhotos: [Photo.ID] = [] var body: some View { ScrollView { LazyVGrid(columns: gridColumns) { ForEach(model.photos) { photo in view(photo: photo) .draggable(containerItemID: photo.id) } } } .dragContainer(for: Photo.self, selection: selectedPhotos) { draggedIDs in photos(ids: draggedIDs) } .dragConfiguration(DragConfiguration(allowMove: false, allowDelete: true)) .onDragSessionUpdated { session in let ids = session.draggedItemIDs(for: Photo.ID.self) if session.phase == .ended(.delete) { trash(ids) deletePhotos(ids) } } .dragPreviewsFormation(.stack) } } -
23:55 - Rich text view
import SwiftUI struct CommentEditor: View { @Binding var commentText: AttributedString var body: some View { TextEditor(text: $commentText) } }
-
-
- 0:00 - Introdução
Anna e Peter apresentam a sessão, destacando os principais aprimoramentos no SwiftUI, que abrangem desde o desempenho até os elementos da interface. Eles demonstram essas melhorais no app de trilha que criaram. Também apresentam os novos recursos do sistema, o desempenho, as animações, o layout, as novas plataformas para o SwiftUI, o suporte a conteúdo da Web e texto com formatação.
- 1:22 - Fazer o novo design brilhar
Esta seção destaca o novo sistema de design e como ele afeta a aparência dos apps. Ela aborda a nova aparência dos contêineres de navegação, das barras de abas e das barras de ferramentas. Também trata dos aprimoramentos na pesquisa e nos controles. A seção termina com as melhorias nas interações com o iPad, incluindo uma nova barra de menus e o redimensionamento flexível de janelas, e com o redimensionamento de janelas no macOS. APIs apresentadas/destacadas: API Toolbar Spacer: usada para ajustar as seções de itens da barra de ferramentas. Aplicação de cores do Liquid Glass em barras de ferramentas: possibilita adotar itens mais destacados na barra de ferramentas usando estilos de botão com bordas e coloridos em destaque. Efeito de borda de rolagem: aplica um efeito de desfoque ao conteúdo da barra de ferramentas durante a rolagem. Pesquisar funções nas barras de abas: permite que a aba de busca apareça separada do restante das abas na barra de abas. API Commands: usada para criar a barra de menus no macOS e agora também cria o mesmo resultado no iPad. Âncora de redimensionamento de janela: usada para personalizar o local de origem da animação de redimensionamento da janela. Descontinuidade de UIRequiresFullscreen: a chave da lista de propriedades foi descontinuada no iPadOS 26.
- 6:59 - Fundamentos do framework
Esta seção aborda as melhorias nos fundamentos do SwiftUI, incluindo desempenho, facilidade de uso e layout. Ela detalha os ganhos de desempenho nas listas e na rolagem e apresenta o novo instrumento de desempenho do SwiftUI no Xcode. Além disso, explora a macro Animatable e as novas APIs de layout volumétrico, incluindo aquelas para o visionOS. APIs apresentadas/destacadas: Instrumento de desempenho do SwiftUI (Xcode): uma nova ferramenta para inspecionar as áreas problemáticas de desempenho. Macro Animatable: simplifica o uso do protocolo Animatable com a sintetização automática da propriedade de dados animáveis. Macro AnimatableIgnored: exclui as propriedades da animação quando a macro Animatable é utilizada. Alignment3D: um novo tipo para alinhar as visualizações no espaço 3D. Modificador spatialOverlay: usado para posicionar as visualizações no espaço 3D. Modificador Manipulable: permite que os usuários interajam com os objetos no app. APIs de encaixe de cena: usadas para ler as informações fora do ambiente.
- 14:33 - SwiftUI em todo o sistema
Esta seção se concentra em expandir o alcance do SwiftUI nas diferentes plataformas da Apple. Ela discute a ponte de cenas, permitindo que os apps do UIKit e do AppKit interoperem com cenas SwiftUI. Também aborda a cena RemoteImmersiveSpace para renderizar conteúdo estéreo no Apple Vision Pro direto do macOS. Além disso, menciona o tipo de cena AssistiveAccess para modo especial voltado a usuários com deficiências cognitivas. A seção também aborda as melhorias no trabalho com AppKit, RealityKit, Controles e Widgets. APIs apresentadas/destacadas: Ponte de cenas: permite que os apps feitos com UIKit e AppKit usem cenas SwiftUI. Cena MenuBarExtra: um novo tipo de cena. Cena ImmersiveSpace: um novo tipo de cena. Cena RemoteImmersiveSpace: uma cena do macOS para renderizar conteúdo estéreo no Apple Vision Pro. Cena AssistiveAccess: um tipo de cena para mostrar a interface quando alguém estiver usando o iPhone no modo Acesso Assistivo. NSGestureRecognizerRepresentable: usada para transferir gestos do AppKit para o SwiftUI. Conformidade com Observable para entidades do RealityKit: facilita a observação de mudanças nas entidades do RealityKit direto de views do SwiftUI. Valor de ambiente LevelOfDetail: usado para personalizar a aparência dos widgets com base na proximidade.
- 20:04 - Expandir visualizações do SwiftUI
Esta seção destaca os recursos expandidos de views do SwiftUI. Ela explora o novo WebView para incorporar o conteúdo da web, as melhorias no Swift Charts para gráficos 3D, os aprimoramentos no recurso Arrastar e Soltar e o novo suporte para editar texto com formatação usando AttributedString no TextView. APIs apresentadas/destacadas: WebView: uma nova view do SwiftUI para mostrar conteúdo da web no app. WebPage: um novo tipo de modelo observável criado para o Swift a fim de permitir interação avançada com conteúdo da web. Chart3D: usada para mostrar gráficos em três dimensões. Modificadores específicos de Z (Swift Charts): usados para especificar as escalas no espaço 3D. Modificador Draggable (vários itens): permite arrastar vários itens. Modificador DragContainer: cria uma view de um contêiner para itens arrastáveis. API DragConfiguration: usada para personalizar operações de arrastar. Modificador OnDragSessionUpdated: usado para observar eventos de arrastar. TextView com AttributedString: permite a edição de texto com formatação no SwiftUI.
- 25:01 - Próximas etapas
Os apresentadores resumem os principais pontos da sessão, incentivando os desenvolvedores a explorar os novos recursos e as APIs. Também destacam o novo design, o novo instrumento de desempenho, o layout volumétrico, as melhorias no texto com formatação e o suporte ampliado da plataforma para controles e widgets.