Tutorial de como implementar o 3D Touch em um projeto

Fernanda G. Geraissate
4 min readMar 14, 2016

Na primeira parte deste post foi apresentado o que é a tecnologia 3D Touch e como diferentes aplicativos estão utilizando-a. Nesta será mostrada como implementar esse novo gesto na forma de Peek and Pop, Menu de Ações Rápidas e Detector de Pressão. O projeto completo, que inclui os códigos descritos aqui, está disponível no Github.

Peek and Pop

Primeiro será mostrado como implementar o chamado Peek and Pop. Neste tutorial tem-se duas view controllers: uma chamada PeekAndPopViewController, que tratará o 3D Touch, e a PreviewViewController, que conterá a prévia do conteúdo a ser mostrado.

Exemplo de Peek and Pop

Para começar, é preciso implementar o protocolo UIViewControllerPreviewingDelegate na PeekAndPopViewController:

Depois é preciso saber se o 3D Touch é suportado pelo aparelho e se ele está habilitado. Para isso, escreva o seguinte método:

Feito isto é preciso registrar o objeto que irá tratar os métodos de Peek and Pop (no caso a PeekAndPopViewController) e a view escolhida para suportar o 3D Touch (que será a própria view da view controller). Isto será feito dentro do método traitCollectionDidChange: garantindo que a view controller seja registrada sempre que o usuário deixar o 3D Touch habilitado e que esse registro seja cancelado quando o gesto for desabilitado.

Agora é implementar o Peek and Pop propriamente dito, através dos métodos do protocolo UIViewControllerPreviewingDelegate. No primeiro é preciso instanciar a view controller que se quer ter como prévia (Peek), já no segundo é preciso definir como ela será chamada (Pop).

Com isso o Peek and Pop já está funcionando. Caso deseje implementar um menu durante o Peek, vá na PreviewViewController e implemente o método previewActionItems. O código a seguir mostra um array de ações, onde é possível configurar o título e o estilo (UIPreviewActionStyleDefault, UIPreviewActionStyleDestructive e UIPreviewActionStyleSelected) de cada uma.

É possível mostrar um menu de grupos de ações, para isto basta comentar a linha return action; e remover o comentário do código a cima.

Menu de Ações Rápidas

Existem dois tipos de Ações Rápidas ("Quick Actions"): dinâmico e estático. A diferença entre eles é que no primeiro caso os atalhos só serão mostradas depois que o aplicativo for aberto pelo menos uma vez, já no segundo basta o aplicativo estar instalado para ser mostrado. Outro fato é que, caso o menu dinâmico seja alterado, ele só será atualizado depois que o aplicativo for aberto.

Dinâmico

No caso dinâmico os atalhos serão implementadas no AppDelegate. Para criar o menu, escreva o método createDynamicShortcut (mostrado a seguir) e o chame em application:didFinishLaunchingWithOptions:

onde:

No método arrayOfDynamicShortcutItems é mostrado diferentes formas de implementar um atalho no menu (aqui chamado de shortcutItem). Os parâmetros passados para criar um atalho são:

  • type: uma string que será usada pra saber qual atalho foi selecionado,
  • localizedTitle: título do atalho,
  • localizedSubtitle: subtítulo do atalho,
  • icon: imagem que aparece no atalho, podendo ser nativo, como mostrado no icon2, ou personalizado, como visto no icon3.
  • userInfo: um dicionário com informações adicionais para o atalho.

Agora é preciso tratar quando um atalho é acionado. Se o aplicativo estiver em background e um item do menu for selecionado, o método application:performActionForShortcutItem:completionHandler: do AppDelegate será chamado. Sendo assim, este será sobrescrito:

onde:

e

Na variável global dictVc é criado um dicionário com keys, que são as mesmas citadas nas types dos shortcutItems, e as view controllers associadas. O método viewControllerToBeLauched: irá pegar o type do shortcutItem e retornar a view controller respectiva. Por último o método lauchVcWithShortcutItem: irá mostrar essa view controller do modo mais apropriado.

Caso o aplicativo não estiver em background e um item do menu for selecionado, este será tratado nos métodos application:didFinishLaunchingWithOptions: e applicationDidBecomeActive:, ficando da seguinte forma:

onde:

O método checkIfAShortcutWasLaunchedAndSetItInAGlobalParam: irá verificar se o aplicativo foi aberto através do menu. Em caso afirmativo, ele salvará o shortcutItem em uma variável global. Assim, o método application:didFinishLaunchingWithOptions: retornará NO, impedindo que o método application:performActionForShortcutItem:completionHandler: seja chamado. Logo em seguida, quando o aplicativo se torna ativo, o método applicationDidBecomeActive: é chamado e a view controller relacionada ao shortcutItem selecionado será mostrada.

Estático

Para criar atalhos estáticos, basta adicioná-los em um array na Info.plist, como é mostrado a baixo:

Para configurar um atalho é preciso usar as keys:

  • UIApplicationShortcutItemType
  • UIApplicationShortcutItemTitle
  • UIApplicationShortcutItemSubtitle
  • UIApplicationShortcutItemIconType ou UIApplicationShortcutItemIconFile
  • UIApplicationShortcutItemUserInfo

O tratamento destes atalhos é feito no AppDelegate, da mesma forma que é feito com os atalhos dinâmicos.

Detector de Pressão

No projeto ele será mostrado na classe TestPressureViewController. Primeiro é escrito o método que irá verificar se o 3D Touch poderá ser usado, da mesma forma que foi discutido ao implementar o Peek and Pop:

Se não puder, será mostrado um alerta, através do método traitCollectionDidChange:

Próximo passo é sobrescrever os métodos de touch da view:

onde:

As classes UITouch receberam dois novos parâmetros no iOS 9: force e maximumPossibleForce. O parâmetro force mostra o valor relativo da pressão exercida, onde o valor igual a 1 representa a força média de um toque. Já o maximumPossibleForce é a força máxima detectada por um toque. Neste exemplo, é mostrado o valor da pressão exercida relativa a máxima detectada.

Com isto foi mostrado as diferentes formas de usar o 3D Touch. Qualquer dúvida é só escrever nos comentários ;)

--

--