A practical UIKit screenshot pipeline, a paywall layout bug, and the failure modes to fix before trusting CI.

iOS visual regression testing can start with a small, local pipeline: launch a specific screen, capture it on a simulator, and compare its pixels against an accepted baseline. The difficult part is making sure both screenshots represent the same environment and application state.

While updating ShotZen's paywall, I reordered subscription options, emphasized a recommendation badge, and added a NO RENEWALS label to the lifetime option. The screenshot report showed changes beyond the areas I intended to edit. The annual subscription row, call-to-action button, and footer had moved too.

Replacing the padded badge with plain text reduced the reported difference. That experience shaped how I read visual regression reports: the percentage measures changed area, while the surrounding context explains whether the change is acceptable.

This walkthrough covers the implementation described in that September 2026 case, including its limitations. It is useful as a local review tool; several capture checks still need strengthening before treating it as an unattended CI gate.