Implementing Spring (Physical) Animations in an iOS App

Jerky and abrupt transitions in the interface reduce trust in the product and hinder the user. We implement physical Spring animations in iOS apps turnkey: we configure screen behavior, eliminate delays, and make motion natural. Interface response speeds up, and the number of abandoned actions decreases.

Development and support of all types of mobile applications:

Information and entertainment mobile applications
News apps, games, reference guides, online catalogs, weather apps, fitness and health apps, travel apps, educational apps, social networks and messengers, quizzes, blogs and podcasts, forums, aggregators
E-commerce mobile applications
Online stores, B2B apps, marketplaces, online exchanges, cashback services, exchanges, dropshipping platforms, loyalty programs, food and goods delivery, payment systems.
Business process management mobile applications
CRM systems, ERP systems, project management, sales team tools, financial management, production management, logistics and delivery management, HR management, data monitoring systems
Electronic services mobile applications
Classified ads platforms, online schools, online cinemas, electronic service platforms, cashback platforms, video hosting, thematic portals, online booking and scheduling platforms, online trading platforms

These are just some of the types of mobile applications we work with, and each of them may have its own specific features and functionality, tailored to the specific needs and goals of the client.

Our competencies:

Frequently Asked Questions

Latest works

  • Development of a mobile application for FEEDME
    Development of a mobile application for FEEDME
    971
  • Development of a mobile application for XOOMER
    Development of a mobile application for XOOMER
    869
  • Development of a mobile application for RHL
    Development of a mobile application for RHL
    1289
  • Development of a mobile application for ZIPPY
    Development of a mobile application for ZIPPY
    1143
  • Development of a mobile application for Affhome
    Development of a mobile application for Affhome
    1076
  • Development of a mobile application for the FLAVORS company
    Development of a mobile application for the FLAVORS company
    677

Spring animations in iOS: where the interface loses responsiveness

Interface responsiveness doesn't break on "heavy" screens, but on small gestures: swiping a card, dismissing a sheet, dragging a list item.

The user lifts their finger mid-motion, and the element either freezes or jerks to its final position along a linear curve — and the gesture stops feeling physical.

The reason is that a linear transition measures time, not velocity and inertia: it doesn't know how fast the finger was moving at the moment of release, and it can't continue the motion from the current position.

Spring animations in iOS solve this differently — the transition is described as an oscillatory system with stiffness, damping, and initial velocity.

When the user lifts their finger, the animation picks up the actual velocity of the gesture and carries the element to its target with natural deceleration, rather than a fixed duration.

This is the physics of animation: motion stays continuous even if the gesture was interrupted halfway, and a repeated touch instantly takes over the animation without a jolt.

Smoothness of transitions also suffers where animations are triggered manually on a timer.

While one transition is running, the second queues up or conflicts with the first — the interface seems to "stick" for a fraction of a second, and it's precisely that fraction the user reads as unresponsiveness.

The spring model allows animations to be layered and interrupted: a new target simply shifts the equilibrium point, and the system recalculates the trajectory from the current state on its own.

A separate case is transitions between screens and list states.

Linear easing over long distances looks mechanical: the start and finish are abrupt, the middle is "empty." A spring provides acceleration at the beginning and soft deceleration at the end, so the interface is perceived as faster, even though the actual transition time hasn't changed.

Let's break down how this is addressed: where to enable the spring model instead of linear curves, how to tie it to gesture velocity, and how to avoid losing responsiveness on low-end devices.

What a physics-based motion model brings to an interface

A physics-based motion model describes an interface not with a set of keyframes, but with system parameters: stiffness, damping, and initial velocity.

Because of this, iOS spring animations continue motion from the current point at the moment of touch rather than restarting from scratch.

To the user, this feels like a response that "follows the finger": a back swipe can be interrupted midway, pulled back, and released — the card will coast to its destination with inertia, without a jerk and without waiting for the animation to finish.

The practical value shows up in three measurable things. First — response speed: the time to the first visible response to a touch is reduced to a single frame, because the animation starts from the layer's actual position rather than from a precomputed state.

Second — resilience to interruptions: transitions between screens, sheets, and expanding panels correctly finish playing out from any intermediate point, so the share of "stuck" states, where the interface waits for an animation to complete, drops to almost zero.

Third — scroll smoothness: list inertia and springy header pull-downs are computed by a single model, which eliminates the mismatch between finger and content on long feeds.

The effect on perception deserves separate mention. "Jankiness" is almost always born not from a low frame rate, but from a conflict between two models: some elements live by linear curves, others by springs.

When the entire interface is switched to a physics-based motion model, behavior becomes predictable, and the number of complaints like "the button didn't press" or "the screen got stuck" drops noticeably — this is visible in store reviews and in support workload.

The transition does not require rewriting the app: spring parameters are moved into a shared settings layer, and existing transitions are connected to it gradually, screen by screen. Next, we break down how this is structured in code and what exactly gets configured.

Implementation modes: native layer, manual physics, hybrid

The choice of mode is determined not by taste, but by how many screens the animation affects and how predictably it must behave under load. Below are three approaches that are realistically chosen between at the start of a project.

Approach When it fits Limitations
Native animation layer Typical transitions, swipes, touch response; animation lives within a single screen Difficult to link multiple screens into one continuous sequence; some parameters are unavailable for fine-tuning
Manual physics Non-standard behavior: linked elements, response to gesture velocity, interruption midway All the math is on us: tuning stiffness, damping, handling interruptions and edge cases
Hybrid approach Long scenarios where part of the motion is system-driven and part is custom The junction of two models: timings need to be synchronized, otherwise the transition between them is noticeable to the eye

The native layer delivers the best response with minimal code: the system calculates inertia itself and aligns it with the screen refresh rate. The price is predictability of behavior on low-end devices and limited control over how the motion completes.

Manual physics is needed where it matters to control the feel itself: how elastically an element returns, how it responds to a sharp gesture, what happens on a repeated touch during motion.

Here we explicitly set the parameters and get the same result on all devices — but each scenario requires separate debugging.

The hybrid approach most often turns out to be the workable compromise: the system layer handles transitions between screens, custom physics handles the key interactive elements.

There is one limitation — the junction of models: if the timings are not aligned, the user feels a break between the "system" and "our" part of the motion.

We lock in the mode for each screen separately and describe the limitations before work begins — so that at the acceptance stage it doesn't turn out that the chosen approach can't handle the required scenario.

How we implement physics-based animations: stages of work

Physics-based animations don't break at the "draw it beautifully" stage — they break at the junction with real data and weak hardware. That's why we structure the process so that spring parameters are validated on live scenarios, not in an isolated prototype.

How the process is structured

  1. Animation audit. We build an inventory of all transitions in the app: where linear interpolation is used, where duration is fixed, where animation is triggered manually by a timer. We flag transitions that conflict with gestures and scrolling, and places where frames drop during parallel animations.
  2. Parameter tuning. For each transition, we select stiffness, damping, and initial velocity — not by eye, but based on the element's mass and the gesture context. Swipe-to-dismiss and modal appearance require different profiles: one should "catch up" to the finger, the other should settle without bouncing.
  3. Gesture coupling. We tie animation progress to the finger position so that release picks up the current velocity instead of starting from zero. This eliminates the disconnect between hand movement and interface response.
  4. Device testing. We run transitions on low-end and flagship models, in dark theme, with reduced motion enabled, and at different screen refresh rates. We look not only at smoothness but also at behavior when an animation is interrupted midway.
  5. Profiling. We measure frame time in the most demanding scenarios — opening a screen with data loading, parallel transitions, long lists. Animations that drop frames are switched to cheaper properties.
  6. Documenting the guidelines. We lock in conventions: which parameters are considered reference values, how profiles are named, what to do when adding a new transition.
  7. Handover to the client's team. We hold a walkthrough with the developers, showing where to change parameters and how to verify the result, so that future edits can be made without us.

What the client's team keeps

After handover, the client has configured animation profiles tied to specific transitions, and guidelines with reference values.

A new developer adds a screen and picks up a ready-made profile instead of reinventing timings from scratch — interface behavior stays predictable as the app grows.

Spring parameters and behavior across different screens

A spring animation is described by three parameters: stiffness, damping, and initial velocity. Stiffness defines how quickly the system strives toward the target position — high values produce a sharp response, low values make the motion viscous.

Damping determines how much oscillation remains after reaching the target: an underdamped spring "rings" and overshoots the rest point, while an overdamped one crawls toward it without character.

Initial velocity links the animation to the gesture — if the finger was moving fast, the interface should continue moving with the same energy, otherwise a disconnect arises between action and response.

The feel of an interface is composed of the relationship between these three values, not each one individually.

The same stiffness-damping pair reads as tight on a light toggle, but as jerky on a full-screen panel: the greater the distance and area of the element, the lower the stiffness should be so that the motion remains readable.

Initial velocity cannot be fixed as a constant — it is taken from the current gesture velocity, otherwise a fast swipe and a slow drag will feel identical, which immediately gives away a "drawn" animation.

Behavior across different screens requires separate tuning, not a single preset. On compact screens, elements travel a shorter distance, and high stiffness is appropriate there — the motion manages to complete before the user shifts their gaze.

On wide screens and tablets, the same value produces a jolt at the start and a long tail at the end, so stiffness is lowered and damping is raised closer to critical, so that large surfaces move smoothly and predictably.

We extract spring parameters into a single configuration with presets for element classes and overrides for screen size, rather than hardcoding values at call sites.

This way a single edit changes the behavior of the entire system consistently, and desynchronization between screens is caught at the review stage rather than in user feedback.

What the client receives after implementation

After implementing physical animations, the project remains manageable: an engineer who opens it six months later sees not scattered constants throughout the code, but a unified behavior layer. Below is what exactly we hand over to the client's team.

  • Configured animation settings: elasticity, damping, and initial velocity parameters are moved into a separate layer and grouped by scenario — screen appearance, tap response, modal window dismissal. Values are edited in one place and applied across the entire application.
  • Screen transition schemas: it is described which transition is triggered by which gesture, how interactive dismissal behaves, and what happens when a gesture is interrupted midway. The schema eliminates "this is how it should be" disputes during acceptance.
  • A library of typical interactions: a set of ready-made response models for cards, lists, buttons, and toggles. New screens are assembled from them rather than written from scratch.
  • Documentation for the animation layer: where the configurations are stored, how to add a new scenario, which parameters affect the perception of speed and weight. With code examples and analysis of common mistakes.
  • Maintenance regulations: the rules by which animations are changed after release — who approves an edit, how it is tested on low-end devices, and what is considered a regression.
  • A set of behavior checks: scenarios that are run before release — transition interruption, rapid repeated taps, return from background. They catch animation breakages before the user sees them.
  • Behavior profile on low-end devices: it is documented how the system reduces load when reduced motion mode is enabled and on older models.

All of this remains in the client's repository along with the change history. The team can develop animations on its own, and we step in on a targeted basis — for new scenarios or when behavior needs to be rebuilt for a changed interface.

How physical animation differs from linear animation and which to choose

Linear animation defines progress along a fixed curve: the value is interpolated between the start and the end over a given time, and the easing function merely redistributes velocity within that segment.

Physical (Spring) animation, instead of a curve, describes a system: it has mass, spring stiffness, and damping, and its position is calculated according to the law of motion.

Hence the key difference in behavior — linear animation does not know what happened before it was triggered, whereas Spring animation starts with the current velocity and smoothly dissipates it.

In practice, this becomes apparent at the moment of interruption. If the user flicks a card while it is still moving, linear animation either restarts abruptly from scratch or freezes — because its state is only time.

Spring animation picks up the current velocity and continues the motion without a break: the same gesture, released midway, looks natural.

That is why physical animation is indispensable wherever there is direct manipulation — swipes, drag-and-drop, pull-to-refresh, interactive transitions between screens.

The selection criteria boil down to three questions. Does the animation have an initial velocity that needs to be preserved? Can the user interrupt it midway? Should it respond to a change of target during execution? If at least one answer is "yes" — we go with Spring.

If the animation is decorative and one-off (a modal window appearing, a color change, a loading progress), a linear curve is more predictable and cheaper in terms of computation.

By usage scenarios, the breakdown is as follows: transitions and element appearances — linear with well-thought-out easing; interactive gestures and anything that follows the finger — physical.

Mixing them within a single element is not advisable: different motion models produce an inconsistent feel.

Our engineers tune the spring parameters for a specific scenario — stiffness and damping are selected so that the motion reads as a response of the interface, not as an effect for effect's sake.

Case: eliminated jank in the feed and sped up responsiveness

The client is a service with a recommendation feed: cards with images, infinite scroll, tens of thousands of daily active users. The feed stuttered during fast scrolling, and the response to a tap on a card lagged — the transition opened with a noticeable delay.

There was a steady stream of support requests specifically about smoothness: users described it as "laggy" and "unresponsive," even though everything worked functionally.

We treated Spring animations as a separate task, not as cosmetics.

The cause of the jank was not network speed, but the fact that animations were triggered manually on a timer and did not account for interruptions: during fast scrolling, frames overlapped each other, and the tap gesture was processed only after the current animation finished.

We switched transitions to a physics-based model — motion is calculated from the current position and velocity rather than a fixed duration, so a gesture interruption doesn't break the frame.

What we changed

  • Card transitions and detail opening were switched to a spring model with configurable stiffness and damping instead of fixed durations.
  • Gestures were given priority over animation: a tap interrupts the current motion and starts a new one from the actual position.
  • Heavy operations when opening a card were moved out of the animation frame so they wouldn't block rendering.
  • We set up responsiveness and smoothness measurements in an automated run — we catch frame regressions before release.

Metrics before and after

Metric Before After
Response to tap on card noticeable delay, transition "chased" the finger opening starts immediately from the touch point
Feed smoothness during fast scroll jank on every screen motion is even throughout
Support requests about smoothness steady stream share of requests dropped severalfold

The perception of the interface changed more than can be judged from measurements alone: the feed began to feel "alive" rather than "heavy." This is a case where the physics of motion matters more than absolute numbers — the user perceives responsiveness by how an element follows the finger, not by data load time.

Technical concerns before starting work

Physical Spring animations in iOS are built on UISpringTimingParameters and UIViewPropertyAnimator — this is a system layer, not a third-party library, so the compatibility question comes down to the OS version.

On current iOS branches everything works out of the box; on devices where the OS is older, we swap the mechanics for CASpringAnimation from Core Animation — the visual behavior matches, only the calculation method changes.

We separately check Reduce Motion: if the user has enabled reduced motion in accessibility settings, the animation should fall back to a short crossfade, otherwise the app will fail accessibility review.

Performance depends on what we animate. A spring on transform and opacity is computed on the GPU and does not load the main thread; a spring on frame or cornerRadius forces layout recalculation every frame and causes frame drops on older devices.

We map out in advance which properties can be driven through transforms and where a compromise is needed — and we lock this into the animation specification before any edits begin.

The scope of changes depends on the current screen architecture. If the layout is on Auto Layout and animations are already extracted into a separate layer, integrating Spring animations in iOS takes targeted edits in 3-5 places.

If the logic is smeared across controllers, we first extract the animation layer, otherwise each new spring breaks its neighbor.

Will this work on older devices?

Yes. We don't tie ourselves to a single API: on newer systems we use the system mechanism, on older ones — Core Animation with the same elasticity parameters.

Behavior and timings remain predictable, and on weak hardware we reduce the number of simultaneously animated elements so frames don't drop.

Will performance degrade after implementation?

Springs on transforms and opacity do not load the main thread. Risk arises only where an animation triggers layout recalculation — we find such places during the analysis phase and switch them to safe properties. After the edits, we run frame measurements on the target device fleet.

How large is the scope of edits in the existing code?

It depends on how well the animations are already isolated. With clean layout it's targeted changes; with smeared logic — a preliminary extraction of the animation layer. We state the exact boundary after analyzing the code, before work begins.

Let's discuss the task and come back with an estimate and a plan

For the estimate to be substantive rather than an "industry average," we need to understand the current state of animations in the app: where they already exist, what they are built on, and what exactly is unsatisfactory — jank during gestures, desync with scrolling, or lack of response to interruption.

Describe the situation in free form, and we will come back with a work estimate and a plan for implementing Spring animations for your project.

What is worth including with the task description so that we can immediately see the scope:

  • A list of screens and elements where physical animations are needed: transitions, swipes, drag-and-drop, card expansion, tap response.
  • The current approach: UIView animations with fixed duration, off-the-shelf libraries, or manual calculations — and exactly how the problem manifests.
  • The target behavior: how an element should react to gesture interruption, to release mid-motion, to a change of direction.
  • Constraints: the minimum supported OS version, the presence of rasterized layers, heavy shadows and blurs affecting smoothness.
  • References: apps or videos where the animation behavior satisfies you — this removes half the ambiguity in acceptance.
  • Access and materials: the repository, mockups, the design system, current frame rate measurements under load.

Based on this set, we determine where it is enough to move existing transitions to a spring model, and where the layer hierarchy will need to be reworked and calculations moved off the main thread.

In return, you receive a phased implementation plan: an audit of the current animation logic, a prototype on one screen to verify the feel, migration of the remaining scenes, smoothness measurements before and after, and regression checks on low-end devices.

The next steps are simple: you send the description and materials, we review them and schedule a short call on the contentious points.

After that, we lock down the scope, the order of work, and the acceptance criteria — and start with the prototype so that you can see the animation behavior on a real device before the changes roll out across the entire app.