Pagenue v0.6.0
skills/ios-feel-motion/SKILL.md5 sectionsProprietary

iOS-feel motion

The agent loads it when

Use when building scrolling, dragging, overscroll, sheets, or animations (web, React Native, SwiftUI, Flutter) that should feel native like iOS: rubber banding, springs, momentum, interruptible motion.

npx @codesudee/web-skills -s ios-feel-motion
Download .zip

Try it

01 · Rubber banding

The edge pulls back harder the further you go

Drag the list past its edge. Content moves 55% of the finger at first, the share keeps shrinking, and it can never travel more than one viewport. Hover the chart to read the curve.

0d0.5d1d1.5d2d2.5d3d0d0.25d0.5d0.75d1d finger past the edge content moves 1:1 finger flat 55% never past d rubber band

Rubber band curve: content offset rises quickly at first and flattens toward one viewport, below both the 1:1 line and a flat 55% line.

rubber band, c = 0.55wrong: 1:1 or a flat 55%

Drag the list

02 · Springs, not eases

Same response, different damping

All three presets share a 0.5s response, so they keep one rhythm. The dashed line is Core Animation's default spring, which rings for well over a second. Press play to race them, or click a legend item to hide it.

0s0.2s0.4s0.6s0.8s1s1.2s1.4s1.6s00.5target time position

Step responses over 1.6 seconds. Smooth rises without overshoot, snappy overshoots slightly, bouncy overshoots about 5%, and the Core Animation default overshoots about 16% and keeps oscillating.

smooth
snappy
bouncy
CA default
Framer Motion: stiffness 157.91, damping 25.13, mass 1
03 · Interruptibility

Change your mind halfway

Press Move, then press it again before the balls arrive. The ease restarts from zero speed and visibly stops. The spring keeps its velocity and turns around smoothly. The chart shows the speed of each.

ease 0.35s
spring
Tip: press twice quickly
-3s-2s-1snow-8-4048 speed (lanes/s)
ease: speed drops to 0 when caughtspring: speed carries throughyou pressed Move
04 · Momentum projection

Flick it. It lands where your throw was headed

On release, the resting point is projected from the finger's velocity and the nearest snap to that point wins. Switch to "Nearest to release" to feel why a hard flick should not snap back.

Drag the puck and let go mid-swipe

iOS-feel motion

Three things make iOS feel good: the rubber band at scroll edges, springs instead of timed eases, and animations that carry velocity when interrupted. Apply all three. Never use linear motion or fixed-duration eases for anything the finger touches.

Source: justinbuilds.mov, “Why does iOS feel so nice to use” (blog.justinbuilds.mov/ios). The values were read from the iOS 27 binary and measured by running Apple’s frameworks. Section 4 (momentum) comes from Apple’s WWDC18 talk Designing Fluid Interfaces.

1. Rubber banding (overscroll)

When the finger drags past an edge, move the content by this amount:

overscroll(x) = (c * x * d) / (d + c * x)
  • x = distance the finger has gone past the edge, in px/pt (use the absolute value and apply the sign afterward)
  • d = viewport size along that axis, about one screen
  • c = coefficient: 0.55 for touch (default). Other inputs: small trackpad 0.715, large trackpad 0.17, continuous mouse 0.4, hi-res wheel 0.17, low-res wheel 0.5

Properties to preserve:

  • Near the edge, content moves 55% of the finger distance, and that share shrinks the further you drag. After one full screen of drag, each extra point moves the content only about 0.23 pt.
  • Content can never move more than d. The curve is a rational function, NOT a log curve and NOT a flat 55% multiplier. Don’t swap in either one.
  • The same curve drives the interactive back-swipe, so reuse it for sheets and drawers that are dragged past their limits.
  • On release, spring back to the edge, passing the release velocity into the spring (see section 3).

Sanity check (d=844, c=0.55): 25 → 13.5, 100 → 51.6, 844 → 299.5, 3000 → 558.4.

const rubberBand = (x, d, c = 0.55) => {
  const s = Math.sign(x), a = Math.abs(x);
  return s * (c * a * d) / (d + c * a);
};

4 more sections

  • Springs, not eases
  • Interruptibility (the most important rule)
  • Momentum / flick projection (WWDC18)
  • Checklist

Create a free Pagenue account to read the whole skill, download it, and install it.

Sign in free to read the rest