{"id":"37a96e57-b834-4cae-b5e3-14688a3183fb","shortId":"8XydzG","kind":"skill","title":"pencilkit","tagline":"Add Apple Pencil drawing, canvas views, tool pickers, and ink serialization using PencilKit. Use when building drawing apps, annotation features, handwriting capture, signature fields, or any Apple Pencil-powered experience on iOS/iPadOS/visionOS.","description":"# PencilKit\n\nCapture Apple Pencil and finger input using `PKCanvasView`, manage drawing\ntools with `PKToolPicker`, serialize drawings with `PKDrawing`, and wrap\nPencilKit in SwiftUI. Targets Swift 6.3 / iOS 26+.\n\n## Contents\n\n- [Setup](#setup)\n- [PKCanvasView Basics](#pkcanvasview-basics)\n- [PKToolPicker](#pktoolpicker)\n- [PKDrawing Serialization](#pkdrawing-serialization)\n- [Exporting to Image](#exporting-to-image)\n- [Stroke Inspection](#stroke-inspection)\n- [SwiftUI Integration](#swiftui-integration)\n- [PaperKit Relationship](#paperkit-relationship)\n- [Common Mistakes](#common-mistakes)\n- [Review Checklist](#review-checklist)\n- [References](#references)\n\n## Setup\n\nPencilKit requires no entitlements or Info.plist entries. Import `PencilKit`\nand create a `PKCanvasView`.\n\n```swift\nimport PencilKit\n```\n\n**Platform availability:** iOS 13+, iPadOS 13+, Mac Catalyst 13.1+, visionOS 1.0+.\n\n## PKCanvasView Basics\n\n`PKCanvasView` is a `UIScrollView` subclass that captures Apple Pencil and\nfinger input and renders strokes.\n\n```swift\nimport PencilKit\nimport UIKit\n\nclass DrawingViewController: UIViewController, PKCanvasViewDelegate {\n    let canvasView = PKCanvasView()\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        canvasView.delegate = self\n        canvasView.drawingPolicy = .anyInput\n        canvasView.tool = PKInkingTool(.pen, color: .black, width: 5)\n        canvasView.frame = view.bounds\n        canvasView.autoresizingMask = [.flexibleWidth, .flexibleHeight]\n        view.addSubview(canvasView)\n    }\n\n    func canvasViewDrawingDidChange(_ canvasView: PKCanvasView) {\n        // Drawing changed -- save or process\n    }\n}\n```\n\n### Drawing Policies\n\n| Policy | Behavior |\n|---|---|\n| `.default` | Apple Pencil draws; finger scrolls |\n| `.anyInput` | Both pencil and finger draw |\n| `.pencilOnly` | Only Apple Pencil draws; finger always scrolls |\n\n```swift\ncanvasView.drawingPolicy = .pencilOnly\n```\n\n### Configuring the Canvas\n\n```swift\n// Set a large drawing area (scrollable)\ncanvasView.contentSize = CGSize(width: 2000, height: 3000)\n\n// Enable/disable the ruler\ncanvasView.isRulerActive = true\n\n// Set the current tool programmatically\ncanvasView.tool = PKInkingTool(.pencil, color: .blue, width: 3)\ncanvasView.tool = PKEraserTool(.vector)\n```\n\n## PKToolPicker\n\n`PKToolPicker` displays a floating palette of drawing tools. The canvas\nautomatically adopts the selected tool.\n\n```swift\nclass DrawingViewController: UIViewController {\n    let canvasView = PKCanvasView()\n    let toolPicker = PKToolPicker()\n\n    override func viewDidAppear(_ animated: Bool) {\n        super.viewDidAppear(animated)\n        toolPicker.setVisible(true, forFirstResponder: canvasView)\n        toolPicker.addObserver(canvasView)\n        canvasView.becomeFirstResponder()\n    }\n}\n```\n\n### Custom Tool Picker Items\n\nCreate a tool picker with specific tools.\n\n```swift\nlet toolPicker = PKToolPicker(toolItems: [\n    PKToolPickerInkingItem(type: .pen, color: .black),\n    PKToolPickerInkingItem(type: .pencil, color: .gray),\n    PKToolPickerInkingItem(type: .marker, color: .yellow),\n    PKToolPickerEraserItem(type: .vector),\n    PKToolPickerLassoItem(),\n    PKToolPickerRulerItem()\n])\n```\n\n### Ink Types\n\n| Type | Description |\n|---|---|\n| `.pen` | Smooth, pressure-sensitive pen |\n| `.pencil` | Textured pencil with tilt shading |\n| `.marker` | Semi-transparent highlighter |\n| `.monoline` | Uniform-width pen |\n| `.fountainPen` | Variable-width calligraphy pen |\n| `.watercolor` | Blendable watercolor brush |\n| `.crayon` | Textured crayon |\n\n## PKDrawing Serialization\n\n`PKDrawing` is a value type (struct) that holds all stroke data. Serialize\nit to `Data` for persistence.\n\n```swift\n// Save\nfunc saveDrawing(_ drawing: PKDrawing) throws {\n    let data = drawing.dataRepresentation()\n    try data.write(to: fileURL)\n}\n\n// Load\nfunc loadDrawing() throws -> PKDrawing {\n    let data = try Data(contentsOf: fileURL)\n    return try PKDrawing(data: data)\n}\n```\n\n### Combining Drawings\n\n```swift\nvar drawing1 = PKDrawing()\nlet drawing2 = PKDrawing()\ndrawing1.append(drawing2)\n\n// Non-mutating\nlet combined = drawing1.appending(drawing2)\n```\n\n### Transforming Drawings\n\n```swift\nlet scaled = drawing.transformed(using: CGAffineTransform(scaleX: 2, y: 2))\nlet translated = drawing.transformed(using: CGAffineTransform(translationX: 100, y: 0))\n```\n\n## Exporting to Image\n\nGenerate a `UIImage` from a drawing.\n\n```swift\nfunc exportImage(from drawing: PKDrawing, scale: CGFloat = 2.0) -> UIImage {\n    drawing.image(from: drawing.bounds, scale: scale)\n}\n\n// Export a specific region\nlet region = CGRect(x: 0, y: 0, width: 500, height: 500)\nlet scale = UITraitCollection.current.displayScale\nlet croppedImage = drawing.image(from: region, scale: scale)\n```\n\n## Stroke Inspection\n\nAccess individual strokes, their ink, and control points.\n\n```swift\nfor stroke in drawing.strokes {\n    let ink = stroke.ink\n    print(\"Ink type: \\(ink.inkType), color: \\(ink.color)\")\n    print(\"Bounds: \\(stroke.renderBounds)\")\n\n    // Access path points\n    let path = stroke.path\n    print(\"Points: \\(path.count), created: \\(path.creationDate)\")\n\n    // Interpolate along the path\n    for point in path.interpolatedPoints(by: .distance(10)) {\n        print(\"Location: \\(point.location), force: \\(point.force)\")\n    }\n}\n```\n\n### Constructing Strokes Programmatically\n\n```swift\nlet points = [\n    PKStrokePoint(location: CGPoint(x: 0, y: 0), timeOffset: 0,\n                  size: CGSize(width: 5, height: 5), opacity: 1,\n                  force: 0.5, azimuth: 0, altitude: .pi / 2),\n    PKStrokePoint(location: CGPoint(x: 100, y: 100), timeOffset: 0.1,\n                  size: CGSize(width: 5, height: 5), opacity: 1,\n                  force: 0.5, azimuth: 0, altitude: .pi / 2)\n]\nlet path = PKStrokePath(controlPoints: points, creationDate: Date())\nlet stroke = PKStroke(ink: PKInk(.pen, color: .black), path: path,\n                      transform: .identity, mask: nil)\nlet drawing = PKDrawing(strokes: [stroke])\n```\n\n## SwiftUI Integration\n\nWrap `PKCanvasView` in a `UIViewRepresentable` for SwiftUI.\n\n```swift\nimport SwiftUI\nimport PencilKit\n\nstruct CanvasView: UIViewRepresentable {\n    @Binding var drawing: PKDrawing\n    @Binding var toolPickerVisible: Bool\n\n    func makeUIView(context: Context) -> PKCanvasView {\n        let canvas = PKCanvasView()\n        canvas.delegate = context.coordinator\n        canvas.drawingPolicy = .anyInput\n        canvas.drawing = drawing\n        return canvas\n    }\n\n    func updateUIView(_ canvas: PKCanvasView, context: Context) {\n        if canvas.drawing != drawing {\n            canvas.drawing = drawing\n        }\n        let toolPicker = context.coordinator.toolPicker\n        toolPicker.setVisible(toolPickerVisible, forFirstResponder: canvas)\n        if toolPickerVisible { canvas.becomeFirstResponder() }\n    }\n\n    func makeCoordinator() -> Coordinator { Coordinator(self) }\n\n    class Coordinator: NSObject, PKCanvasViewDelegate {\n        let parent: CanvasView\n        let toolPicker = PKToolPicker()\n\n        init(_ parent: CanvasView) {\n            self.parent = parent\n            super.init()\n        }\n\n        func canvasViewDrawingDidChange(_ canvasView: PKCanvasView) {\n            parent.drawing = canvasView.drawing\n        }\n    }\n}\n```\n\n### Usage in SwiftUI\n\n```swift\nstruct DrawingScreen: View {\n    @State private var drawing = PKDrawing()\n    @State private var showToolPicker = true\n\n    var body: some View {\n        CanvasView(drawing: $drawing, toolPickerVisible: $showToolPicker)\n            .ignoresSafeArea()\n    }\n}\n```\n\n## PaperKit Relationship\n\nPaperKit (iOS 26+) extends PencilKit with a complete markup experience\nincluding shapes, text boxes, images, stickers, and loupes. Use PaperKit\nwhen you need more than freeform drawing.\n\n| Capability | PencilKit | PaperKit |\n|---|---|---|\n| Freeform drawing | Yes | Yes |\n| Shapes & lines | No | Yes |\n| Text boxes | No | Yes |\n| Images & stickers | No | Yes |\n| Markup toolbar | No | Yes |\n| Data model | `PKDrawing` | `PaperMarkup` |\n\nPaperKit uses PencilKit under the hood -- `PaperMarkupViewController` accepts\n`PKTool` for its `drawingTool` property and `PaperMarkup` can append a\n`PKDrawing`.\n\n## Common Mistakes\n\n### DON'T: Forget to call becomeFirstResponder for the tool picker\n\nThe tool picker only appears when its associated responder is first responder.\n\n```swift\n// WRONG: Tool picker never shows\ntoolPicker.setVisible(true, forFirstResponder: canvasView)\n\n// CORRECT: Also become first responder\ntoolPicker.setVisible(true, forFirstResponder: canvasView)\ncanvasView.becomeFirstResponder()\n```\n\n### DON'T: Create multiple tool pickers for the same canvas\n\nOne `PKToolPicker` per canvas. Creating extras causes visual conflicts.\n\n```swift\n// WRONG\nfunc viewDidAppear(_ animated: Bool) {\n    let picker = PKToolPicker()  // New picker every appearance\n    picker.setVisible(true, forFirstResponder: canvasView)\n}\n\n// CORRECT: Store picker as a property\nlet toolPicker = PKToolPicker()\n```\n\n### DON'T: Ignore content version for backward compatibility\n\nNewer ink types crash on older OS versions. Set `maximumSupportedContentVersion`\nif you need backward-compatible drawings.\n\n```swift\n// WRONG: Saves a drawing with .watercolor, crashes on iOS 16\ncanvasView.tool = PKInkingTool(.watercolor, color: .blue)\n\n// CORRECT: Limit content version for compatibility\ncanvasView.maximumSupportedContentVersion = .version2\n```\n\n### DON'T: Compare drawings by data representation\n\n`PKDrawing` data is not deterministic; the same visual drawing can produce\ndifferent bytes. Use equality operators instead.\n\n```swift\n// WRONG\nif drawing1.dataRepresentation() == drawing2.dataRepresentation() { }\n\n// CORRECT\nif drawing1 == drawing2 { }\n```\n\n## Review Checklist\n\n- [ ] `PKCanvasView.drawingPolicy` set appropriately (`.default` for Pencil-primary apps)\n- [ ] `PKToolPicker` stored as a property, not recreated each appearance\n- [ ] `canvasView.becomeFirstResponder()` called to show the tool picker\n- [ ] Drawing serialized via `dataRepresentation()` and loaded via `PKDrawing(data:)`\n- [ ] `canvasViewDrawingDidChange` delegate method used to track changes\n- [ ] `maximumSupportedContentVersion` set if backward compatibility needed\n- [ ] Exported images use appropriate scale factor for the device\n- [ ] SwiftUI wrapper avoids infinite update loops by checking `drawing != binding`\n- [ ] Tool picker observer added before becoming first responder\n- [ ] Drawing bounds checked before image export (empty drawings have `.zero` bounds)\n\n## References\n\n- Extended PencilKit patterns (advanced strokes, Scribble, delegate): [references/pencilkit-patterns.md](references/pencilkit-patterns.md)\n- [PencilKit framework](https://sosumi.ai/documentation/pencilkit)\n- [PKCanvasView](https://sosumi.ai/documentation/pencilkit/pkcanvasview)\n- [PKDrawing](https://sosumi.ai/documentation/pencilkit/pkdrawing-swift.struct)\n- [PKToolPicker](https://sosumi.ai/documentation/pencilkit/pktoolpicker)\n- [PKInkingTool](https://sosumi.ai/documentation/pencilkit/pkinkingtool-swift.struct)\n- [PKStroke](https://sosumi.ai/documentation/pencilkit/pkstroke-swift.struct)\n- [Drawing with PencilKit](https://sosumi.ai/documentation/pencilkit/drawing-with-pencilkit)\n- [Configuring the PencilKit tool picker](https://sosumi.ai/documentation/pencilkit/configuring-the-pencilkit-tool-picker)","tags":["pencilkit","swift","ios","skills","dpearson2699","accessibility","agent-skills","ai-coding","apple","claude-code","codex-skills","cursor-skills"],"capabilities":["skill","source-dpearson2699","skill-pencilkit","topic-accessibility","topic-agent-skills","topic-ai-coding","topic-apple","topic-claude-code","topic-codex-skills","topic-cursor-skills","topic-ios","topic-ios-development","topic-liquid-glass","topic-localization","topic-mapkit"],"categories":["swift-ios-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/dpearson2699/swift-ios-skills/pencilkit","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add dpearson2699/swift-ios-skills","source_repo":"https://github.com/dpearson2699/swift-ios-skills","install_from":"skills.sh"}},"qualityScore":"0.684","qualityRationale":"deterministic score 0.68 from registry signals: · indexed on github topic:agent-skills · 468 github stars · SKILL.md body (11,375 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T00:53:44.061Z","embedding":null,"createdAt":"2026-04-18T22:01:10.392Z","updatedAt":"2026-04-22T00:53:44.061Z","lastSeenAt":"2026-04-22T00:53:44.061Z","tsv":"'/documentation/pencilkit)':1112 '/documentation/pencilkit/configuring-the-pencilkit-tool-picker)':1146 '/documentation/pencilkit/drawing-with-pencilkit)':1138 '/documentation/pencilkit/pkcanvasview)':1116 '/documentation/pencilkit/pkdrawing-swift.struct)':1120 '/documentation/pencilkit/pkinkingtool-swift.struct)':1128 '/documentation/pencilkit/pkstroke-swift.struct)':1132 '/documentation/pencilkit/pktoolpicker)':1124 '0':465,498,500,579,581,583,595,619 '0.1':607 '0.5':593,617 '1':591,615 '1.0':139 '10':563 '100':463,603,605 '13':132,134 '13.1':137 '16':964 '2':454,456,598,622 '2.0':483 '2000':240 '26':62,769 '3':259 '3000':242 '5':183,587,589,611,613 '500':502,504 '6.3':60 'accept':828 'access':517,542 'ad':1082 'add':2 'adopt':275 'advanc':1102 'along':554 'also':875 'altitud':596,620 'alway':222 'anim':292,295,907 'annot':20 'anyinput':176,210,685 'app':19,1021 'appear':856,915,1030 'append':837 'appl':3,28,37,149,205,218 'appropri':1015,1063 'area':235 'associ':859 'automat':274 'avail':130 'avoid':1071 'azimuth':594,618 'backward':935,951,1057 'backward-compat':950 'basic':67,70,141 'becom':876,1084 'becomefirstrespond':847 'behavior':203 'bind':666,670,1078 'black':181,323,637 'blendabl':372 'blue':257,969 'bodi':756 'bool':293,673,908 'bound':540,1088,1097 'box':780,806 'brush':374 'build':17 'byte':997 'call':846,1032 'calligraphi':369 'canva':6,229,273,680,689,692,707,893,897 'canvas.becomefirstresponder':710 'canvas.delegate':682 'canvas.drawing':686,697,699 'canvas.drawingpolicy':684 'canvasview':167,190,193,284,299,301,664,722,728,734,759,873,882,919 'canvasview.autoresizingmask':186 'canvasview.becomefirstresponder':302,883,1031 'canvasview.contentsize':237 'canvasview.delegate':173 'canvasview.drawing':737 'canvasview.drawingpolicy':175,225 'canvasview.frame':184 'canvasview.isruleractive':246 'canvasview.maximumsupportedcontentversion':976 'canvasview.tool':177,253,260,965 'canvasviewdrawingdidchang':192,733,1047 'capabl':794 'captur':23,36,148 'catalyst':136 'caus':900 'cgaffinetransform':452,461 'cgfloat':482 'cgpoint':577,601 'cgrect':496 'cgsize':238,585,609 'chang':196,1053 'check':1076,1089 'checklist':106,109,1012 'class':162,280,716 'color':180,256,322,327,332,537,636,968 'combin':427,442 'common':100,103,840 'common-mistak':102 'compar':980 'compat':936,952,975,1058 'complet':774 'configur':227,1139 'conflict':902 'construct':569 'content':63,932,972 'contentsof':420 'context':676,677,694,695 'context.coordinator':683 'context.coordinator.toolpicker':703 'control':523 'controlpoint':626 'coordin':713,714,717 'correct':874,920,970,1007 'crash':940,961 'crayon':375,377 'creat':123,307,551,886,898 'creationd':628 'croppedimag':509 'current':250 'custom':303 'data':390,394,405,417,419,425,426,817,983,986,1046 'data.write':408 'datarepresent':1041 'date':629 'default':204,1016 'deleg':1048,1105 'descript':342 'determinist':989 'devic':1068 'differ':996 'display':265 'distanc':562 'draw':5,18,45,50,195,200,207,215,220,234,270,401,428,446,474,479,645,668,687,698,700,748,760,761,793,798,953,958,981,993,1038,1077,1087,1094,1133 'drawing.bounds':487 'drawing.datarepresentation':406 'drawing.image':485,510 'drawing.strokes':529 'drawing.transformed':450,459 'drawing1':431,1009 'drawing1.append':436 'drawing1.appending':443 'drawing1.datarepresentation':1005 'drawing2':434,437,444,1010 'drawing2.datarepresentation':1006 'drawingscreen':743 'drawingtool':832 'drawingviewcontrol':163,281 'empti':1093 'enable/disable':243 'entitl':116 'entri':119 'equal':999 'everi':914 'experi':32,776 'export':78,82,466,490,1060,1092 'exportimag':477 'exporting-to-imag':81 'extend':770,1099 'extra':899 'factor':1065 'featur':21 'field':25 'fileurl':410,421 'finger':40,152,208,214,221 'first':862,877,1085 'flexibleheight':188 'flexiblewidth':187 'float':267 'forc':567,592,616 'forfirstrespond':298,706,872,881,918 'forget':844 'fountainpen':365 'framework':1109 'freeform':792,797 'func':170,191,290,399,412,476,674,690,711,732,905 'generat':469 'gray':328 'handwrit':22 'height':241,503,588,612 'highlight':359 'hold':387 'hood':826 'ident':641 'ignor':931 'ignoressafearea':764 'imag':80,84,468,781,809,1061,1091 'import':120,127,158,160,659,661 'includ':777 'individu':518 'infinit':1072 'info.plist':118 'init':726 'ink':11,339,521,531,534,633,938 'ink.color':538 'ink.inktype':536 'input':41,153 'inspect':86,89,516 'instead':1001 'integr':91,94,650 'interpol':553 'io':61,131,768,963 'ios/ipados/visionos':34 'ipado':133 'item':306 'larg':233 'let':166,283,286,315,404,416,433,441,448,457,494,505,508,530,545,573,623,630,644,679,701,720,723,909,926 'limit':971 'line':802 'load':411,1043 'loaddraw':413 'locat':565,576,600 'loop':1074 'loup':784 'mac':135 'makecoordin':712 'makeuiview':675 'manag':44 'marker':331,355 'markup':775,813 'mask':642 'maximumsupportedcontentvers':946,1054 'method':1049 'mistak':101,104,841 'model':818 'monolin':360 'multipl':887 'mutat':440 'need':789,949,1059 'never':868 'new':912 'newer':937 'nil':643 'non':439 'non-mut':438 'nsobject':718 'observ':1081 'older':942 'one':894 'opac':590,614 'oper':1000 'os':943 'overrid':169,289 'palett':268 'paperkit':95,98,765,767,786,796,821 'paperkit-relationship':97 'papermarkup':820,835 'papermarkupviewcontrol':827 'parent':721,727,730 'parent.drawing':736 'path':543,546,556,624,638,639 'path.count':550 'path.creationdate':552 'path.interpolatedpoints':560 'pattern':1101 'pen':179,321,343,348,364,370,635 'pencil':4,30,38,150,206,212,219,255,326,349,351,1019 'pencil-pow':29 'pencil-primari':1018 'pencilkit':1,14,35,55,113,121,128,159,662,771,795,823,1100,1108,1135,1141 'pencilon':216,226 'per':896 'persist':396 'pi':597,621 'picker':9,305,310,851,854,867,889,910,913,922,1037,1080,1143 'picker.setvisible':916 'pkcanvasview':43,66,69,125,140,142,168,194,285,652,678,681,693,735,1113 'pkcanvasview-bas':68 'pkcanvasview.drawingpolicy':1013 'pkcanvasviewdeleg':165,719 'pkdraw':52,73,76,378,380,402,415,424,432,435,480,646,669,749,819,839,985,1045,1117 'pkdrawing-seri':75 'pkerasertool':261 'pkink':634 'pkinkingtool':178,254,966,1125 'pkstroke':632,1129 'pkstrokepath':625 'pkstrokepoint':575,599 'pktool':829 'pktoolpick':48,71,72,263,264,288,317,725,895,911,928,1022,1121 'pktoolpickereraseritem':334 'pktoolpickerinkingitem':319,324,329 'pktoolpickerlassoitem':337 'pktoolpickerruleritem':338 'platform':129 'point':524,544,549,558,574,627 'point.force':568 'point.location':566 'polici':201,202 'power':31 'pressur':346 'pressure-sensit':345 'primari':1020 'print':533,539,548,564 'privat':746,751 'process':199 'produc':995 'programmat':252,571 'properti':833,925,1026 'recreat':1028 'refer':110,111,1098 'references/pencilkit-patterns.md':1106,1107 'region':493,495,512 'relationship':96,99,766 'render':155 'represent':984 'requir':114 'respond':860,863,878,1086 'return':422,688 'review':105,108,1011 'review-checklist':107 'ruler':245 'save':197,398,956 'savedraw':400 'scale':449,481,488,489,506,513,514,1064 'scalex':453 'scribbl':1104 'scroll':209,223 'scrollabl':236 'select':277 'self':174,715 'self.parent':729 'semi':357 'semi-transpar':356 'sensit':347 'serial':12,49,74,77,379,391,1039 'set':231,248,945,1014,1055 'setup':64,65,112 'shade':354 'shape':778,801 'show':869,1034 'showtoolpick':753,763 'signatur':24 'size':584,608 'skill' 'skill-pencilkit' 'smooth':344 'sosumi.ai':1111,1115,1119,1123,1127,1131,1137,1145 'sosumi.ai/documentation/pencilkit)':1110 'sosumi.ai/documentation/pencilkit/configuring-the-pencilkit-tool-picker)':1144 'sosumi.ai/documentation/pencilkit/drawing-with-pencilkit)':1136 'sosumi.ai/documentation/pencilkit/pkcanvasview)':1114 'sosumi.ai/documentation/pencilkit/pkdrawing-swift.struct)':1118 'sosumi.ai/documentation/pencilkit/pkinkingtool-swift.struct)':1126 'sosumi.ai/documentation/pencilkit/pkstroke-swift.struct)':1130 'sosumi.ai/documentation/pencilkit/pktoolpicker)':1122 'source-dpearson2699' 'specif':312,492 'state':745,750 'sticker':782,810 'store':921,1023 'stroke':85,88,156,389,515,519,527,570,631,647,648,1103 'stroke-inspect':87 'stroke.ink':532 'stroke.path':547 'stroke.renderbounds':541 'struct':385,663,742 'subclass':146 'super.init':731 'super.viewdidappear':294 'super.viewdidload':172 'swift':59,126,157,224,230,279,314,397,429,447,475,525,572,658,741,864,903,954,1002 'swiftui':57,90,93,649,657,660,740,1069 'swiftui-integr':92 'target':58 'text':779,805 'textur':350,376 'throw':403,414 'tilt':353 'timeoffset':582,606 'tool':8,46,251,271,278,304,309,313,850,853,866,888,1036,1079,1142 'toolbar':814 'toolitem':318 'toolpick':287,316,702,724,927 'toolpicker.addobserver':300 'toolpicker.setvisible':296,704,870,879 'toolpickervis':672,705,709,762 'topic-accessibility' 'topic-agent-skills' 'topic-ai-coding' 'topic-apple' 'topic-claude-code' 'topic-codex-skills' 'topic-cursor-skills' 'topic-ios' 'topic-ios-development' 'topic-liquid-glass' 'topic-localization' 'topic-mapkit' 'track':1052 'transform':445,640 'translat':458 'translationx':462 'transpar':358 'tri':407,418,423 'true':247,297,754,871,880,917 'type':320,325,330,335,340,341,384,535,939 'uiimag':471,484 'uikit':161 'uiscrollview':145 'uitraitcollection.current.displayscale':507 'uiviewcontrol':164,282 'uiviewrepresent':655,665 'uniform':362 'uniform-width':361 'updat':1073 'updateuiview':691 'usag':738 'use':13,15,42,451,460,785,822,998,1050,1062 'valu':383 'var':430,667,671,747,752,755 'variabl':367 'variable-width':366 'vector':262,336 'version':933,944,973 'version2':977 'via':1040,1044 'view':7,744,758 'view.addsubview':189 'view.bounds':185 'viewdidappear':291,906 'viewdidload':171 'visiono':138 'visual':901,992 'watercolor':371,373,960,967 'width':182,239,258,363,368,501,586,610 'wrap':54,651 'wrapper':1070 'wrong':865,904,955,1003 'x':497,578,602 'y':455,464,499,580,604 'yellow':333 'yes':799,800,804,808,812,816 'zero':1096","prices":[{"id":"439af0ac-4b01-4b38-b9ac-667136f3e86e","listingId":"37a96e57-b834-4cae-b5e3-14688a3183fb","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"dpearson2699","category":"swift-ios-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:01:10.392Z"}],"sources":[{"listingId":"37a96e57-b834-4cae-b5e3-14688a3183fb","source":"github","sourceId":"dpearson2699/swift-ios-skills/pencilkit","sourceUrl":"https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/pencilkit","isPrimary":false,"firstSeenAt":"2026-04-18T22:01:10.392Z","lastSeenAt":"2026-04-22T00:53:44.061Z"}],"details":{"listingId":"37a96e57-b834-4cae-b5e3-14688a3183fb","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"dpearson2699","slug":"pencilkit","github":{"repo":"dpearson2699/swift-ios-skills","stars":468,"topics":["accessibility","agent-skills","ai-coding","apple","claude-code","codex-skills","cursor-skills","ios","ios-development","liquid-glass","localization","mapkit","networking","storekit","swift","swift-concurrency","swiftdata","swiftui","widgetkit","xcode"],"license":"other","html_url":"https://github.com/dpearson2699/swift-ios-skills","pushed_at":"2026-04-21T19:26:16Z","description":"Agent Skills for iOS 26+, Swift 6.3, SwiftUI, and modern Apple frameworks","skill_md_sha":"60dd3ff465cf097c5c2fbed3ac02a05fe1055a4a","skill_md_path":"skills/pencilkit/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/dpearson2699/swift-ios-skills/tree/main/skills/pencilkit"},"layout":"multi","source":"github","category":"swift-ios-skills","frontmatter":{"name":"pencilkit","description":"Add Apple Pencil drawing, canvas views, tool pickers, and ink serialization using PencilKit. Use when building drawing apps, annotation features, handwriting capture, signature fields, or any Apple Pencil-powered experience on iOS/iPadOS/visionOS."},"skills_sh_url":"https://skills.sh/dpearson2699/swift-ios-skills/pencilkit"},"updatedAt":"2026-04-22T00:53:44.061Z"}}