SlideShare a Scribd company logo
1 of 39
Download to read offline
3D Touch: Preparando sua app
para o futuro do iOS
Rodrigo Borges Soares
Introdução
Mobile Developer & Co-Founder @ Meatless
iOS Developer @ VivaReal
Twitter
LinkedIn
Medium
rdgborges
Outline
1. 3D Touch: Ontem e hoje
2. Caso de uso: Meatless
3. Implementando o Peek & Pop
4. Referências
3D Touch: Ontem
3D Touch ontem: iOS 9
Lançado com os iPhones 6S e 6S+
Nova forma de interação usando o
nível de força durante o toque
Evolução do Force Touch do Apple
Watch
3D Touch ontem: iOS 9
Peek & Pop
3D Touch ontem: iOS 9
Quick Actions
3D Touch: Hoje
3D Touch hoje: Notifications
3D Touch hoje: Widgets
3D Touch hoje: Groups
3D Touch hoje: Everywhere
3D Touch hoje: Everywhere
O 3D Touch se tornará cada
vez mais natural para o
usuário
Peek & Pop
Peek & Pop
Um caso de uso real: Meatless
No cardápio, usuários poderiam pré-visualizar
foto ampliada, descrição e modificadores
Ação rápida para adicionar ao carrinho
Peek & Pop
Peek & Actions!
Implementando o Peek & Pop
if #available(iOS 9.1, *) {
Peek & Pop pode ser configurado direto no
Storyboard e Segues 🎉
} else {
UIViewControllerPreviewingDelegate 👌
}
Implementando o Peek & Pop
Storyboard & Segues
Implementando o Peek & Pop
1. Registrar o View Controller para gerenciar o Peek & Pop
2. Implementar os métodos do UIViewControllerPreviewingDelegate
3. Implementar o método previewActionItems() no View Controller que
é mostrado no Peek
UIViewControllerPreviewingDelegate
Implementando o Peek & Pop
1. Registrando o View Controller
func setupForceTouchIsAvailable() {
if #available(iOS 9.0, *) {
if traitCollection.forceTouchCapability == .Available {
registerForPreviewingWithDelegate(self, sourceView: self.collectionView)
}
}
}
Implementando o Peek & Pop
1. Registrando o View Controller
func setupForceTouchIsAvailable() {
if #available(iOS 9.0, *) {
if traitCollection.forceTouchCapability == .Available {
registerForPreviewingWithDelegate(self, sourceView: self.collectionView)
}
}
}
Implementando o Peek & Pop
1. Registrando o View Controller
func setupForceTouchIsAvailable() {
if #available(iOS 9.0, *) {
if traitCollection.forceTouchCapability == .Available {
registerForPreviewingWithDelegate(self, sourceView: self.collectionView)
}
}
}
Implementando o Peek & Pop
1. Registrando o View Controller
func setupForceTouchIsAvailable() {
if #available(iOS 9.0, *) {
if traitCollection.forceTouchCapability == .Available {
registerForPreviewingWithDelegate(self, sourceView: self.collectionView)
}
}
}
Implementando o Peek & Pop
2. UIViewControllerPreviewingDelegate
func previewingContext(previewingContext: UIViewControllerPreviewing,
viewControllerForLocation location: CGPoint) -> UIViewController? { }
func previewingContext(previewingContext: UIViewControllerPreviewing,
commitViewController viewControllerToCommit: UIViewController) { }
Implementando o Peek & Pop
func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
let path = collectionView.indexPathForItemAtPoint(location)
guard let indexPath = path, let cell = self.collectionView.cellForItemAtIndexPath(indexPath) else {
return nil
}
guard let itemDetailsNavigationController = storyboard?.instantiateViewControllerWithIdentifier("itemDetailsNavigationControllerIdentifier")
as? ItemDetailsNavigationController else { return nil }
guard let itemDetailsViewController = itemDetailsNavigationController.viewControllers[0] as? ItemDetailsViewController else { return nil }
let item = self.itemsByCategory[indexPath.section-1].items[indexPath.row]
itemDetailsViewController.item = item
itemDetailsViewController.preferredContentSize = CGSize(width: 0.0, height: 0.0)
previewingContext.sourceRect = self.collectionView.convertRect(cell.frame, fromCoordinateSpace: self.collectionView)
return itemDetailsNavigationController
}
Implementando o Peek & Pop
func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
let path = collectionView.indexPathForItemAtPoint(location)
guard let indexPath = path, let cell = self.collectionView.cellForItemAtIndexPath(indexPath) else {
return nil
}
guard let itemDetailsNavigationController = storyboard?.instantiateViewControllerWithIdentifier("itemDetailsNavigationControllerIdentifier")
as? ItemDetailsNavigationController else { return nil }
guard let itemDetailsViewController = itemDetailsNavigationController.viewControllers[0] as? ItemDetailsViewController else { return nil }
let item = self.itemsByCategory[indexPath.section-1].items[indexPath.row]
itemDetailsViewController.item = item
itemDetailsViewController.preferredContentSize = CGSize(width: 0.0, height: 0.0)
previewingContext.sourceRect = self.collectionView.convertRect(cell.frame, fromCoordinateSpace: self.collectionView)
return itemDetailsNavigationController
}
Implementando o Peek & Pop
func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
let path = collectionView.indexPathForItemAtPoint(location)
guard let indexPath = path, let cell = self.collectionView.cellForItemAtIndexPath(indexPath) else {
return nil
}
guard let itemDetailsNavigationController = storyboard?.instantiateViewControllerWithIdentifier("itemDetailsNavigationControllerIdentifier")
as? ItemDetailsNavigationController else { return nil }
guard let itemDetailsViewController = itemDetailsNavigationController.viewControllers[0] as? ItemDetailsViewController else { return nil }
let item = self.itemsByCategory[indexPath.section-1].items[indexPath.row]
itemDetailsViewController.item = item
itemDetailsViewController.preferredContentSize = CGSize(width: 0.0, height: 0.0)
previewingContext.sourceRect = self.collectionView.convertRect(cell.frame, fromCoordinateSpace: self.collectionView)
return itemDetailsNavigationController
}
Implementando o Peek & Pop
func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
let path = collectionView.indexPathForItemAtPoint(location)
guard let indexPath = path, let cell = self.collectionView.cellForItemAtIndexPath(indexPath) else {
return nil
}
guard let itemDetailsNavigationController = storyboard?.instantiateViewControllerWithIdentifier("itemDetailsNavigationControllerIdentifier")
as? ItemDetailsNavigationController else { return nil }
guard let itemDetailsViewController = itemDetailsNavigationController.viewControllers[0] as? ItemDetailsViewController else { return nil }
let item = self.itemsByCategory[indexPath.section-1].items[indexPath.row]
itemDetailsViewController.item = item
itemDetailsViewController.preferredContentSize = CGSize(width: 0.0, height: 0.0)
previewingContext.sourceRect = self.collectionView.convertRect(cell.frame, fromCoordinateSpace: self.collectionView)
return itemDetailsNavigationController
}
Implementando o Peek & Pop
func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
let path = collectionView.indexPathForItemAtPoint(location)
guard let indexPath = path, let cell = self.collectionView.cellForItemAtIndexPath(indexPath) else {
return nil
}
guard let itemDetailsNavigationController = storyboard?.instantiateViewControllerWithIdentifier("itemDetailsNavigationControllerIdentifier")
as? ItemDetailsNavigationController else { return nil }
guard let itemDetailsViewController = itemDetailsNavigationController.viewControllers[0] as? ItemDetailsViewController else { return nil }
let item = self.itemsByCategory[indexPath.section-1].items[indexPath.row]
itemDetailsViewController.item = item
itemDetailsViewController.preferredContentSize = CGSize(width: 0.0, height: 0.0)
previewingContext.sourceRect = self.collectionView.convertRect(cell.frame, fromCoordinateSpace: self.collectionView)
return itemDetailsNavigationController
}
Implementando o Peek & Pop
3. Preview Actions
class ItemDetailsNavigationController: UINavigationController {
@available(iOS 9.0, *)
override func previewActionItems() -> [UIPreviewActionItem] {
let previewAction = UIPreviewAction(title: "Adicionar ao carrinho", style: .Default, handler: { action, viewController in
if self.viewControllers.count == 0 {
return
}
if let itemDetailsViewController = self.viewControllers[0] as? ItemDetailsViewController {
itemDetailsViewController.addToCartFromPeek()
}
})
return [previewAction]
}
}
Implementando o Peek & Pop
3. Preview Actions
class ItemDetailsNavigationController: UINavigationController {
@available(iOS 9.0, *)
override func previewActionItems() -> [UIPreviewActionItem] {
let previewAction = UIPreviewAction(title: "Adicionar ao carrinho", style: .Default, handler: { action, viewController in
if self.viewControllers.count == 0 {
return
}
if let itemDetailsViewController = self.viewControllers[0] as? ItemDetailsViewController {
itemDetailsViewController.addToCartFromPeek()
}
})
return [previewAction]
}
}
Implementando o Peek & Pop
3. Preview Actions
class ItemDetailsNavigationController: UINavigationController {
@available(iOS 9.0, *)
override func previewActionItems() -> [UIPreviewActionItem] {
let previewAction = UIPreviewAction(title: "Adicionar ao carrinho", style: .Default, handler: { action, viewController in
if self.viewControllers.count == 0 {
return
}
if let itemDetailsViewController = self.viewControllers[0] as? ItemDetailsViewController {
itemDetailsViewController.addToCartFromPeek()
}
})
return [previewAction]
}
}
Peek & Pop & Actions!
Desafio
Pense onde você poderia integrar o 3D Touch na sua app e invista
alguns poucos minutos implementando. 😉
Referências
1. iOS Developer Library — Getting Started with 3D Touch
2. iOS Developer Library — Peek and Pop Example
3. iOS Human Interface Guidelines—3D Touch
4. A Peek at 3D Touch—WWDC 2016
5. 3D Touch: Implementando uma ótima experiência para os usuários
Obrigado!
Rodrigo Borges
@rdgborges
linkedin.com/in/rdgborges

More Related Content

What's hot

Adaptive UI - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ -
Adaptive UI  - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ - Adaptive UI  - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ -
Adaptive UI - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ - Yuji Hato
 
Android101 : Introduksjon til Android
Android101 : Introduksjon til AndroidAndroid101 : Introduksjon til Android
Android101 : Introduksjon til AndroidTruls Jørgensen
 
Android Support Library: Using ActionBarCompat
Android Support Library: Using ActionBarCompatAndroid Support Library: Using ActionBarCompat
Android Support Library: Using ActionBarCompatcbeyls
 
Adopting 3D Touch in your apps
Adopting 3D Touch in your appsAdopting 3D Touch in your apps
Adopting 3D Touch in your appsJuan C Catalan
 
embedding web browser in your app
embedding web browser in your appembedding web browser in your app
embedding web browser in your appSamsung
 
Implementing cast in android
Implementing cast in androidImplementing cast in android
Implementing cast in androidAngelo Rüggeberg
 
ハンズオン資料 電話を作ろう(v1.6用)
ハンズオン資料 電話を作ろう(v1.6用)ハンズオン資料 電話を作ろう(v1.6用)
ハンズオン資料 電話を作ろう(v1.6用)Kenji Sakashita
 
[22]Efficient and Testable MVVM pattern
[22]Efficient and Testable MVVM pattern[22]Efficient and Testable MVVM pattern
[22]Efficient and Testable MVVM patternNAVER Engineering
 
Android App Development - 05 Action bar
Android App Development - 05 Action barAndroid App Development - 05 Action bar
Android App Development - 05 Action barDiego Grancini
 
Standford 2015 week6
Standford 2015 week6Standford 2015 week6
Standford 2015 week6彼得潘 Pan
 
Navigation Architecture Component(京都Devかふぇ バージョン)
Navigation Architecture Component(京都Devかふぇ バージョン)Navigation Architecture Component(京都Devかふぇ バージョン)
Navigation Architecture Component(京都Devかふぇ バージョン)Yasutaka Kawamoto
 
Django GeoTracker
Django GeoTrackerDjango GeoTracker
Django GeoTrackerJaniTiainen
 
More android code puzzles
More android code puzzlesMore android code puzzles
More android code puzzlesDanny Preussler
 
navigation-uiライブラリは、既存のアプリを置き換える ことができないかもしれない
navigation-uiライブラリは、既存のアプリを置き換える ことができないかもしれないnavigation-uiライブラリは、既存のアプリを置き換える ことができないかもしれない
navigation-uiライブラリは、既存のアプリを置き換える ことができないかもしれないYasutaka Kawamoto
 
Standford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCs
Standford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCsStandford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCs
Standford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCs彼得潘 Pan
 
Navigation Architecture Component
Navigation Architecture ComponentNavigation Architecture Component
Navigation Architecture ComponentYasutaka Kawamoto
 

What's hot (19)

Adaptive UI - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ -
Adaptive UI  - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ - Adaptive UI  - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ -
Adaptive UI - 解像度の異なるデバイスや画面の向きに対応する 最適なレイアウトへ -
 
Android101 : Introduksjon til Android
Android101 : Introduksjon til AndroidAndroid101 : Introduksjon til Android
Android101 : Introduksjon til Android
 
Android Support Library: Using ActionBarCompat
Android Support Library: Using ActionBarCompatAndroid Support Library: Using ActionBarCompat
Android Support Library: Using ActionBarCompat
 
Adopting 3D Touch in your apps
Adopting 3D Touch in your appsAdopting 3D Touch in your apps
Adopting 3D Touch in your apps
 
embedding web browser in your app
embedding web browser in your appembedding web browser in your app
embedding web browser in your app
 
Implementing cast in android
Implementing cast in androidImplementing cast in android
Implementing cast in android
 
ハンズオン資料 電話を作ろう(v1.6用)
ハンズオン資料 電話を作ろう(v1.6用)ハンズオン資料 電話を作ろう(v1.6用)
ハンズオン資料 電話を作ろう(v1.6用)
 
[22]Efficient and Testable MVVM pattern
[22]Efficient and Testable MVVM pattern[22]Efficient and Testable MVVM pattern
[22]Efficient and Testable MVVM pattern
 
Android App Development - 05 Action bar
Android App Development - 05 Action barAndroid App Development - 05 Action bar
Android App Development - 05 Action bar
 
Action Bar in Android
Action Bar in AndroidAction Bar in Android
Action Bar in Android
 
Backbone Basics with Examples
Backbone Basics with ExamplesBackbone Basics with Examples
Backbone Basics with Examples
 
Action bar
Action barAction bar
Action bar
 
Standford 2015 week6
Standford 2015 week6Standford 2015 week6
Standford 2015 week6
 
Navigation Architecture Component(京都Devかふぇ バージョン)
Navigation Architecture Component(京都Devかふぇ バージョン)Navigation Architecture Component(京都Devかふぇ バージョン)
Navigation Architecture Component(京都Devかふぇ バージョン)
 
Django GeoTracker
Django GeoTrackerDjango GeoTracker
Django GeoTracker
 
More android code puzzles
More android code puzzlesMore android code puzzles
More android code puzzles
 
navigation-uiライブラリは、既存のアプリを置き換える ことができないかもしれない
navigation-uiライブラリは、既存のアプリを置き換える ことができないかもしれないnavigation-uiライブラリは、既存のアプリを置き換える ことができないかもしれない
navigation-uiライブラリは、既存のアプリを置き換える ことができないかもしれない
 
Standford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCs
Standford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCsStandford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCs
Standford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCs
 
Navigation Architecture Component
Navigation Architecture ComponentNavigation Architecture Component
Navigation Architecture Component
 

Similar to 3D Touch: Preparando sua app para o futuro do iOS

Workshop 26: React Native - The Native Side
Workshop 26: React Native - The Native SideWorkshop 26: React Native - The Native Side
Workshop 26: React Native - The Native SideVisual Engineering
 
Android Location-based應用開發分享
Android Location-based應用開發分享Android Location-based應用開發分享
Android Location-based應用開發分享koji lin
 
iOS Development (Part 3) - Additional GUI Components
iOS Development (Part 3) - Additional GUI ComponentsiOS Development (Part 3) - Additional GUI Components
iOS Development (Part 3) - Additional GUI ComponentsAsim Rais Siddiqui
 
Improving android experience for both users and developers
Improving android experience for both users and developersImproving android experience for both users and developers
Improving android experience for both users and developersPavel Lahoda
 
Droidcon2013 android experience lahoda
Droidcon2013 android experience lahodaDroidcon2013 android experience lahoda
Droidcon2013 android experience lahodaDroidcon Berlin
 
ProTips DroidCon Paris 2013
ProTips DroidCon Paris 2013ProTips DroidCon Paris 2013
ProTips DroidCon Paris 2013Mathias Seguy
 
Android Best Practices
Android Best PracticesAndroid Best Practices
Android Best PracticesYekmer Simsek
 
Optimize CollectionView Scrolling
Optimize CollectionView ScrollingOptimize CollectionView Scrolling
Optimize CollectionView ScrollingAndrea Prearo
 
Building Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture ComponentsBuilding Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture ComponentsHassan Abid
 
Android App Development - 04 Views and layouts
Android App Development - 04 Views and layoutsAndroid App Development - 04 Views and layouts
Android App Development - 04 Views and layoutsDiego Grancini
 
Android Design Patterns
Android Design PatternsAndroid Design Patterns
Android Design PatternsGodfrey Nolan
 
React Native for multi-platform mobile applications
React Native for multi-platform mobile applicationsReact Native for multi-platform mobile applications
React Native for multi-platform mobile applicationsMatteo Manchi
 
Android development for iOS developers
Android development for iOS developersAndroid development for iOS developers
Android development for iOS developersDarryl Bayliss
 
Gestures
GesturesGestures
GesturesSV.CO
 

Similar to 3D Touch: Preparando sua app para o futuro do iOS (20)

What's new in iOS9
What's new in iOS9What's new in iOS9
What's new in iOS9
 
I os 11
I os 11I os 11
I os 11
 
Android development
Android developmentAndroid development
Android development
 
iOS
iOSiOS
iOS
 
Compose In Practice
Compose In PracticeCompose In Practice
Compose In Practice
 
Workshop 26: React Native - The Native Side
Workshop 26: React Native - The Native SideWorkshop 26: React Native - The Native Side
Workshop 26: React Native - The Native Side
 
Android Location-based應用開發分享
Android Location-based應用開發分享Android Location-based應用開發分享
Android Location-based應用開發分享
 
iOS Development (Part 3) - Additional GUI Components
iOS Development (Part 3) - Additional GUI ComponentsiOS Development (Part 3) - Additional GUI Components
iOS Development (Part 3) - Additional GUI Components
 
Improving android experience for both users and developers
Improving android experience for both users and developersImproving android experience for both users and developers
Improving android experience for both users and developers
 
Droidcon2013 android experience lahoda
Droidcon2013 android experience lahodaDroidcon2013 android experience lahoda
Droidcon2013 android experience lahoda
 
ProTips DroidCon Paris 2013
ProTips DroidCon Paris 2013ProTips DroidCon Paris 2013
ProTips DroidCon Paris 2013
 
Android Best Practices
Android Best PracticesAndroid Best Practices
Android Best Practices
 
Optimize CollectionView Scrolling
Optimize CollectionView ScrollingOptimize CollectionView Scrolling
Optimize CollectionView Scrolling
 
Building Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture ComponentsBuilding Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture Components
 
Android App Development - 04 Views and layouts
Android App Development - 04 Views and layoutsAndroid App Development - 04 Views and layouts
Android App Development - 04 Views and layouts
 
Android Design Patterns
Android Design PatternsAndroid Design Patterns
Android Design Patterns
 
Android Oreo
Android OreoAndroid Oreo
Android Oreo
 
React Native for multi-platform mobile applications
React Native for multi-platform mobile applicationsReact Native for multi-platform mobile applications
React Native for multi-platform mobile applications
 
Android development for iOS developers
Android development for iOS developersAndroid development for iOS developers
Android development for iOS developers
 
Gestures
GesturesGestures
Gestures
 

More from Rodrigo Borges

Drag and Drop no iOS 11
Drag and Drop no iOS 11Drag and Drop no iOS 11
Drag and Drop no iOS 11Rodrigo Borges
 
Migrando para o Swift 3
Migrando para o Swift 3Migrando para o Swift 3
Migrando para o Swift 3Rodrigo Borges
 
Notificações no iOS 10
Notificações no iOS 10Notificações no iOS 10
Notificações no iOS 10Rodrigo Borges
 
Em busca de um layout bonito e adaptativo: UICollectionView, Auto Layout e Si...
Em busca de um layout bonito e adaptativo: UICollectionView, Auto Layout e Si...Em busca de um layout bonito e adaptativo: UICollectionView, Auto Layout e Si...
Em busca de um layout bonito e adaptativo: UICollectionView, Auto Layout e Si...Rodrigo Borges
 
Ingressos no pulso - Levando festas e ingressos para o Apple Watch
Ingressos no pulso - Levando festas e ingressos para o Apple WatchIngressos no pulso - Levando festas e ingressos para o Apple Watch
Ingressos no pulso - Levando festas e ingressos para o Apple WatchRodrigo Borges
 
Ingresse e o Apple Watch
Ingresse e o Apple WatchIngresse e o Apple Watch
Ingresse e o Apple WatchRodrigo Borges
 
Um Protocolo de Disseminação de Dados Adaptativo para Redes Veiculares
Um Protocolo de Disseminação de Dados Adaptativo para Redes VeicularesUm Protocolo de Disseminação de Dados Adaptativo para Redes Veiculares
Um Protocolo de Disseminação de Dados Adaptativo para Redes VeicularesRodrigo Borges
 

More from Rodrigo Borges (9)

Drag and Drop no iOS 11
Drag and Drop no iOS 11Drag and Drop no iOS 11
Drag and Drop no iOS 11
 
Migrando para o Swift 3
Migrando para o Swift 3Migrando para o Swift 3
Migrando para o Swift 3
 
Notificações no iOS 10
Notificações no iOS 10Notificações no iOS 10
Notificações no iOS 10
 
Hello, WWDC 2016!
Hello, WWDC 2016!Hello, WWDC 2016!
Hello, WWDC 2016!
 
Em busca de um layout bonito e adaptativo: UICollectionView, Auto Layout e Si...
Em busca de um layout bonito e adaptativo: UICollectionView, Auto Layout e Si...Em busca de um layout bonito e adaptativo: UICollectionView, Auto Layout e Si...
Em busca de um layout bonito e adaptativo: UICollectionView, Auto Layout e Si...
 
Ingressos no pulso - Levando festas e ingressos para o Apple Watch
Ingressos no pulso - Levando festas e ingressos para o Apple WatchIngressos no pulso - Levando festas e ingressos para o Apple Watch
Ingressos no pulso - Levando festas e ingressos para o Apple Watch
 
Ingresse e o Apple Watch
Ingresse e o Apple WatchIngresse e o Apple Watch
Ingresse e o Apple Watch
 
Um Protocolo de Disseminação de Dados Adaptativo para Redes Veiculares
Um Protocolo de Disseminação de Dados Adaptativo para Redes VeicularesUm Protocolo de Disseminação de Dados Adaptativo para Redes Veiculares
Um Protocolo de Disseminação de Dados Adaptativo para Redes Veiculares
 
Going Mobile
Going MobileGoing Mobile
Going Mobile
 

3D Touch: Preparando sua app para o futuro do iOS

  • 1. 3D Touch: Preparando sua app para o futuro do iOS Rodrigo Borges Soares
  • 2. Introdução Mobile Developer & Co-Founder @ Meatless iOS Developer @ VivaReal Twitter LinkedIn Medium rdgborges
  • 3. Outline 1. 3D Touch: Ontem e hoje 2. Caso de uso: Meatless 3. Implementando o Peek & Pop 4. Referências
  • 5. 3D Touch ontem: iOS 9 Lançado com os iPhones 6S e 6S+ Nova forma de interação usando o nível de força durante o toque Evolução do Force Touch do Apple Watch
  • 6. 3D Touch ontem: iOS 9 Peek & Pop
  • 7. 3D Touch ontem: iOS 9 Quick Actions
  • 9. 3D Touch hoje: Notifications
  • 10. 3D Touch hoje: Widgets
  • 11. 3D Touch hoje: Groups
  • 12. 3D Touch hoje: Everywhere
  • 13. 3D Touch hoje: Everywhere
  • 14. O 3D Touch se tornará cada vez mais natural para o usuário
  • 16.
  • 17. Peek & Pop Um caso de uso real: Meatless No cardápio, usuários poderiam pré-visualizar foto ampliada, descrição e modificadores Ação rápida para adicionar ao carrinho
  • 20. Implementando o Peek & Pop if #available(iOS 9.1, *) { Peek & Pop pode ser configurado direto no Storyboard e Segues 🎉 } else { UIViewControllerPreviewingDelegate 👌 }
  • 21. Implementando o Peek & Pop Storyboard & Segues
  • 22. Implementando o Peek & Pop 1. Registrar o View Controller para gerenciar o Peek & Pop 2. Implementar os métodos do UIViewControllerPreviewingDelegate 3. Implementar o método previewActionItems() no View Controller que é mostrado no Peek UIViewControllerPreviewingDelegate
  • 23. Implementando o Peek & Pop 1. Registrando o View Controller func setupForceTouchIsAvailable() { if #available(iOS 9.0, *) { if traitCollection.forceTouchCapability == .Available { registerForPreviewingWithDelegate(self, sourceView: self.collectionView) } } }
  • 24. Implementando o Peek & Pop 1. Registrando o View Controller func setupForceTouchIsAvailable() { if #available(iOS 9.0, *) { if traitCollection.forceTouchCapability == .Available { registerForPreviewingWithDelegate(self, sourceView: self.collectionView) } } }
  • 25. Implementando o Peek & Pop 1. Registrando o View Controller func setupForceTouchIsAvailable() { if #available(iOS 9.0, *) { if traitCollection.forceTouchCapability == .Available { registerForPreviewingWithDelegate(self, sourceView: self.collectionView) } } }
  • 26. Implementando o Peek & Pop 1. Registrando o View Controller func setupForceTouchIsAvailable() { if #available(iOS 9.0, *) { if traitCollection.forceTouchCapability == .Available { registerForPreviewingWithDelegate(self, sourceView: self.collectionView) } } }
  • 27. Implementando o Peek & Pop 2. UIViewControllerPreviewingDelegate func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { } func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) { }
  • 28. Implementando o Peek & Pop func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { let path = collectionView.indexPathForItemAtPoint(location) guard let indexPath = path, let cell = self.collectionView.cellForItemAtIndexPath(indexPath) else { return nil } guard let itemDetailsNavigationController = storyboard?.instantiateViewControllerWithIdentifier("itemDetailsNavigationControllerIdentifier") as? ItemDetailsNavigationController else { return nil } guard let itemDetailsViewController = itemDetailsNavigationController.viewControllers[0] as? ItemDetailsViewController else { return nil } let item = self.itemsByCategory[indexPath.section-1].items[indexPath.row] itemDetailsViewController.item = item itemDetailsViewController.preferredContentSize = CGSize(width: 0.0, height: 0.0) previewingContext.sourceRect = self.collectionView.convertRect(cell.frame, fromCoordinateSpace: self.collectionView) return itemDetailsNavigationController }
  • 29. Implementando o Peek & Pop func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { let path = collectionView.indexPathForItemAtPoint(location) guard let indexPath = path, let cell = self.collectionView.cellForItemAtIndexPath(indexPath) else { return nil } guard let itemDetailsNavigationController = storyboard?.instantiateViewControllerWithIdentifier("itemDetailsNavigationControllerIdentifier") as? ItemDetailsNavigationController else { return nil } guard let itemDetailsViewController = itemDetailsNavigationController.viewControllers[0] as? ItemDetailsViewController else { return nil } let item = self.itemsByCategory[indexPath.section-1].items[indexPath.row] itemDetailsViewController.item = item itemDetailsViewController.preferredContentSize = CGSize(width: 0.0, height: 0.0) previewingContext.sourceRect = self.collectionView.convertRect(cell.frame, fromCoordinateSpace: self.collectionView) return itemDetailsNavigationController }
  • 30. Implementando o Peek & Pop func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { let path = collectionView.indexPathForItemAtPoint(location) guard let indexPath = path, let cell = self.collectionView.cellForItemAtIndexPath(indexPath) else { return nil } guard let itemDetailsNavigationController = storyboard?.instantiateViewControllerWithIdentifier("itemDetailsNavigationControllerIdentifier") as? ItemDetailsNavigationController else { return nil } guard let itemDetailsViewController = itemDetailsNavigationController.viewControllers[0] as? ItemDetailsViewController else { return nil } let item = self.itemsByCategory[indexPath.section-1].items[indexPath.row] itemDetailsViewController.item = item itemDetailsViewController.preferredContentSize = CGSize(width: 0.0, height: 0.0) previewingContext.sourceRect = self.collectionView.convertRect(cell.frame, fromCoordinateSpace: self.collectionView) return itemDetailsNavigationController }
  • 31. Implementando o Peek & Pop func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { let path = collectionView.indexPathForItemAtPoint(location) guard let indexPath = path, let cell = self.collectionView.cellForItemAtIndexPath(indexPath) else { return nil } guard let itemDetailsNavigationController = storyboard?.instantiateViewControllerWithIdentifier("itemDetailsNavigationControllerIdentifier") as? ItemDetailsNavigationController else { return nil } guard let itemDetailsViewController = itemDetailsNavigationController.viewControllers[0] as? ItemDetailsViewController else { return nil } let item = self.itemsByCategory[indexPath.section-1].items[indexPath.row] itemDetailsViewController.item = item itemDetailsViewController.preferredContentSize = CGSize(width: 0.0, height: 0.0) previewingContext.sourceRect = self.collectionView.convertRect(cell.frame, fromCoordinateSpace: self.collectionView) return itemDetailsNavigationController }
  • 32. Implementando o Peek & Pop func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { let path = collectionView.indexPathForItemAtPoint(location) guard let indexPath = path, let cell = self.collectionView.cellForItemAtIndexPath(indexPath) else { return nil } guard let itemDetailsNavigationController = storyboard?.instantiateViewControllerWithIdentifier("itemDetailsNavigationControllerIdentifier") as? ItemDetailsNavigationController else { return nil } guard let itemDetailsViewController = itemDetailsNavigationController.viewControllers[0] as? ItemDetailsViewController else { return nil } let item = self.itemsByCategory[indexPath.section-1].items[indexPath.row] itemDetailsViewController.item = item itemDetailsViewController.preferredContentSize = CGSize(width: 0.0, height: 0.0) previewingContext.sourceRect = self.collectionView.convertRect(cell.frame, fromCoordinateSpace: self.collectionView) return itemDetailsNavigationController }
  • 33. Implementando o Peek & Pop 3. Preview Actions class ItemDetailsNavigationController: UINavigationController { @available(iOS 9.0, *) override func previewActionItems() -> [UIPreviewActionItem] { let previewAction = UIPreviewAction(title: "Adicionar ao carrinho", style: .Default, handler: { action, viewController in if self.viewControllers.count == 0 { return } if let itemDetailsViewController = self.viewControllers[0] as? ItemDetailsViewController { itemDetailsViewController.addToCartFromPeek() } }) return [previewAction] } }
  • 34. Implementando o Peek & Pop 3. Preview Actions class ItemDetailsNavigationController: UINavigationController { @available(iOS 9.0, *) override func previewActionItems() -> [UIPreviewActionItem] { let previewAction = UIPreviewAction(title: "Adicionar ao carrinho", style: .Default, handler: { action, viewController in if self.viewControllers.count == 0 { return } if let itemDetailsViewController = self.viewControllers[0] as? ItemDetailsViewController { itemDetailsViewController.addToCartFromPeek() } }) return [previewAction] } }
  • 35. Implementando o Peek & Pop 3. Preview Actions class ItemDetailsNavigationController: UINavigationController { @available(iOS 9.0, *) override func previewActionItems() -> [UIPreviewActionItem] { let previewAction = UIPreviewAction(title: "Adicionar ao carrinho", style: .Default, handler: { action, viewController in if self.viewControllers.count == 0 { return } if let itemDetailsViewController = self.viewControllers[0] as? ItemDetailsViewController { itemDetailsViewController.addToCartFromPeek() } }) return [previewAction] } }
  • 36. Peek & Pop & Actions!
  • 37. Desafio Pense onde você poderia integrar o 3D Touch na sua app e invista alguns poucos minutos implementando. 😉
  • 38. Referências 1. iOS Developer Library — Getting Started with 3D Touch 2. iOS Developer Library — Peek and Pop Example 3. iOS Human Interface Guidelines—3D Touch 4. A Peek at 3D Touch—WWDC 2016 5. 3D Touch: Implementando uma ótima experiência para os usuários