-
PencilKit으로 획 사이에 숨은 뜻 파악하기
Freeform과 메모 같은 Apple 앱과 동일한 강력한 기술을 사용하여 앱에서 손글씨 인식 기능을 활용하세요. 다양한 알파벳과 언어에서 손글씨 인식 기능을 사용하는 방법을 알아보고, PencilKit을 더 다양한 앱에 통합할 수 있는 새로운 기능을 살펴보세요.
챕터
- 0:00 - Introduction
- 3:25 - Handwriting recognition
- 8:38 - Path conversion
- 10:21 - Improved model access
- 11:25 - Stroke slicing
- 13:48 - Next steps
리소스
- Controlling stroke rendering for animation and editing
- Recognizing handwriting and converting it to text
- Building a handwriting recognition experience with PencilKit
- PencilKit
관련 비디오
WWDC26
WWDC25
WWDC20
-
비디오 검색…
환영합니다! 저는 드로잉 기능을 담당하는 엔지니어 Yichen입니다 이 세션에서는 PencilKit의 흥미로운 새 API를 소개할게요 앱에 필기 인식 기능을 추가할 수 있는 API예요 드로잉 모델에 대한 향상된 접근 방식과 함께 흥미로운 활용 사례를 열어줍니다 Apple Pencil로 iPad에 쓰는 건 펜으로 종이에 쓰는 것만큼 자연스러워요 하지만 종이와 달리 필기 내용이 검색 가능하고 인식할 수 있으며 인터랙티브하게 변합니다 PencilKit은 자유로운 드로잉을 지원하는 핵심 프레임워크로 Apple 플랫폼에서 사용됩니다 저지연 캔버스와 다양한 잉크를 제공하고 Apple Pencil을 완전 지원하며 기본 데이터 모델에 접근할 수 있어요 iOS 26에서 PaperKit이 도입됐으며 PencilKit을 기반으로 구축됩니다 Apple의 드로잉 경험을 시스템 전반에 걸쳐 구동합니다 이 세션에서 다루는 새로운 PencilKit API는 모두 사용 가능하며 PaperKit에서도 사용할 수 있습니다 자세한 내용은 "Meet PaperKit" 영상을 확인해 보세요 WWDC25에서 공개된 영상과 WWDC26의 "Unwrap PaperKit" 영상도 참고해 보세요 Apple 플랫폼은 세계 최고 수준의 필기 인식 기능을 갖추고 있어요 다양한 기능을 구동하는 모습을 보셨을 거예요 Freeform과 Notes에서 필기 검색 기능이 그 예입니다 PencilKit에서 가장 많이 요청된 기능 중 하나가 바로 필기 인식이에요 이제 iOS에서 iPadOS, macOS, visionOS 27에서 사용할 수 있습니다 PencilKit의 필기 인식 API부터 시작할게요 필기를 인식된 텍스트로 변환하는 방법을 보여드릴게요
다음으로 변환을 위한 새로운 변환 API를 살펴볼 거예요 PencilKit 스트로크 경로와 표준 베지어 경로 간 변환이에요 그런 다음 드로잉 모델의 개선 사항을 살펴볼게요 스트로크 ID와 선택 항목 접근 등이 포함됩니다
마지막으로 새로운 스트로크 슬라이싱 API를 소개할게요 스트로크에서 세그먼트를 분리하거나 추출할 수 있는 API입니다 iOS 27의 PencilKit으로 아들을 위해 학습 앱을 만들었는데요 중국어와 영어 쓰기를 함께 배울 수 있는 앱입니다 앱에서 두 언어로 단어 쓰기를 연습하고 결과에 대한 피드백을 받을 수 있어요 앱에는 영어 단어를 보여주는 플래시 카드가 있어요 연습하기 위해 중국어 번역을 써볼게요 지금은 영어로 "Heart"가 표시되고 있어요 그래서 중국어로 "心"을 써야 합니다 앱은 이제 필기 인식을 사용해서 단어를 완성하기 전에 현재 작업을 확인할 수 있어요
Check 버튼이 흔들려서 답이 틀렸음을 알려줍니다
이번에는 앱이 제 필기를 중국어 "心"으로 인식했고 프롬프트와 일치하여 앱이 정답임을 확인해줬어요 훌륭해요!! 이게 바로 PencilKit의 필기 인식 API가 할 수 있는 거예요
필기 인식의 핵심부터 시작해볼게요 PKStrokeRecognizer는 Swift Actor이므로 설계상 스레드 안전합니다 인식에 시간이 걸리기 때문에 모든 메서드는 비동기입니다 세 가지 주요 기능이 있으며 이 기능들이 함께 필기 인식 경험을 제공해요 앱에 폭넓게 유용하게 쓰일 거예요 하나씩 살펴볼게요 첫 번째 기능은 인식된 텍스트입니다 작성된 내용에 대해 가장 가능성 높은 단일 결과를 반환합니다
기본적으로 PKStrokeRecognizer는 기기 언어를 사용해서 필기를 해석하는 방법을 결정해요 preferredLanguages를 명시적으로 설정할 수도 있어요 앱의 언어 컨텍스트에 맞추기 위해서요
전체 드로잉을 한 번에 인식할 수도 있고 특정 strokeID 하위 집합을 전달할 수도 있습니다 인식된 텍스트가 실제로 작동하는 걸 보여주기 위해 연습 화면으로 이동할게요
여기에 원하는 걸 쓰면 PencilKit이 인식할 거예요
멋지네요! Hello WWDC.
iOS 27부터 PKStrokeRecognizer는 29개 언어를 지원합니다 지원되는 언어 목록은 확인할 수 있으며 PKStrokeRecognizer의 supportedLanguages 속성으로 접근해요 Simulator의 필기 인식은 일부 언어만 지원한다는 점에 주의하세요 라틴 문자를 사용하는 언어만요 PencilKit의 필기 인식은 완전히 기기에서 실행됩니다 인식 모델은 오프라인이며 운영 체제에 포함되어 있어요 필기 인식은 빠르며 iOS 27이 지원하는 모든 기기에서 작동합니다 다음 API는 인덱싱 가능한 콘텐츠입니다 전체 드로잉 내용을 나타내는 단일 문자열을 제공합니다
Spotlight 검색과 같은 기능에 특히 유용합니다
여러 언어가 활성화되면 인덱싱 가능한 콘텐츠에 결과가 둘 이상의 언어로 포함될 수 있어요 필기가 모호할 때는 가능한 모든 해석이 필요하며 인덱스에 포함되어야 해요 사용자가 어떤 검색어를 입력하든 콘텐츠를 찾을 수 있게요 "1"인가요, 소문자 "l"인가요? "101"인가요, "lol"인가요? 인식된 텍스트는 최선의 답 하나를 제공하지만 인덱싱 가능한 콘텐츠는 모든 후보를 이어붙여 제공합니다 인덱싱 가능한 콘텐츠를 디스크에 저장할 때 인식 결과가 기반 모델 업데이트에 따라 점차 개선될 수 있어요
PKStrokeRecognizer는 recognizerVersion 속성을 제공합니다 indexedContent와 함께 저장하고 다시 불러올 때 현재 버전과 비교해서 재인덱싱 여부를 결정하세요
또한 PKStrokeRecognizer 호출을 조절하는 것도 고려해 보세요
모든 스트로크마다 결과를 업데이트하면 전력을 더 많이 사용할 수 있어요 인덱싱 기능을 제공하는 데 필요한 것보다 더요 세 번째 API는 텍스트 검색용입니다
대상 문자열이 주어지면 검색 결과 배열을 반환하며 해당 단어가 드로잉의 어디에 나타날지를 나타내요
모든 후보를 고려해서요
이것이 인터랙티브 검색을 구동하며 일치하는 스트로크 주위에 하이라이트가 표시됩니다
search()는 UIFindInteraction과도 자연스럽게 연동되며
시스템 찾기 및 바꾸기 경험이에요
UIFindInteractionDelegate를 구현하고 내부에서 search()로 구동하면
결과 탐색이 완비된 시스템 검색 UI를 얻을 수 있어요 하이라이팅까지 갖춘 드로잉 캔버스를 바로 사용할 수 있어요 플래시 카드로 돌아가서 검색 기능이 어떻게 플래시 카드 매칭을 구동하는지 보여드릴게요
SearchResults에서 반환된 경계의 시각화를 추가했어요
이제 검색이 일치한 위치를 보여주는 박스가 생겼어요
이 기능들은 손글씨 콘텐츠를 더욱 접근하기 쉽게 만들어줍니다 VoiceOver를 연결해서 필기를 소리 내어 읽게 할 수 있으며 스크린 리더에 의존하는 사람들이 필기에 접근할 수 있게 해줍니다 검색 기능은 보조 기능이 특정 단어를 찾고 이동할 수 있게 해주며 드로잉 내에서요 함께, 접근성 격차를 해소하는 데 도움이 됩니다 손글씨와 타이핑된 텍스트 사이의 다음: 경로 변환입니다 경로 변환은 강력한 API 집합으로 PencilKit을 앱에 적용하는 데 도움이 됩니다
PencilKit은 스트로크 경로를 3차 균일 B-스플라인으로 표현합니다 PencilKit이 경로를 저장하는 방법에 대한 자세한 내용은 "Inspect, modify, and construct PencilKit drawings" WWDC20 영상을 참고하세요
B-스플라인은 드로잉에 탁월한 표현 방식이지만 베지어 경로보다는 덜 일반적입니다 iOS 27에서 PKStrokePath는 두 형식 간 변환을 지원합니다
경로를 변환할 때 PencilKit이 지오메트리를 처리합니다 베지어 경로는 크기, 불투명도, 압력 등 PencilKit 속성을 담지 않아요 따라서 각 제어점에 대해 직접 제공해야 합니다
PKStrokePath에서 시작해서 베지어 경로로 변환했다가 되돌리면 동일한 제어점 위치가 유지되며 PencilKit 스트로크를 베지어 기반 형식으로 저장하고 품질 손실 없이 복원할 수 있습니다 앱에 베지어 경로로 저장된 스트로크가 있는 자체 캔버스가 있다면 이제 PKStrokePaths로 변환할 수 있고 PKDrawing을 빌드하고 PKStrokeRecognizer에 전달할 수 있어요 이로써 필기 인식이 모든 캔버스와 호환 가능해집니다 PKCanvasView뿐만 아니라요
PencilKit을 사용할 수 있는 범위를 확장하는 것 외에도 iOS 27은 핵심 기능을 추가하여 모델에 더 깊이 접근할 수 있게 했어요 이 유연성은 앱에서 더 많은 맞춤형 활용 사례를 지원합니다
PKStroke와 PKStrokePath 모두 Identifiable 프로토콜을 준수하게 됐어요 안정적인 UUID이므로 변환, 편집에 걸쳐 스트로크를 추적할 수 있고 실행 취소 작업에서도 마찬가지예요
안정적인 ID가 있으면 이제 선택 상태를 제어할 수 있으며 PKCanvasView에서요
canvasViewSelectionDidChange라는 새로운 델리게이트 메서드도 있으며 사용자의 선택이 변경될 때마다 실행됩니다 특정 잉크를 빠르게 함께 그리면 PencilKit은 해당 스트로크를 합성하여 동일한 renderGroupID를 사용해서 잉크가 아직 젖어 있는 것처럼 처리해요 iOS 27에서는 이를 직접 제어할 수 있어요 마지막 새 API 집합은 스트로크를 슬라이싱할 수 있는 기능을 제공하며 두 가지 방식으로 가능합니다 프로그래밍 방식 지우기와 서브스트로크 추출이에요 PencilKit의 데이터 모델로 작업해보셨다면 스트로크 마스크에 이미 익숙하실 거예요 PencilKit은 부분 지우기를 마스크로 표현합니다 픽셀 지우개가 스트로크 일부를 제거하면 남아 있는 보이는 부분이 마스크로 정의됩니다 iOS 27부터는 그 동일한 작업을 프로그래밍 방식으로 적용할 수 있어요 지우개로 PKStrokePath를 제공하면 됩니다
드로잉을 가르며 단일 스트로크를 슬라이싱해서 여러 독립적인 스트로크로 각자의 마스크를 갖춘 채로 사용자가 캔버스에서 지우개 도구를 사용한 것처럼요
한 가지 주의할 점: 복잡한 드로잉에서 슬라이싱은 비용이 클 수 있어요
드로잉에 스트로크가 많다면 성능에 주의하고 백그라운드 스레드에서 지우기를 처리하는 것을 고려하세요 UI를 차단하지 않도록요
지우기로 스트로크를 시각적으로 자르면 서브스트로크 추출로 섹션을 효율적으로 얻을 수 있으며 새로운 스트로크나 경로로요
iOS 27부터 PKStroke와 PKStrokePath 모두 서브스크립트 접근을 지원하며 경로를 따라 어디서든 파라메트릭 범위로 접근할 수 있어요 슬라이스가 시작하고 끝나는 위치를 정밀하게 제어할 수 있습니다
PencilKit 잉크에는 연필 텍스처 파티클과 같은 기능이 있으며 전체 스트로크를 기준으로 위치가 결정됩니다
서브스트로크를 가져올 때 PencilKit은 해당 파티클의 일관성을 유지합니다 한자에서는 스트로크를 쓰는 순서가 중요합니다 순서가 올바른지 확인하기 위해 서브스트로크를 사용하는 기능을 만들었어요 단어를 쓴 방식을 재생하기 위해서요
PencilKit은 Metal로 렌더링을 구현하며 애니메이션을 부드럽게 만드는 최적화를 포함합니다
이 강력한 API를 최대한 활용하려면 PKStrokeRecognizer를 채택해서 앱에 필기 인식을 추가해 보세요
새로운 곳에서 PencilKit을 사용해서 기존 베지어 경로를 변환하고 PKStrokePaths로 변환하여 필기 인식의 장점을 활용하세요 PKCanvasView 없이도요 PencilKit 모델에 깊이 들어가 안정적인 ID로 스트로크를 추적하고 선택 변경에 응답하며 새로운 수준의 맞춤형 경험을 만들어 보세요 마지막으로 스트로크 슬라이싱을 활용해 보세요 프로그래밍 방식 지우기로 드로잉을 가르고 서브스트로크로 부드러운 애니메이션을 만들어 보세요
이 API들은 각각 간단하게 통합할 수 있어요 함께 사용하면 전에는 불가능했던 앱 기능을 가능하게 합니다
데모용 샘플 코드는 이 영상 리소스에서 확인할 수 있어요 필기가 인식되고 검색 가능하며 인터랙티브해집니다 앱 어디에서나요 iOS 27의 PencilKit이었습니다 시청해 주셔서 감사합니다!
-
-
3:53 - Recognized text
import PencilKit let recognizer = PKStrokeRecognizer() await recognizer.updateDrawing(drawing) myLabel.text = await recognizer.recognizedText() -
5:22 - Indexable content
import PencilKit let recognizer = PKStrokeRecognizer() await recognizer.updateDrawing(drawing) if let indexedContent = await recognizer.indexableContent { index(text: indexedContent) } -
6:58 - Find text
import PencilKit let recognizer = PKStrokeRecognizer() await recognizer.updateDrawing(drawing) let results = await recognizer.search("apple") for result in results { highlight(bounds: result.bounds) }
-
-
- 0:00 - Introduction
Meet the PencilKit APIs behind handwriting in Notes and Freeform, now available to your apps in iOS 27.
- 3:25 - Handwriting recognition
Use the stroke recognizer API for on-device text recognition, indexing, search, and accessibility.
- 8:38 - Path conversion
Converting PKStrokePath to and from Bézier paths without losing fidelity, so apps that store strokes as Bézier can build PKDrawings and use handwriting recognition on any canvas, not just PKCanvasView.
- 10:21 - Improved model access
Deeper access to the drawing model in iOS 27 — stable Identifiable stroke IDs that survive edits and undo, controllable canvas selection with a change delegate, and adjustable wet-ink render groups.
- 11:25 - Stroke slicing
Two ways to slice strokes — programmatic erasing that cuts one stroke into independent strokes, and substroke extraction with parametric ranges — along with performance considerations for complex drawings.
- 13:48 - Next steps
Ways to put these APIs to work: adopt PKStrokeRecognizer for handwriting recognition, convert existing Bézier paths, track strokes with stable identity, and use stroke slicing for erasing and animation.