Today Extension (Widget)

Erick Borges
Apple Developer Academy | Mackenzie
5 min readFeb 26, 2018

O que é?

Uma Today Extension, ou widget, é uma extensão que exibe uma pequena e útil quantidade de informação, ou ações rápidas e específicas do aplicativo.

Eles aparecem na Search Screen, deslizando para a direita na tela de início, e também na Quick Action List a partir do iPhone 6S, ao usar o 3D touch no ícone do aplicativo.

É possível fazer qualquer tipo de operação dentro de um widget, uma vez que ele é uma ViewController convencional. Porém ele possui limitações grandes de processamento, e não permite entrada de texto com teclado. Além disso, a documentação não recomenda o uso de ScrollViews nos widgets.

Exemplos

De acordo com as guidelines, o widget deve ser interativo e simples, as ações de preferência devem ser executadas com um toque. A seguir há alguns exemplos de apps que fazem isso com excelência.

Google Maps

O Google Maps possui um widget que localiza o ponto de ônibus mais próximo a você, ou o que você usa com mais frequência, e te mostra os itinerários em tempo real.

Google Maps Widget

Tempo

O aplicativo nativo de previsão do tempo tem um widget muito útil, que te mostra um resumo da previsão do tempo do dia.

Tempo Widget

Nubank

O widget do Nubank te mostra de maneira bem simples, todas as informações úteis sobre o balanço da sua conta.

Nubank Widget

Como criar um widget?

1º — Criar um projeto no Xcode

Abra o Xcode e crie um novo projeto com o template Single View Application:

Em seguida nomeie o projeto como “aWidget”:

E por último, escolha um diretório para salvar o projeto.

Se você rodar o projeto agora, você terá uma LaunchScreen e uma ViewController em branco. E nós não vamos acrescentar nada no aplicativo, pois o foco aqui é no widget. Então vamos proseguir.

2º — Adicionar a extensão

Dentro do projeto do Xcode, a Today Extension se comportará como um segundo aplicativo totalmente desvinculado do principal. E para adicioná-la, teremos que criar um noto Target dentro do projeto.

Para isso vá em File -> New -> Target…

E então selecione a Today Extension:

E dê o nome de “TheWidget”:

Agora o projeto tem dois targets. Mas o que isso significa? Como eu havia falado anteriormente, o widget vai ser comportar como se fosse um outro aplicativo dentro do projeto. A partir de agora, você terá de selecionar qual target você quer debugar antes de rodar o aplicativo. Toda vez que você rodar o aplicativo ele irá compilar os dois targets, porém só um por vez será observado pelo debugger.

Antes de rodar o projeto, vamos dar uma olhada nos novos arquivos criados para a extensão. Uma pasta foi criada, com o nome de TheWidget, e ela contém todos os arquivos relacionados à extensão. Sendo a TodayViewController.swift a classe padrão responsável pela ViewController do Widget, e MainInterface.storyboard a interface do mesmo.

Vamos selecionar o Target do widget e rodar para ver como ele funciona.

No canto superior esquerdo, clique no ícone do projeto aWidget:

Isso irá te mostrar todos os targets existentes no projeto. Selecione o target “The Widget”, e rode o projeto.

Por padrão, o widget vem com uma label com a escrita “Hello World.”

3º — Como expandir o widget

O widget tem dois tipos de layout. O Compact mode, que oferece uma altura fixa de 110pt, e o Expanded mode, que oferece altura variável.

Para utilizar o Expanded mode, basta fazer o seguinte:

Vá até a classe do widget, TodayViewController.swift. Adicione ao método viewDidLoad() as seguintes linhas de código:

Esta configuração habilita o botão “Show More” no canto superior direito do widget, porém ele ainda não possui nenhum efeito. Toda vez que este botão é pressionado, ele chama o método widgetActiveDisplayModeDidChange(:withMaximumSize), que nós usaremos para configurar a sua nova altura.

Adicione a função a seguir após o viewDidLoad:

  1. Se o activeDisplayMode for igual a .expanded no momento que que o botão “Show More” é pressionado, nós podemos redefinir seu preferredContentSize, que corresponde as suas proporções, para uma altura maior do que a original. Neste caso eu capturei a largura o widget, e a passei como parâmetro de largura e altura, tornando o widget maior, e quadrado.
  2. Se o activeDisplayMode for igual a .compact no momento que que o botão “Show More” é pressionado, preferredContentSize é setado para seu tamanho padrão, contido no parâmetro maxSize do método.

O Today extension se resume a isso, o resto pode ser feito igual como em qualquer outra ViewController.

Obrigado pela leitura.

Autores

Erick Borges

Matheus de Vasconcelos

Ricardo Daniel Nogueira de Sousa

--

--