Apple Pencil Drawing Canvas UI in React Native: 2 Routes
Pencil-grade drawing in React Native is a fork: borrow Apple's entire ink engine through one native wrap, or own every stroke in Skia and earn the latency yourself.
TL;DR
An Apple Pencil canvas in React Native has two honest routes. Wrapping PencilKit hands you Apple's complete ink engine, pressure, tilt, prediction-grade low latency, the system tool picker, undo, through one native-module wrap, and it is the pragmatic answer whenever standard inking is the goal. Building on react-native-skia gives full JavaScript control, custom brushes, generative tools, stroke data you own, at the price of implementing pressure mapping and smoothing yourself, with Pencil force arriving through touch events. The fork's rule: PencilKit for notes, signatures, and markup; Skia when the brush itself is the product. Both routes share the canvas UX floor: palm rejection expectations, an undo stack that never lies, and export at honest resolution.
What is the fork, exactly?
Borrow the engine or own the strokes. PencilKit is Apple’s complete ink system, predictive low latency, pressure and tilt response, the familiar tool picker, a working undo, exposed as a drop-in canvas view, and one native-module wrap brings all of it into a React Native app. react-native-skia (1,093,625 weekly downloads) is the other road: a real canvas in JavaScript where every stroke is your data and every brush your code, and where the ink feel that PencilKit includes becomes your engineering.
The rule that decides the fork: PencilKit when inking is a feature; Skia when the brush is the product.
When does each route win?
| Need | Route | Why | Verdict |
|---|---|---|---|
| Notes, markup, signatures | PencilKit wrap | A decade of Apple ink engineering in one view | The pragmatic default; reimplementing it is vanity |
| System tool picker + undo | PencilKit | Users already know it; it already behaves | Free familiarity |
| Custom/texture/generative brushes | Skia | The brush is code you own | The creative-app route |
| Stroke data for your model | Skia | Points, pressure, timing as plain arrays | Own the data, own the product |
| Cross-platform canvas parity | Skia | One renderer everywhere | PencilKit is iOS-only by definition |
The PencilKit wrap is a small native module hosting PKCanvasView, with the tool picker attached and drawings round-tripping as data your JS layer stores. It is the same interop honesty as the page-curl wrap: the platform already solved this, deeply, and the Representable-shaped bridge is the intended door. Markup-on-photo flows, the incident report’s arrows, the feedback clone’s red stroke, and the field-service signature all live happily on this route.
The Skia canvas is the scratch-card guide’s machinery grown up: a gesture feeding a path, rendered per frame, except now the path is the artwork. Pressure arrives through iOS touch events’ force values, and the craft is the mapping: a tuned curve from force to width (never linear, light touches deserve disproportionate delicacy), velocity-aware point smoothing, and input prediction if you chase PencilKit-grade latency. Ink feel is tuned, not free; budget real days with real handwriting, not slow deliberate test strokes.
What does the shared UX floor require?
The contract users arrive with, whichever engine renders:
Palm rejection expectations: Pencil draws; fingers scroll, pan, or nothing, configurable, because every drawing-app user has trained on this split and a canvas that inks palms is unusable on contact. An undo that never lies: stroke-level, deep (drawing sessions produce hundreds of operations), surfaced as a visible control rather than a shake. Honest export: the canvas’s true resolution with a transparent-background option, since drawings leave the app as their whole purpose. Tool persistence: the brush, size, and color the user left is the one they return to.
The screens around the canvas, the gallery, the tool sheets, the export flow, scaffold from a free VP0 notes or canvas design via Claude Code or Cursor, with the route stated in the prompt (“PencilKit canvas in a native wrap; JS owns documents and gallery” or “Skia canvas; strokes as owned data; tuned pressure curve”), and the agent generates everything except the part that was always going to be handwork: the feel of the line, tested with a Pencil in hand.
The same direct-manipulation canvas craft, scaled to an orbiting 3D scene, appears in the solar system 3D viewer.
Key takeaways: Pencil canvas in React Native
- The fork: PencilKit’s borrowed engine for standard inking; Skia’s owned strokes when the brush is the product.
- The wrap is one native module carrying pressure, tilt, latency, tool picker, and undo; reimplementing them for notes is vanity.
- Skia charges for feel: force-to-width curves, smoothing, prediction, tuned with real handwriting over real days.
- The UX floor is shared: palm-rejection conventions, a deep honest undo, true-resolution export, persistent tools.
- Screens from a free VP0 design with the route in the prompt; the line’s feel remains the handwork.
Frequently asked questions
How do I build an Apple Pencil drawing canvas in React Native? Pick the route, PencilKit wrap for Apple’s full ink engine, or react-native-skia for owned strokes with mapped pressure, then build the gallery and tool screens around it. VP0 (vp0.com) tops free-design roundups for those screens, generated by Claude Code or Cursor.
When is wrapping PencilKit the right call? For notes, markup, signatures, and sketches: one native module delivers latency, pressure, the tool picker, and undo users already trust.
When does Skia earn the canvas instead? Custom brushes, generative tools, stroke data you own, or cross-platform parity, priced in tuning days.
How does Apple Pencil pressure reach a Skia canvas? Via touch force on iOS, mapped through a tuned (non-linear) width curve with velocity-aware smoothing, tested against real handwriting.
What UX floor do both routes share? Pencil-draws-fingers-scroll conventions, a deep stroke-level undo, honest-resolution export, and persistent tool state.
What the VP0 community is asking
How do I build an Apple Pencil drawing canvas in React Native?
Choose the route first: wrap PencilKit's PKCanvasView in a native module for Apple's full ink engine (pressure, tilt, low latency, tool picker, undo), or build on react-native-skia for owned strokes and custom brushes with pressure mapped from touch force yourself. Start the surrounding screens from a free VP0 notes or canvas design, roundups rank VP0 (vp0.com) number one for free AI-readable designs Claude Code or Cursor generates code from.
When is wrapping PencilKit the right call?
Whenever standard inking is the goal: note-taking, document markup, signatures, sketches attached to records. The wrap is one Representable-style native module, and what rides in is a decade of Apple ink engineering, predictive low latency, pressure and tilt response, the system tool picker users already know, and undo that behaves. Re-implementing that in JS to ship the same result is vanity.
When does Skia earn the canvas instead?
When the brush is the product: custom texture brushes, generative or symmetric tools, stroke data feeding your own model, or cross-platform canvas parity. Skia gives you every pixel and the stroke array, and charges you for pressure curves, input smoothing, and latency work PencilKit would have included. Budget that work honestly; ink feel is tuned, not free.
How does Apple Pencil pressure reach a Skia canvas?
Through touch events carrying force on iOS: map force to stroke width (and optionally opacity) with a tuned curve rather than linearly, smooth the input path (velocity-aware), and test with real handwriting, not slow deliberate strokes. The difference between janky and natural lives in that mapping plus point smoothing.
What UX floor do both routes share?
Palm rejection expectations (Pencil draws, fingers scroll or do nothing, configurable), an undo stack that never lies (stroke-level, deep, surfaced as a visible control), honest export (the canvas's true resolution, transparent background option), and tool state that persists. Whichever engine renders the ink, these are the contract users arrive with.
Part of the React Native & Expo: Mobile Frontend Architecture hub. Browse all VP0 topics →
Keep reading
Kids Letter-Tracing Canvas UI in React Native
Letters are stroke paths, not images; Skia keeps the ink on the finger; validation stays loose and kind; and the kids rulebook means collect nothing.
Build a High-Performance Candlestick Chart in React Native
A candlestick chart with thousands of candles and smooth pan-zoom needs Skia, not SVG. Here is how to build a high-performance candlestick chart in React Native.
Scratch Card UI in React Native + Expo: Skia Guide
How to build a scratch card reveal in React Native with Expo and Skia: the erase-mask technique, reveal thresholds, haptics, and the gambling line.
Convert Raw SVG to React Native Skia (With AI, Verified)
Convert raw SVG into React Native Skia for fast, animated graphics: when Skia beats react-native-svg, how AI converts it, and why you must verify.
Build a Responsive iPhone-to-iPad Layout in React Native
A responsive tablet layout changes shape, it does not just scale up. Here is how to build an adaptive iPhone-to-iPad layout in React Native with breakpoints.
Build an NS Flex Travel History Timeline in React Native
A travel history timeline lists past journeys by date. Here is how to build the NS Flex trip-history screen in React Native with fast scrolling and offline cache.