3D Touch

3D Touch is a woefully underrated feature in today’s modern iPhones. There are now (what I consider to be) credible reports suggesting that Apple intends to drop this feature in their 2019 iPhone models.

This is highly unfortunate if true.

What is 3D Touch? #

Ultimately, this is our focus. 3D Touch is something we’ve worked on for a long time—multi, multi, multi years

3D Touch was introduced circa 2015 with the iPhone 6S. It’s the extra informational input of pressure with every touch on the screen. Apparently it was something they’d been working on for a while.

Why is going away? #

Simply put - it failed to become an idiomatic element of the iPhone’s UX language.

Many have speculated on why this is so. Here are the top 5 reasons that I have surmised:

  1. A lack of marketing.
  2. Inconsistent availability across iOS.
  3. Lack of any visual cues to enable discovery.
  4. Lack of developer creativity, from both Apple and 3rd party developers.
  5. It’s unnecessary as a feature, and Haptic Touch is good enough.

I personally lean more towards 1-3, with 4 being a soft reason and 5 being absolutely untrue.

Haptic Touch #

“Haptic Touch” is simply a long press gesture coupled with a haptic response. It is touted as the replacement for 3D Touch, and is implemented as such for the iPhone XR. Apple, as always, has chosen to parade it as if it is the greatest thing since sliced bread.

Why should I care? #

Because Haptic Touch is simply not a replacement, and can never be a replacement for 3D Touch. It is a hacky attempt at emulating 3D Touch at best.

Haptic Touch requires you to long-press and wait.

3D Touch is instantaneous.

Haptic Touch over 3D Touch is clearly a degraded user experience. Do not let anyone trick you into believing otherwise, Apple most of all.

Amongst other things: #

On inconsistent availability and the lack of discoverability… #

One of the easiest ways for Apple to have made 3D Touch pervasive and consistently discoverable across the system, in my opinion, would’ve been to automatically convert every single long-press gesture into a 3D Touch gesture. It needn’t have supplanted long-press, but simply added to it.

This has a couple of benefits:

  1. Clear demonstration of utility - 3D Touch offers a faster route of access as compared to a long-press gesture.
  2. Consistency - all apps immediately benefit from 3D Touch across all screens at once, instead of the developer having to manually reiterate over every control in their application(s).
  3. Discoverability - users soon realize that long-press gestures could be activated via 3D Touch, and automatically adapt based on learnt knowledge of existing gestures rather than just trying to press hard on every UI element in the screen.

On the lack of developer effort… #

As a developer, Apple has not made it easy for me to implement a 3D Touch action. Instead of providing a canonical UIGestureRecognizer subclass for 3D Touch (as they so easily could have), they decided to leave it up to the developer to implement.

This makes something that could’ve been stupid simple to integrate annoying and effortful to support.

It’s not just 3rd party developers who suffer from this, it’s Apple too. The Messages app requires a painfully slow long-press to bring up the effects menu, and it could’ve easily been replaced/augmented by a 3D Touch recognizer.

On the lack of creativity… #

Apple has clearly missed out on certain use cases for 3D Touch. Last year, I demonstrated two such cases and won a hackathon for doing so. You can find the code for the project here.

I took existing multi-touch gestures, such as rotate and zoom, and converted them to single-touch gestures with the help of 3D Touch - effectively expanding the scope of single-handed usage for apps implementing these operations.


Now read this

Context capturing C function pointers in Swift.

Take the following code: func foo() { let bar = NSObject() let f: (@convention(c) () -> ()) = { print(bar) } } This will not compile. You will instead be presented with the following error: error: a C function pointer cannot be formed... Continue →