Tutorial de como implementar o 3D Touch em um projeto
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.
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 ;)