app-store
App Store optimization and marketing skills for descriptions, screenshots, keywords, review responses, and comprehensive promotional strategy. Use when user…
SwiftUI layout beyond stacks — the Layout protocol (when custom layout beats GeometryReader), Grid vs lazy grids, custom containers with sections and container values, and lazy-stack/ScrollView performance rules (what breaks laziness, prefetch discipline, scroll APIs). Use when
$ npx -y skills add rshankras/claude-code-apple-skills --skill layout --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/layoutContext preview
The summary Claude sees to decide when to auto-load this skill.
SwiftUI layout beyond stacks — the Layout protocol (when custom layout beats GeometryReader), Grid vs lazy grids, custom containers with sections and container values, and lazy-stack/ScrollView performance rules (what breaks laziness, prefetch discipline, scroll APIs). Use when
name: layout description: SwiftUI layout beyond stacks — the Layout protocol (when custom layout beats GeometryReader), Grid vs lazy grids, custom containers with sections and container values, and lazy-stack/ScrollView performance rules (what breaks laziness, prefetch discipline, scroll APIs). Use when building custom layouts or containers, fixing lazy-stack jank or memory growth, or wiring programmatic/snapping scrolling. allowed-tools: [Read, Write, Edit, Glob, Grep] last_verified: 2026-07-16 review_by: 2027-06-22
The layer between "stacks and spacers" and "it scrolls like butter with 100k rows" — Apple's Layout protocol, container composition, and the lazy-stack rules from the WWDC26 deep dive. View identity/data-flow questions route to `swiftui/data-flow`.
Reach for a custom `Layout` whenever you must **measure subviews and feed the measurement back into layout** — GeometryReader only measures its container and can't influence the engine. Canonical case: equal-width buttons.
(`subviews.map { $0.sizeThatFits(.unspecified) }`); guard empty subviews; `replacingUnspecifiedDimensions()` for nil proposal dimensions.
what make layouts composable); `place(at:anchor:proposal:)` with a proposal that may differ from the ideal size (that's how equal widths happen).
of conflicting preferences — matching built-in containers. No hardcoded 8s.
`subview[Key.self]`.
`.animation(_:value:)` — SwiftUI sees one changing view, so state survives and it animates.
| Need | Use | |---|---| | Static 2D with cross-row alignment | `Grid`/`GridRow` (+ `gridCellColumns` to span, `gridColumnAlignment` per column) | | Scrollable, large content | `LazyVGrid`/`LazyHGrid` (only visible views load; one axis fixed up front) | | "First arrangement that fits" | `ViewThatFits` |
Make containers that compose like `List` does:
views, `ForEach`, and conditionals.
(count/chunking)? `Group(subviews: content) { subviews in … }`.
its children; EmptyView to zero; `if` conditionally. Counting declared views is a bug.
`section.content`; check `header.isEmpty` before rendering the slot.
set with a convenience modifier, read via `subview.containerValues`. Scoping model: **Environment flows down · Preferences flow up · container values reach only the direct container.** Setting one on a `Section` styles the whole section.
LazyVStack builds views only until the viewport fills; totals and offsets are **estimated** from average placed-view size and corrected as you scroll. Everything below follows from that:
stack to keep off-screen views + their `@State` alive to preserve indices — and environment changes then re-evaluate off-screen bodies. Filter at the data layer (`@Query` predicate); gate auth-type conditions *outside* the stack.
estimates) — use `onScrollTargetVisibilityChange(threshold: 0.8)` for visibility triggers.
prefetch; `onAppear` fires only on-screen, throwing prefetch work away and causing post-appearance size jumps. Start async loads in `init`/`task`.
released. Hoist (`@State var highlighted: Set<ID>` outside, `@Binding` down).
escaping the frame make views vanish early).
breaks) — that's the custom `Layout` case above.
heights (`lineLimit`, explicit frames) in the horizontal stacks.
`ProgressView().onAppear { fetchNextPage() }` after the ForEach.
`scrollTo(id:)` — works for unloaded targets *if* IDs map to stable one-subview el
A collection of Claude Code skills for iOS, macOS, watchOS, visionOS, and Apple platform development. These skills help you plan and build apps, maintain code quality, ensure HIG compliance, and guide you from idea to App Store.
Repo: rshankras/claude-code-apple-skills
App Store optimization and marketing skills for descriptions, screenshots, keywords, review responses, and comprehensive promotional strategy. Use when user…
Privacy-preserving ad measurement with AdAttributionKit (SKAdNetwork's successor) — install and re-engagement attribution, conversion-value strategy under…
Generate compelling App Store descriptions that convert browsers into users. Use when writing initial descriptions, improving existing copy, or drafting…
Apple Search Ads campaign strategy for indie developers — paid acquisition, keyword bidding, budget planning, and ROAS optimization. Use when user asks about…
Take a one-time in-app purchase from MISSING_METADATA to READY_TO_SUBMIT in App Store Connect — set its price schedule and localized display name/description…
Optimize app title, subtitle, and keywords for maximum App Store discoverability. Use when launching a new app, improving search rankings, entering new…