
-
Novidades do UIKit
Modernize seu app com as APIs mais recentes do UIKit, incluindo suporte aprimorado à barra de menus, rastreamento automático de observação, um novo método de atualização da interface de usuário e melhorias nas animações. Também vamos abordar como você pode incluir cenas do SwiftUI em seu app do UIKit e explorar os Símbolos SF, seletores de cores HDR e muito mais.
Capítulos
- 0:00 - Introdução
- 0:59 - Novo sistema de design
- 2:29 - Contêiners e adaptabilidade
- 3:21 - A barra de menus
- 9:58 - Melhorias na arquitetura
- 10:21 - Rastreamento automático de observação
- 12:33 - Novo método de atualização de interface de usuário
- 15:45 - Melhorias nas animações
- 17:45 - Atualizações de cenas
- 18:55 - Compatibilidade com cores HDR
- 20:38 - Notificações do Swift
- 21:20 - Migrar para um ciclo de vida baseado em cenas
- 22:40 - Compatibilidade com o OpenURL para URLs de arquivos
- 23:17 - Símbolos SF 7
- 25:13 - Próximas etapas
Recursos
Vídeos relacionados
WWDC25
- Aprimore o design do seu app para iPad
- Conheça o novo sistema de design
- Crie um app do UIKit com o novo design
- Deixe o seu app do UIKit mais flexível
- Novidades do app Símbolos SF 7
WWDC24
WWDC23
WWDC21
-
Buscar neste vídeo...
Olá! Esta é a sessão "Novidades no UIKit". Sou Dima, gerente de engenharia na equipe UIKit. Do iOS e iPadOS ao tvOS, visionOS e Mac Catalyst, o UIKit continua sendo a base dos apps, agora com ainda mais avanços. Primeiro, vou dar uma visão geral do suporte do UIKit para o novo sistema de design. Em seguida, abordarei as melhorias feitas para que o conteúdo de seu app seja adaptado a vários dispositivos e formatos de tela. Depois, apresentarei novas APIs do UIKit para a barra de menus, o elemento do macOS que chegou ao iPadOS! Analisarei os principais avanços arquitetônicos do UIKit, retomando os principais fundamentos. Por fim, encerrarei com os aprimoramentos gerais de framework que já fizemos. O novo sistema de design lança um visual vibrante para materiais e controles do sistema. E, no centro, está o novo material: Liquid Glass. É translúcido, dinâmico e vivo com efeitos como realces especulares e refração. De barras e campos de busca a alertas e Split View, os componentes padrão do UIKit foram atualizados com o novo material.
As transições de navegação são contínuas e podem ser interrompidas, tornando o app mais responsivo.
Os usuários podem interagir com o conteúdo sem ter de esperar a animação terminar.
E, para dar um novo design à interface, lançamos ferramentas como o efeito de extensão de fundo, que mantém a continuidade visual ao permitir que o conteúdo apareça sob a barra lateral translúcida.
Agora você também pode aplicar o material de vidro a componentes personalizados e usar o efeito de borda de rolagem, que esmaece o conteúdo sob o painel de vidro, melhorando a legibilidade dos botões e controles na barra.
Para obter um guia prático sobre como atualizar o visual dos apps do UIKit, confira o vídeo "Criar um app do UIKit com o novo design". E, para saber mais do novo design, confira "Conhecer o novo sistema de design". Agora, vamos saber sobre as melhorias feitas para que o conteúdo dos apps seja adaptado a vários dispositivos e formatos de tela. No iOS 26, o UISplitViewController recebe suporte de ponta para inspetores. Um inspetor fornece detalhes adicionais sobre o conteúdo selecionado. Por exemplo, a Pré-visualização usa um inspetor para exibir metadados ao lado da foto na coluna secundária.
E você pode redimensionar colunas arrastando os separadores do controlador Split View. Ao usar o ponteiro, seu formato mudará para indicar as direções em que a coluna pode ser redimensionada. Para saber mais sobre as melhorias nos controles de exibição de contêiner e revisar os conceitos gerais de layout, como margens e áreas seguras, confira o vídeo "Deixar o seu app do UIKit mais flexível" . Depois, no menu: O iOS 26 leva a barra de menus do macOS para o iPad. Agora, deslizar a tela para baixo revela o menu completo do app, mesmo sem um teclado físico! É uma ótima maneira de ter acesso rápido às funcionalidades do app.
A barra de menus comporta todos os recursos de menu: imagens, submenus, seções em linha, marcas de seleção e mais. Ela deve mostrar todos os comandos do app, mesmo os sem atalhos de teclado. Também mantém os comandos indisponíveis visíveis, mas desativados, para o usuário descobrir todas as funcionalidades do app.
Os apps continuam usando UIMenuBuilder para personalizar menus principais e, no iOS 26, o UIKit traz novas APIs para criar barras de menus melhores. Começarei pela configuração do sistema de menu principal. Essa API permite que apps personalizem quais comandos do sistema aparecem no menu principal. Com a API de configuração, seu app passa a incluir elementos de menu pré-criados e localizados, como o novo comando para alternar inspetores. E permite declarar antecipadamente quais itens serão incluídos ou omitidos. Você também pode configurar e estilizar grupos de elementos. Por exemplo, adaptar os comandos Find às necessidades do app. Por fim, fornece um bloco UIMenuBuilder com antecedência para adicionar itens personalizados, permitindo que o app e suas extensões de compartilhamento usem o mesmo código para definir atalhos de teclado. Este é um exemplo de como usar uma configuração do sistema de menu principal. Primeiro, crio um objeto de configuração. Em seguida, especifico quais comandos meu app vai exibir no menu principal por padrão. Por exemplo, vou incluir suporte para os comandos de impressão do sistema.
Vou desativar certos comandos padrão, como o novo comando para alternar o painel do inspetor. A configuração permite especificar estilos comuns para os comandos padrão, como converter os comandos Find do sistema em um único item de busca. Essa configuração é ideal para apps de fotos ou música, em que o foco é pesquisar conteúdo, não texto.
Por fim, posso configurar o sistema de menu principal para que seja criado com o conjunto inicial de elementos preferidos. Também posso fornecer um manipulador de compilação, que será executado no lugar de buildMenuWithBuilder. O manipulador fornece acesso a UIMenuBuilder, que foi atualizado no iOS 26 com métodos de conveniência mais avançados, desempenho mais rápido e diagnóstico aprimorado.
Definir uma configuração aciona uma recompilação da barra de menus. O ideal é que o app defina a configuração apenas uma vez e logo no início, como em (_:didFinishLaunchingWithOptions:). O iOS e o macOS 26 lançaram outras ações padrão e menus na barra de menus. performClose é vinculado a Cmd+W e, por padrão, fecha a janela, mas também pode fechar outros itens no app, como abas em um navegador da Web. O comando de menu "Novo da Área de Transferência" permite criar documentos com base no conteúdo copiado, sem acionar o alerta Colar. O menu ".newItem" lançado no iOS 26 é um ótimo lugar para colocá-lo. As ações padrão para alinhar texto e alternar barra lateral e inspetor agora também estão disponíveis para personalização nos apps.
Por padrão, os atalhos de teclado se repetem quando as teclas são mantidas pressionadas, mas você pode personalizar isso ajustando a propriedade repeatBehavior em UIKeyCommand.
Essa propriedade também pode ser definida por respondedor usando o método validateCommand. Isso é importante em ações destrutivas, como pressionar a tecla Delete para apagar um e-mail, para evitar execuções repetidas acidentais. Em alguns casos, partes da barra de menus precisam exibir conteúdo dinâmico com base no item em foco ou na cena da janela. Por exemplo, apps de navegação, como o Safari, podem mostrar o histórico do perfil atual no menu Histórico.
Para possibilitar isso, use o novo elemento de menu adiado por foco, que preenche os elementos da cadeia de respondentes. Ao construir o menu principal, crie um UIDeferredMenuElement usando foco e dê a ele um identificador para diferenciá-lo. Em seguida, insira-o no menu principal.
Quando o elemento adiado precisa ser preenchido, o UIKit percorre a cadeia de respondedores até encontrar um que possa fornecer itens. Aqui, o controlador da visualização do navegador sobrescreve providerForDeferredMenuElement para fornecer itens de histórico do perfil atual.
Ele verifica o identificador do elemento adiado browserHistory e retorna Provider para carregar os itens do menu de histórico. Elementos adiados por foco são uma ótima forma de manter a barra de menus atualizada com comandos sem atalho, sem precisar recompilar todo o sistema de menu principal. Além dos itens personalizados do app, o sistema fornece várias entradas de menu. O app ganha um atalho de teclado para abrir suas configurações no app Ajustes e, em apps de documentos, o menu Abrir Recente mostra os arquivos recentes.
O sistema também adiciona comandos de organização ao menu Janela, incluindo uma lista de todas as cenas abertas do app. Dê um título a cada cena para ajudar os usuários a diferenciá-las. Por fim, alguns pontos para lembrar ao criar sua barra de menus. Nos apps do UIKit, as barras de menu definidas em storyboards não têm mais suporte. Apps não iniciam com menus em storyboards, por isso, é necessário implementá-los programaticamente.
Você também deve garantir que a funcionalidade do app seja acessível sem a barra de menus, já que ela nem sempre estará presente.
Para saber mais sobre como criar uma ótima barra de menus para seu app, confira "Aprimorar o design do seu app para iPad". E, para ter uma visão geral do menu principal do UIKit, confira "Levar os apps para iPad para o próximo nível".
Continuamos a evoluir o UIKit com novos recursos para padrões modernos, melhores práticas e maior interoperabilidade com a SwiftUI. O iOS 26 não é exceção. Tenho melhorias arquiteturais empolgantes para compartilhar com você. A primeira grande melhoria é o suporte nativo a objetos Swift Observable no UIKit.
O UIKit agora integra o Swift Observation em seu núcleo: em métodos de atualização como layoutSubviews(), ele rastreia qualquer Observable referenciado, conecta dependências e invalida as visualizações corretas, sem setNeedsLayout manual.
Você pode implantar isso no iOS 18 adicionando a chave UIObservationTrackingEnabled a Info.plist. No iOS 26, está ativado por padrão. Vou mostrar alguns exemplos de como o rastreamento automático de observação funciona.
Aqui, tenho um controlador de lista de mensagens com UILabel que indica mensagens não lidas.
É baseado em um objeto Observable com duas propriedades: um booliano que controla se o status é exibido e a string do status.
Em viewWillLayoutSubviews(), uso o modelo observável para atualizar o alfa do rótulo para mostrá-lo ou ocultá-lo e definir seu texto. No primeiro layout, o UIKit preenche o rótulo e, graças ao rastreamento automático de observação, registra dependências em showStatus e statusText. Qualquer alteração nessas propriedades invalida a visualização e executa viewWillLayoutSubviews(), mantendo o rótulo sincronizado sem código extra. Aqui está outro exemplo do uso de objetos Observable com UIKit, destacando os benefícios do rastreamento automático de observação ao configurar células em UICollectionView. Cada célula da lista é baseada em um ListItemModel observável que contém um ícone, título e subtítulo. Dentro do callback do provedor de célula, retiro uma célula da fila, pego seu modelo e atribuo configurationUpdateHandler. Como o manipulador é compatível com rastreamento de observação, o UIKit cria dependências dos objetos Observable usados dentro dele.
No manipulador, preencho e aplico uma configuração de conteúdo de lista usando o modelo de item de lista observável. É isso! Qualquer alteração nas propriedades do modelo enquanto a célula está visível faz o UIKit executar o manipulador e atualizar a célula. Com a adição do rastreamento automático de traços e observações, o UIKit inclui um método de atualização de uso geral para dar suporte a esses recursos.
Apresentamos um novo método, updateProperties(), para UIView e UIViewController.
Ele é executado logo antes do método layoutSubviews(), mas é independente: permitindo invalidar propriedades sem forçar o layout e vice-versa, evitando aprovações extras e obtendo atualizações mais refinadas.
updateProperties() complementa, não substitui, layoutSubviews(). Use-o para preencher conteúdo, aplicar estilos ou configurar comportamentos.
Ele rastreia qualquer Observable lido, e você pode acioná-lo manualmente chamando setNeedsUpdateProperties(). Darei um exemplo concreto do uso desse novo método.
Aqui, tenho um objeto Observable BadgeModel que armazena a contagem exibida em uma visualização "badge" . O controlador de visualização para o item de botão de barra é baseado em BadgeModel.
Dentro de updateProperties(), uso a nova API de ícone no item de botão de barra e extraio a contagem diretamente do modelo. Sempre que o objeto de modelo Observable é alterado, ele resulta em updateProperties() executando e atualizando o ícone.
Ao usar updateProperties() para configurar a exibição em vez de layoutSubviews(), evito executar o código em eventos não relacionados, como redimensionar, cortar trabalho desnecessário e melhorar o desempenho.
Para entender melhor como updateProperties() se encaixa em outros métodos de atualização, vou explicar como funciona o ciclo de atualização do UIKit.
Aqui está uma ilustração de como UIKit atualiza as visualizações antes de exibi-las na tela. Primeiro, vem a etapa de layout. O UIKit percorre a hierarquia de visualização de cima para baixo, atualiza os traços e chama layoutSubviews().
Se essa etapa resultar em necessidade de layout para outras visualizações, ela se repetirá até tudo estar ajustado.
Quando o layout se estabiliza, o UIKit executa a etapa de visualização, chamando o método draw em cada visualização, repetindo até que nenhuma precise mais ser exibida.
Quando ambas as etapas terminam, o próximo frame pode ser renderizado e exibido na tela.
É assim que o novo callback updateProperties() é integrado. Durante a passagem de layout de cima para baixo, o UIKit executa updateProperties() logo após atualizar os traços e antes de chamar layoutSubviews(). Pense no layoutSubviews() como dividido em duas etapas: a atualização de propriedades, depois a lógica normal de layout. Como a coleção de traços é atualizada antes de updateProperties(), você pode acessá-la com segurança ali. E, como sempre precede layoutSubviews(), você pode invalidar o layout. A etapa de layout será executada logo depois.
Para complementar o novo rastreamento de observação e o método updateProperties(), melhoramos o modo como as animações funcionam no UIKit.
Primeiro, vou explicar como funciona uma atualização manual no iOS 18 e anterior. No fechamento da animação UIView, definimos novos valores em objetos Observable. Então, o método layoutIfNeeded() é chamado nas visualizações dependentes. Ambas as etapas são necessárias: a primeira gera uma invalidação, e a segunda faz a atualização e cria as animações.
Manter manualmente as dependências entre propriedades e visualizações é propenso a erros, causando excesso ou falta de atualizações ou animações.
O iOS 26 traz uma nova opção de animação para UIViews chamada flushUpdates. Quando ativada, o UIKit aplica as atualizações pendentes logo antes de iniciar e ao terminar a animação, dispensando chamadas a layoutIfNeeded(). Para flushUpdates funcionar, faça mudanças de estado que invalidem só dentro do fechamento da animação. Vou mostrar um exemplo de como usar o método flushUpdates. Passe flushUpdates como opção para UIView usar animação, depois faça alterações no objeto Observable dentro do fechamento. Qualquer visualização que use o objeto Observable em um método de atualização fará a atualização necessária. flushUpdates não se limita a animações acionadas por Observable.
Este é um exemplo de uso para animar alterações nas restrições do layout automático. No fechamento de flushUpdates, defino uma nova constante para uma restrição existente e ativo/desativo outras restrições. As visualizações dependentes animam para suas novas posições e tamanhos. Explicarei como integramos melhor o uso conjunto de SwiftUI e UIKit no mesmo app. Cenas SwiftUI agora têm suporte em apps do UIKit usando um novo protocolo delegado.
Isso é compatível com a adoção gradual da SwiftUI, além de permitir que apps do UIKit usem espaços imersivos e volumes no visionOS.
Imagine um app de meditação que apresenta uma cena de jardim zen: em uma janela 2D padrão no iPhone e iPad e como espaço imersivo no visionOS. Apresento esse espaço imersivo implementando o novo protocolo UIHostingSceneDelegate com uma cena SwiftUI raiz.
Usar um hostingSceneDelegate é como usar qualquer outro delegado de cena. Basta definir o tipo de classe delegado em UISceneConfiguration quando uma nova cena se conectar.
Você pode solicitar uma cena SwiftUI específica do hostingDelegate passando seu identificador.
Neste exemplo, solicito o espaço imersivo do jardim zen. Por fim, vou mostrar algumas melhorias gerais no UIKit, começando pelas melhorias na renderização HDR. No iOS 26, o HDR não se limita a apenas imagens. As cores também recebem o mesmo tratamento, permitindo destacar a interface ou criar experiências novas.
UIColor agora permite especificar uma cor base SDR e um valor de exposição, ajustando automaticamente o brilho conforme os recursos da tela. Aqui, crio uma cor HDR vermelha com exposição em duas vezes e meia o branco máximo do SDR. Agora, também é possível ativar a seleção de cor HDR em UIColorPickerViewController e UIColorWell.
Para tanto, defina uma exposição máxima com base na capacidade de renderização do app. Aqui defino a exposição linear máxima do seletor de cores como o dobro do branco máximo do SDR.
No iOS 18, UIImageView faz fallback de HDR para SDR, garantindo que o conteúdo principal da IU se destaque. No iOS 26, esse comportamento se estende a vídeos, cujo conteúdo também pode aproveitar esse recurso. Use o novo traço UITraitHDRHeadroomUsage para saber quando o conteúdo HDR deve fazer fallback para SDR.
Para saber mais sobre HDR, confira os vídeos "Usar HDR para experiências de imagem dinâmica no app" e "Oferecer suporte a imagens HDR no app".
Com base na API NSNotification.Name, o UIKit no iOS 26 representa cada notificação como um tipo NotificationCenter.Message dedicado. Isso oferece um valor fortemente tipado para registrar observadores e obter detalhes dos eventos. Este é um exemplo de ajuste do layout quando o teclado aparece. Registro o tipo de notificação keyboardWillShow e, no manipulador, obtenho a duração da animação e o quadro do teclado diretamente da mensagem. Por fim, animo minhas restrições usando esses valores, sem precisar de consulta em userInfo ou transmissão manual. A cada versão, a evolução contínua do UIKit traz APIs modernas e robustas para as melhores práticas atuais. E, à medida que você as adotar, descontinuamos os métodos antigos.
A adoção de UIScene torna seus apps portáteis e flexíveis, por isso, estamos descontinuando muitas APIs focadas em UIApplication.
Callbacks legados de UIApplicationDelegate e UIApplicationLaunchOptionKeys não se aplicam mais. Só resta o inicializador init(windowScene:) para UIWindow. Os outros inicializadores foram descontinuados. Na versão após o iOS 26, qualquer app do UIKit criado com o SDK mais recente precisará usar o ciclo de vida UIScene, caso contrário não será iniciado.
Adote o ciclo de vida UIScene em todo lugar, não só em apps de várias janelas. Para obter mais informações sobre como fazer isso, consulte a nota técnica: "Migrar para o ciclo de vida baseado na cena UIKit". Para saber mais sobre como maximizar a flexibilidade de apps, incluindo novas APIs para ajudar na migração de UIRequiresFullScreen, confira o vídeo
"Deixar o seu app do UIKit mais flexível".
Apps que lidam com vários tipos de documento precisam abrir visualizadores externos. No iOS 26, o método openURL existente agora aceita URLs de arquivo, permitindo abrir documentos sem suporte nativo do app. Se existir um app padrão para esse tipo de arquivo, o sistema o iniciará e passará seu URL.
Se não, openURL retorna false, permitindo que você trate o fallback usando um QLPreviewController.
SF Symbols foi aprimorado no iOS 26. SF Symbols 7 adiciona a capacidade de desenhar símbolos, começando com dois novos efeitos. drawOff, como o efeito Desaparecer, usa animação de desenho para ocultar um símbolo. drawOn, como Aparecer, revela um símbolo oculto desenhando-o.
Símbolos agora são compatíveis com desenho de variáveis, novo modo para valor variável. Isso desenha valores arbitrários ao longo de um caminho, como neste indicador de progresso.
Você pode usá-lo com a transição automática de conteúdo do símbolo para animar valores variáveis.
Transições da Substituição Mágica também podem realizar animações de desenho entre certos símbolos. Essa transição entre o círculo e a marca de seleção preenchida agora preenche o círculo e desenha a marca de seleção. As novas animações são ótimas para botões, por isso, o UIKit tem uma API nova para usar transições de conteúdo de símbolos em UIButton.
Use a nova propriedade symbolContentTransition em UIButton.Configuration para definir uma transição de conteúdo de símbolo, como "replace". Quando o símbolo do botão é alterado, por exemplo ao alternar seu estado de seleção, o UIKit realiza a transição. O SF Symbols 7 também traz outros recursos, como a opção de modo de renderização de cor. Apps pode especificar "gradient" para colorir símbolos usando gradientes gerados automaticamente em vez de cores sólidas.
Para aprender a personalizar desenhos e gradientes, confira "Novidades do SF Symbols 7". Para relembrar como usar efeitos de símbolos em animações, confira "Animar símbolos no app".
O que vem por aí? Compile seu app usando o SDK do iOS 26. Revise como seu app responde ao novo design e ajuste as IUs e estilos para combinar com a nova estética. Use contêineres padrão, como UISplitViewController e UITabBarController, para garantir layouts flexíveis. Implemente os menus do app com as novas APIs de menu. Adote o método updateProperties e o rastreamento de observação para simplificar seu código e melhorar o desempenho. Obrigado! Estou ansioso para ver como você vai usar essas melhorias para tornar seus apps ainda mais poderosos e agradáveis!
-
-
4:56 - Main menu system configuration
// Main menu system configuration var config = UIMainMenuSystem.Configuration() // Declare support for default commands, like printing config.printingPreference = .included // Opt out of default commands, like inspector config.inspectorPreference = .removed // Configure the Find commands to be a single "Search" element config.findingConfiguration.style = .search
-
5:39 - Main menu system build configuration
// Main menu system configuration // Have the main menu system build using this configuration, and make custom additions. // Call this early, e.g. in application(_:didFinishLaunchingWithOptions:), and call it once UIMainMenuSystem.shared.setBuildConfiguration(config) { builder in builder.insertElements([...], afterCommand: #selector(copy(_:))) let deleteKeyCommand = UIKeyCommand(...) builder.replace(command: #selector(delete(_:)), withElements: [deleteKeyCommand]) }
-
7:01 - Keyboard shortcut repeatability
// Keyboard shortcut repeatability let keyCommand = UIKeyCommand(...) keyCommand.repeatBehavior = .nonRepeatable
-
7:43 - Focus-based deferred menu elements (App Delegate)
// Focus-based deferred menu elements extension UIDeferredMenuElement.Identifier { static let browserHistory: Self = .init(rawValue: "com.example.deferred-element.history") } // Create a focus-based deferred element that will display browser history let historyDeferredElement = UIDeferredMenuElement.usingFocus( identifier: .browserHistory, shouldCacheItems: false ) // Insert it into the app’s custom History menu when building the main menu builder.insertElements([historyDeferredElement], atEndOfMenu: .history)
-
8:06 - Focus-based deferred menu elements (View Controller)
// Focus-based deferred menu elements class BrowserViewController: UIViewController { // ... override func provider( for deferredElement: UIDeferredMenuElement ) -> UIDeferredMenuElement.Provider? { if deferredElement.identifier == .browserHistory { return UIDeferredMenuElement.Provider { completion in let browserHistoryMenuElements = profile.browserHistoryElements() completion(browserHistoryMenuElements) } } return nil } }
-
10:54 - Using an Observable object and automatic observation tracking
// Using an Observable object and automatic observation tracking @Observable class UnreadMessagesModel { var showStatus: Bool var statusText: String } class MessageListViewController: UIViewController { var unreadMessagesModel: UnreadMessagesModel var statusLabel: UILabel override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() statusLabel.alpha = unreadMessagesModel.showStatus ? 1.0 : 0.0 statusLabel.text = unreadMessagesModel.statusText } }
-
11:48 - Configuring a UICollectionView cell with automatic observation tracking
// Configuring a UICollectionView cell with automatic observation tracking @Observable class ListItemModel { var icon: UIImage var title: String var subtitle: String } func collectionView( _ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath ) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) let listItemModel = listItemModel(for: indexPath) cell.configurationUpdateHandler = { cell, state in var content = UIListContentConfiguration.subtitleCell() content.image = listItemModel.icon content.text = listItemModel.title content.secondaryText = listItemModel.subtitle cell.contentConfiguration = content } return cell }
-
13:27 - Using automatic observation tracking and updateProperties()
// Using automatic observation tracking and updateProperties() @Observable class BadgeModel { var badgeCount: Int? } class MyViewController: UIViewController { var model: BadgeModel let folderButton: UIBarButtonItem override func updateProperties() { super.updateProperties() if let badgeCount = model.badgeCount { folderButton.badge = .count(badgeCount) } else { folderButton.badge = nil } } }
-
16:57 - Using the flushUpdates animation option to automatically animate updates
// Using the flushUpdates animation option to automatically animate updates // Automatically animate changes with Observable objects UIView.animate(options: .flushUpdates) { model.badgeColor = .red }
-
17:23 - Automatically animate changes to Auto Layout constraints with flushUpdates
// Automatically animate changes to Auto Layout constraints UIView.animate(options: .flushUpdates) { // Change the constant of a NSLayoutConstraint topSpacingConstraint.constant = 20 // Change which constraints are active leadingEdgeConstraint.isActive = false trailingEdgeConstraint.isActive = true }
-
18:07 - Setting up a UIHostingSceneDelegate
// Setting up a UIHostingSceneDelegate 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 } }
-
18:28 - Using a UIHostingSceneDelegate
// Using a UIHostingSceneDelegate func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { let configuration = UISceneConfiguration(name: "Zen Garden Scene", sessionRole: connectingSceneSession.role) configuration.delegateClass = ZenGardenSceneDelegate.self return configuration }
-
18:41 - Requesting a scene
// Requesting a scene func openZenGardenSpace() { let request = UISceneSessionActivationRequest( hostingDelegateClass: ZenGardenSceneDelegate.self, id: “zengardenspace")! UIApplication.shared.activateSceneSession(for: request) }
-
19:18 - HDR color support
// Create an HDR red relative to a 2.5x peak white let hdrRed = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0, linearExposure: 2.5)
-
19:50 - HDR color picking
// Support picking HDR colors relative to a // maximum peak white of 2x colorPickerController.maximumLinearExposure = 2.0
-
20:06 - Mixing SDR and HDR content
// Mixing SDR and HDR content registerForTraitChanges([UITraitHDRHeadroomUsageLimit.self]) { traitEnvironment, previousTraitCollection in let currentHeadroomLimit = traitEnvironment.traitCollection.hdrHeadroomUsageLimit // Update HDR usage based on currentHeadroomLimit’s value }
-
20:54 - Adopting Swift notifications
// Adopting Swift notifications override func viewDidLoad() { super.viewDidLoad() let keyboardObserver = NotificationCenter.default.addObserver( of: UIScreen.self for: .keyboardWillShow ) { message in UIView.animate( withDuration: message.animationDuration, delay: 0, options: .flushUpdates ) { // Use message.endFrame to animate the layout of views with the keyboard let keyboardOverlap = view.bounds.maxY - message.endFrame.minY bottomConstraint.constant = keyboardOverlap } } }
-
24:26 - Using a symbol content transition to automatically animate symbol updates
// Using a symbol content transition to automatically animate symbol updates var configuration = UIButton.Configuration.plain() configuration.symbolContentTransition = UISymbolContentTransition(.replace)
-
-
- 0:00 - Introdução
Saiba mais sobre os aprimoramentos do UIKit no iOS, iPadOS, tvOS, visionOS e Mac Catalyst. Este vídeo aborda o novo sistema de design, contêineres e adaptabilidade, APIs para a barra de menus no iPadOS e Mac Catalyst, avanços arquitetônicos centrais e melhorias gerais no framework.
- 0:59 - Novo sistema de design
O novo sistema de design apresenta o Liquid Glass: um material dinâmico e translúcido que atualiza os componentes padrão do UIKit e melhora as transições de navegação. O UIKit também possui uma nova API para levar o Liquid Glass para a sua interface de usuário personalizada.
- 2:29 - Contêiners e adaptabilidade
O iOS 26 aprimora o "UISplitViewController" com inspetores para exibição detalhada de conteúdo e redimensionamento dinâmico de colunas.
- 3:21 - A barra de menus
O iOS 26 aprimora a barra de menus do iPad, que agora pode ser acessada com um gesto de deslizar a partir da parte superior da tela, oferecendo acesso rápido às funcionalidades do app sem a necessidade de um teclado físico. A barra de menus sempre deve exibir todos os comandos do app, mesmo aqueles que estão desativados ou que não possuem atalhos de teclado. Personalize a barra de menus usando a nova API para configuração do menu principal e implemente menus dinâmicos com base na visualização em foco. Foram introduzidas ações padrão como "Fechar" e "Novo da Área de Transferência". As ações para alinhamento de texto, alternância da barra lateral e alternância do inspetor agora estão expostas para personalização. Garanta que as ações estejam disponíveis no seu app sem depender da barra de menus.
- 9:58 - Melhorias na arquitetura
O UIKit continua evoluindo com novos recursos para padrões modernos, melhores práticas e maior interoperabilidade com o SwiftUI.
- 10:21 - Rastreamento automático de observação
O UIKit agora rastreia automaticamente objetos Observable referenciados em métodos de atualização como "layoutSubviews", eliminando a necessidade de chamadas manuais para "setNeedsLayout". Esse recurso está ativado por padrão no iOS 26 e você pode implantá-lo retroativamente até o iOS 18 com a chave "UIObservationTrackingEnabled" no Info.plist. As alterações nas propriedades do modelo Observable que atualizam elementos da interface do usuário acionam automaticamente a invalidação da visualização e as novas execuções dos métodos de atualização relevantes, mantendo a interface do usuário sincronizada sem código adicional.
- 12:33 - Novo método de atualização de interface de usuário
O UIKit apresenta um novo método, "updateProperties", disponível em "UIView" e "UIViewController". Esse método é executado de modo independente antes de "layoutSubviews" e permite preencher conteúdo, aplicar estilos e configurar comportamentos com mais eficiência. "updateProperties" rastreia automaticamente modelos Observables e pode ser acionado manualmente chamando "setNeedsUpdateProperties". Usando esse método, você pode evitar passagens de layout desnecessárias, melhorando o desempenho do seu app.
- 15:45 - Melhorias nas animações
No iOS 26, o UIKit introduz "flushUpdates", uma opção de animação que aplica automaticamente atualizações pendentes antes e depois das animações, eliminando a necessidade de chamadas manuais a "layoutIfNeeded". Isso simplifica o código, reduz erros e funciona com objetos Observable e alterações automáticas de restrição de layout.
- 17:45 - Atualizações de cenas
Agora você pode integrar cenas do SwiftUI aos apps do UIKit usando o novo protocolo "UIHostingSceneDelegate". Crie apps que se adaptem a diferentes dispositivos, como um app de meditação com um jardim zen 2D no iPhone e iPad e uma experiência imersiva no visionOS, solicitando programaticamente uma cena específica do SwiftUI.
- 18:55 - Compatibilidade com cores HDR
No iOS 26, o UIKit também aprimora a renderização HDR além de imagens para incluir cores. Crie cores HDR usando "UIColor" e ative a seleção de cores HDR nos seletores de cores. Use o novo traço "UITraitHDRHeadroomUsage" para saber quando o conteúdo HDR deve fazer fallback para SDR.
- 20:38 - Notificações do Swift
O UIKit representa cada notificação como um tipo dedicado "NotificationCenter.Message" no iOS 26, fornecendo notificações fortemente tipadas para facilitar o tratamento de eventos, como visto no exemplo de ajuste de layout quando o teclado aparece.
- 21:20 - Migrar para um ciclo de vida baseado em cenas
'UIScene' substitui 'UIApplication' como o padrão para o desenvolvimento de app, tornando os apps mais portáteis e flexíveis. Você deve adotar o ciclo de vida "UIScene", pois os métodos legados foram descontinuados e, a partir da versão posterior ao iOS 26, os apps que não tiverem adotado o ciclo de vida da cena não serão abertos.
- 22:40 - Compatibilidade com o OpenURL para URLs de arquivos
O método "openURL" agora permite que os apps encaminhem documentos não nativos para visualizadores padrão ou usem controladores de pré-visualização rápida caso não exista um padrão.
- 23:17 - Símbolos SF 7
O SF Symbols 7 apresenta novas funcionalidades de desenho, incluindo os efeitos "Desenhar Desativado" e "Desenhar Ativado", modo de desenho variável para desenhar valores arbitrários ao longo de um caminho e animações especiais com transições de Substituição Mágica. O UIKit agora possui uma API para fácil adoção dessas transições em "UIButton", e os símbolos podem ser coloridos com gradientes gerados automaticamente.
- 25:13 - Próximas etapas
Para atualizar seu app para o iOS 26, compile com o novo SDK, refine as interfaces de usuário para corresponderem ao novo design, utilize contêineres padrão e as novas APIs de menu, e adote o método "updateProperties" e o rastreamento de observação para melhorar o desempenho.