View in English

  • 메뉴 열기 메뉴 닫기
  • Apple Developer
검색
검색 닫기
  • Apple Developer
  • 뉴스
  • 둘러보기
  • 디자인
  • 개발
  • 배포
  • 지원
  • 계정
페이지에서만 검색

빠른 링크

5 빠른 링크

비디오

메뉴 열기 메뉴 닫기
  • 컬렉션
  • 주제
  • 전체 비디오
  • 소개

WWDC25 컬렉션으로 돌아가기

  • 소개
  • 요약
  • 자막 전문
  • 코드
  • 글쓰기 도구에 대해 자세히 알아보기

    글쓰기 도구를 사용하면 앱 내에서 직접 텍스트를 교정하고, 재작성하며, 변환할 수 있습니다. 글쓰기 도구을 앱에 맞춰 사용자 정의하는 고급 기술을 알아보세요. 서식 지정 옵션을 살펴보고 해당 옵션을 리치 텍스트 편집에 적용하는 방법을 살펴보세요. 맞춤형 텍스트 엔진을 사용하는 경우, 텍스트 뷰 내에서 직접 편집할 수 있도록 전체 글쓰기 도구 경험을 원활하게 통합하는 방법을 확인할 수 있습니다.

    챕터

    • 0:00 - 서론
    • 0:46 - 새로운 기능
    • 2:21 - 기본 텍스트 뷰 맞춤화
    • 4:00 - 리치 텍스트 포맷
    • 7:41 - 맞춤형 텍스트 엔진
    • 16:58 - 다음 단계

    리소스

    • Enhancing your custom text engine with Writing Tools
    • Writing Tools
      • HD 비디오
      • SD 비디오

    관련 비디오

    WWDC24

    • 글쓰기 도구 시작하기
  • 비디오 검색…

    안녕하세요, “글쓰기 도구에 대해 자세히 살펴보기” 세션입니다 저는 Dong Yuan이며 텍스트 입력 및 국제화 업무를 담당하고 있습니다 작년에 글쓰기 도구를 소개하고 앱에 통합하는 방법을 소개했죠 오늘은 한 단계 더 나아가 고급 주제를 살펴보겠습니다 글쓰기 도구의 새로운 사항을 보고 기본 텍스트 보기에서 글쓰기 도구 경험 맞춤화 방법 글쓰기 도구가 리치 텍스트와

    원활하게 작동하도록 하는 방법 마지막으로 앱에 맞춤형

    텍스트 엔진이 있는 경우 전체 글쓰기 도구 경험을 통합하는 방법을 살펴봅니다 그럼 시작하겠습니다! 글쓰기 도구로 텍스트 보기에서 바로 텍스트를 고쳐 쓰고 교정하고 요약하여 글을 다듬을 수 있는데요 올해 글쓰기 도구에 새로운 기능이 여럿 추가되었습니다 ChatGPT 통합을 통해 작성하고 싶은 사항을 콘텐츠로 생성하거나 간단한 프롬프트로 이미지를 만들 수 있습니다

    visionOS에서도 글쓰기 도구가 사용 가능합니다 이메일, 메모, 사용자 제작 앱 등 대부분에서 작동합니다

    iOS, iPadOS, macOS 26의 새 기능으로 텍스트 고쳐 쓰기 변경 사항 설명 후 후속 요청

    입력이 가능한데 텍스트에 따뜻한 느낌, 대화체 느낌 격려 느낌 등을 요청하는 거죠

    또한 실행 도구가 단축어로 제공되므로 Apple Intelligence로 작업 흐름의 수준을 높일 수 있습니다 교정, 고쳐 쓰기 요약과 같은 도구를 자동 방식으로 사용 가능합니다

    앱 지원 글쓰기 도구에 유용한 다양한 API도 추가되었습니다 이제 기본 도구 모음 버튼과 표준 메뉴 항목이 생겼습니다 글쓰기 도구에 리치 텍스트의 표시 인텐트 반환을 요청하거나 글쓰기 도구 코디네이터를 맞춤 텍스트 엔진에 통합 가능합니다 새로운 결과 옵션과 코디네이터 API는 나중에 살펴보겠습니다

    다음으로 시스템에서 제공되는 글쓰기 도구의 기본 텍스트 보기를 맞춤화하는 방법을 보겠습니다

    작년 글쓰기 도구 비디오에서는 기본 내용을 다루었죠 기본 텍스트 보기에서는 글쓰기 도구 지원이 무료입니다 동기화 일시 정지처럼 글쓰기 도구의 작업에 반응하는 데 라이프 사이클 방법을 활용할 수 있고 텍스트 보기를 맞춤화해 제한적/전체 글쓰기 도구 행동을 사용할 수 있습니다 글쓰기 도구의 수정을 원하지 않는 범위도 지정 가능합니다 결과 옵션으로 리치 텍스트 목록, 표 지원을 관리 가능하죠 작년 세션에서는 결과 옵션의 명칭이 “AllowedInputOptions" 이었음에 유의하세요 명확성을 위해 이름이 "WritingToolsResultOptions”으로 변경되었습니다

    글쓰기 도구는 텍스트 선택 시 사용할 수 있지만 앱에 텍스트가 많으면 메모와 이메일에서처럼 도구 모음 버튼을 추가해 보세요

    UIKit의 UIBarButtonItem이나 AppKit의 NSToolbarItem이면 되죠

    빠른 메뉴에서는 글쓰기 도구 항목이 자동 삽입되는데 맞춤형 메뉴 구현이 있거나 글쓰기 도구 항목을 이동하려면 automaticallyInsertsWritingToolsItems를 false로 설정하고 writingToolsItems API를 사용해 표준 항목을 얻을 수 있습니다 올해는 메뉴의 교정, 고쳐 쓰기 및 요약 옵션이 업데이트되었습니다 API를 사용해 업데이트를 모두 무료로 받을 수 있습니다

    이제 서식 지정을 볼까요

    앱은 각종 텍스트 보기가 있고 Finder의 검색 필드처럼 리치 텍스트를 지원하지 않거나 텍스트 편집처럼 리치 텍스트를 지원합니다

    어떤 텍스트 보기는 메모처럼 의미 스타일을 지원합니다 머리말, 부머리말, 블록 인용 등 다양한 의미 스타일로 문단을 지정할 수 있습니다 예를 들어 메모에서는 글쓰기 도구의 결과가 기본 메모, 머리말, 표 목록을 활용할 수 있습니다 텍스트 보기에서 지원하는 텍스트 종류는 글쓰기 도구 결과 옵션으로 글쓰기 도구에 알립니다 일반 텍스트 보기의 경우 plainText 결과 옵션을 사용합니다 글쓰기 도구는 여전히 NSAttributedString으로 텍스트 보기와 통신하지만 내부의 모든 속성은 무시해도 됩니다 텍스트 편집에처럼 리치 텍스트 필드의 경우 richText 결과 옵션을 사용합니다 텍스트 필드가 목록 또는 표를 지원하는지 여부에 따라 목록 및 표 옵션을 포함하거나 포함하지 않을 수 있습니다 글쓰기 도구는 속성 문자열에 볼드체, 이탤릭체처럼 표시 속성을 추가할 수 있습니다

    메모와 같은 의미 형식에 대한 전문적인 이해가 있는 앱은 새 presentationIntent 옵션 등 richText 옵션을 사용합니다 글쓰기 도구는 표시 인텐트 포함 NSAttributedString으로 텍스트 보기와 통신합니다

    표시 속성과 표시 인텐트의 차이점이 무엇인지 궁금하실 수 있을 텐데요

    텍스트 편집의 예에서 글쓰기 도구는 볼드체 또는 이탤릭체 같은 표시 속성으로 리치 텍스트를 생성하고 속성 문자열을 텍스트 보기로 보냅니다 이러한 속성은 구체적인 글꼴 크기 같은 스타일 정보만 포함하고 의미 스타일 정보는 포함하지 않습니다 반면 메모는 헤더 같은 기본 의미 스타일을 최대 활용하죠 글쓰기 도구에서 아래에 동일한 텍스트를 생성했지만 우리는 속성이 지정된 문자열에 표시 인텐트를 추가합니다 메모는 표시 인텐트를 내부 의미 스타일로 변환합니다 이 예에서 헤더 부분은 구체적인 글꼴 속성이 없는 헤더 인텐트일 뿐입니다

    결과 옵션에 표시 인텐트가 지정되어 있어도 글쓰기 도구는 속성 지정 문자열에 표시 속성을 추가합니다 일부 스타일은 표시 인텐트에 의해 표현될 수 없기 때문이죠 이 예에서 글쓰기 도구는 강조 표시 인텐트와 취소선 표시 속성을 사용해 “crucial and deleted" 텍스트를 스크린샷처럼 표시합니다

    요약하면 표시 인텐트 모드에서 기존에 표시 인텐트 형태로 불가능했던 스타일을 제공합니다 목록, 표, 코드 블록 같은 요소이며

    표시 속성은 밑줄, 아래 첨자, 위 첨자에 계속 사용할 수 있습니다 마지막으로 표시 인텐트에는 기본 스타일이 없습니다 표시 인텐트를 표시 속성이나 자체 내부 스타일로 변환하는 작업은 앱에서 담당합니다

    표시 인텐트 옵션을 도입한 후 글쓰기 앱에서 텍스트의 의미를 더 효과적으로 이해하도록 하려면 가능할 때마다 텍스트 보기의 requestContexts 메서드를 덮어쓰고 표시 인텐트로 컨텍스트를 제공할 수 있습니다

    마지막으로 완전한 맞춤형 텍스트 엔진이 있는 경우에도 문제없습니다!

    기본적인 글쓰기 도구 경험을 무료로 이용할 수 있습니다 단 텍스트 엔진이 일반 텍스트 편집 프로토콜을 채택해야 하죠 iOS에서는 UITextInteraction 또는 UITextSelectionDisplayInteraction과 UIEditMenuInteraction를 함께 사용합니다 macOS에서는 보기가 NSServicesMenuRequestor를 채택해야 합니다 이렇게 하면 TextView 글쓰기 도구를 사용할 수 있고 서비스 메뉴 기능이 지원됩니다 기본 채택에 대한 내용은 WWDC24 세션을 확인하세요

    한 단계 더 나아가고 싶다면 전체 글쓰기 도구 경험을 구현할 수 있습니다 그러면 글쓰기 도구가 바로 텍스트 고쳐 쓰기, 애니메이션 제공, 줄에 바로 교정 변경 사항 표시가 가능합니다 올해 맞춤형 텍스트 엔진용 글쓰기 도구 코디네이터 API가 추가되었습니다

    글쓰기 도구 코디네이터는 필드와 글쓰기 도구 사이의 상호작용을 관리합니다

    사용자는 코디네이터를 보기에 연결하고 WritingToolsCoordinatorDelegate 메서드를 구현할 대리자를 만듭니다 대리자는 글쓰기 도구가 작업할 컨텍스트를 준비하고 변경 사항을 통합하고 애니메이션 중에 사용할 미리보기 객체를 제공하고 글쓰기 도구가 교정 표시를 그릴 좌표를 제공하고 상태 변경에 반응합니다 모두 직접 보실 수 있도록 간단한 데모로 설명드리겠습니다

    TextKit 2로 빌드한 맞춤형 텍스트 엔진이 있습니다 보시다시피 NSTextInputClient 및 NSServicesMenuRequestor와 같은 일반적인 텍스트 편집 프로토콜을 이미 구현했고요

    앱을 빌드하고 실행하면 기본 글쓰기 도구 지원이 무료입니다 모든 결과는 패널에 표시됩니다 예를 들어 내용을 고쳐 쓰고

    결과를 바꾸거나 복사하는 거죠

    이제 전체 글쓰기 도구 지원을 구현해 보겠습니다

    DocumentView에서 글쓰기 도구 세션 중에 필요한 일부 인스턴스 속성을 추가하려고 합니다 NSWritingToolsCoordinator 객체를 초기화합니다

    대리자를 자신으로 설정하고

    NSView에 할당합니다 `init`에서 명칭을 `configureWritingTools`로 지정하고요

    당연히 DocumentView가 `NSWritingToolsCoordinator.Delegate`를 준수하지 않는다는 메시지가 표시됩니다

    DocumentView 확장 프로그램에서 모든 대리자 메서드를 구현하는 파일을 드래그해 놓겠습니다 컨텍스트를 준비하고 텍스트

    바꾸기와 선택을 수행하고 교정용 바운딩 박스를 반환하고

    애니메이션 미리보기를 생성하죠

    앱을 빌드하고 실행해 볼까요

    텍스트를 고쳐 쓰면

    애니메이션과 텍스트 변경 사항이 텍스트 보기에서 직접 일어납니다

    교정을 하면 글쓰기 도구가 밑줄을 추가합니다

    개별 제안을 클릭하여 변경된 내용을 볼 수도 있습니다

    이제 각 단계에 대해 더 자세히 살펴보겠습니다

    가장 먼저 코디네이터를 만들어 보기에 연결해야 합니다 글쓰기 도구 코디네이터는 UIKit의 UIInteraction이며 이것을 다른 UIInteraction처럼 UIView에 연결합니다 AppKit에서는 NSView의 인스턴스 속성입니다 코디네이터가 있으면 선호하는 글쓰기 도구 동작 및 결과 옵션을 설정 가능합니다

    이제 대리자 메서드를 살펴보죠 글쓰기 도구에는 우선 현재 텍스트의 컨텍스트가 필요합니다 컨텍스트는 NSAttributedString 형태의 텍스트와 선택 범위로 구성됩니다 속성 문자열에는 최소한 현재 텍스트 선택이 포함되어야 합니다 선택 사항으로 선택 앞뒤의 문단을 포함할 수도 있습니다 이로써 글쓰기 도구가 텍스트에 대한 컨텍스트를 더 잘 이해할 수 있습니다 context.attributedString을 기준으로 현재 선택된 내용으로 범위를 설정합니다 선택된 내용이 없으면 전체 문서를 컨텍스트로 반환하고 범위를 커서 위치로 설정합니다 이러면 사용자가 구체적으로 선택한 내용이 없을 때도 글쓰기 도구가 전체 문서에 대해 작업할 수 있습니다 이렇게 컨텍스트를 제공합니다 AppKit이 표시되어 있는데 특별히 언급하지 않는 한 UIWritingToolsCoordinator 및 NSWritingToolsCoordinator는 동일한 방식으로 행동한다고 보시면 됩니다 대리자 메서드는 비동기식인데 대규모 텍스트 필드는 기본 텍스트 저장소 처리에 오래 걸릴 수 있기 때문입니다 함수 본문에서 “scope” 매개변수에 따라 텍스트와 범위를 준비합니다 대부분 하나의 컨텍스트만 반환하면 됩니다 동시에 여러 텍스트 저장소의 텍스트를 선택할 수 있는 정교한 텍스트 보기의 경우 코디네이터는 다중 컨텍스트 또한 지원합니다

    글쓰기 도구는 보기의 텍스트를 평가한 후 제안된 변경 사항을 대리자 객체에 전달합니다 이 텍스트 대체 대리자 메서드에서 변경 사항을 보기의 텍스트 저장소에 통합합니다 글쓰기 도구는 각각의 고유한 변경 사항에 대해 이 메서드를 호출하며 동일한 컨텍스트 객체에 대해 다양한 범위 값으로 메서드를 여러 번 호출할 수 있습니다 처리가 완료되면 글쓰기 도구는 선택된 텍스트 범위 업데이트를 대리자에게 요청할 수 있습니다

    글쓰기 도구에서 처리하는 동안 텍스트를 애니메이션화하기 위해 코디네이터가 특정 텍스트 범위의 미리보기 이미지를 요청하죠

    텍스트 보기는 투명 배경 텍스트 렌더링으로 미리보기를 반환하고 애니메이션 중에 글쓰기 도구는 텍스트 자체가 아니라 제공된 미리보기 이미지에 시각적 효과를 적용합니다 macOS에서는 두 대리자 메서드로 이 작업이 수행됩니다 첫 번째 대리자 메서드는 배열을 받습니다 사용자는 전체 범위에 최소 미리보기 하나를 반환해야 하죠 부드러운 애니메이션을 위해 미리보기를 줄당 하나씩 반환하죠

    iOS에서는 UIKit이 NSTextPreview 대신 UITargetedPreview를 사용해 하나의 대리자 메서드만 사용됩니다

    실제 애니메이션화 전후에 글쓰기 도구는 prepareFor와 finish 메서드를 호출합니다 텍스트 애니메이션 준비를 위해 텍스트 필드에서 특정 텍스트 범위를 숨깁니다 애니메이션화가 끝나면 해당 텍스트 범위를 다시 표시합니다

    교정을 위해 글쓰기 도구는 변경된 텍스트 범위에 밑줄을 표시합니다 글쓰기 도구는 또한 텍스트 범위의 클릭 이벤트에 응답하여 인라인 교정 팝업을 표시합니다

    교정 표시를 표시하기 위해 코디네이터가 대리자에게 개별 범위의 기본 베지어 경로를 반환하도록 요청합니다 글쓰기 도구에는 클릭 또는 탭 이벤트에 응답하기 위한 바운딩 베지어 경로도 필요하죠

    마지막으로 선택 사항인 writingToolsCoordinator:willChangeToState:completion: 메서드를 구현하여 상태 변화에 응답할 수 있습니다 텍스트 필드 구현에 따라 통합 취소, 동기화 중지 또는 편집 방지를 수행해야 할 수 있습니다 반대로 updateRange:withText를 통해 코디네이터에게 외부 변경 사항에 대해 알려야 합니다 그래야 글쓰기 도구의 작업이 최신 텍스트와 동기화됩니다 updateForReflowedText를 사용해 보기의 레이아웃 변경 사항에 대해 글쓰기 도구에 알립니다 이 메서드를 호출하면 글쓰기 도구는 새 미리보기, 교정 표시 및 기타 레이아웃 의존 정보를 요청합니다

    전체 글쓰기 도구 경험을 강력한 맞춤형 텍스트 엔진과 통합하는 방법을 알아보았습니다 앞서 보여 드린 프로젝트는 샘플 코드로 공개되어 있습니다 자세한 내용은 샘플 코드와 글쓰기 도구의 코디네터에 대한 전체 문서를 확인하시기 바랍니다

    이로써 세션을 마무리하겠습니다 다음 단계는 무엇일까요? 새 글쓰기 도구 기능 사용이죠 변경 사항을 설명한 다음 후속 조정하는 기능도 있고 Vision Pro 및 단축어 앱 내 글쓰기 도구도 있습니다

    앱에 텍스트가 많으면 도구 모음 버튼을 추가하세요

    서식 지정 옵션을 활용하면 머리말, 부머리말, 코드 블록 같은 의미 스타일을 글쓰기 도구에서 읽고 쓸 수 있습니다

    이미 강력한 텍스트 엔진이 있다면 전체 글쓰기 도구 경험으로 엔진을 더 강화하세요

    글쓰기 도구의 코디네이터가 실제 어떻게 작동하는지 보려면 아래 링크된 작년 글쓰기 도구 시작하기 세션과 글쓰기 도구의 샘플 코드를 확인하세요 시청해 주셔서 감사합니다!

    • 11:46 - Attach a coordinator to the view (UIKit)

      // Attach a coordinator to the view
      // UIKit
      
      func configureWritingTools() {
          guard UIWritingToolsCoordinator.isWritingToolsAvailable else { return }
      
          let coordinator = UIWritingToolsCoordinator(delegate: self)
          addInteraction(coordinator)
      }
    • 12:02 - Attach a coordinator to the view (AppKit)

      // Attach a coordinator to the view
      // AppKit
      
      func configureWritingTools() {
          guard NSWritingToolsCoordinator.isWritingToolsAvailable else { return }
             
          let coordinator = NSWritingToolsCoordinator(delegate: self)
      
          coordinator.preferredBehavior = .complete
          coordinator.preferredResultOptions = [.richText, .list]
          writingToolsCoordinator = coordinator
      }
    • 13:06 - Prepare the context

      // Prepare the context
      
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              requestsContextsFor scope: NSWritingToolsCoordinator.ContextScope,
              completion: @escaping ([NSWritingToolsCoordinator.Context]) -> Void) {
      
          var contexts = [NSWritingToolsCoordinator.Context]()
                      
          switch scope {
          case .userSelection:
              let context = getContextObjectForSelection()
              contexts.append(context)
              break
              // other cases…
          }
              
          // Save references to the contexts for later delegate calls.
          storeContexts(contexts)
          completion(contexts)
      }
    • 13:48 - Respond to text changes from Writing Tools and update selected range

      // Respond to text changes from Writing Tools
      
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              replace range: NSRange,
              in context: NSWritingToolsCoordinator.Context,
              proposedText replacementText: NSAttributedString,
              reason: NSWritingToolsCoordinator.TextReplacementReason,
              animationParameters: NSWritingToolsCoordinator.AnimationParameters?,
              completion: @escaping (NSAttributedString?) -> Void) {
      }
      
      // Update selected range
      
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              select ranges: [NSValue],
              in context: NSWritingToolsCoordinator.Context,
              completion: @escaping () -> Void) {
      }
    • 14:41 - Generate preview for animation (AppKit)

      // Generate preview for animation (macOS)
      
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              requestsPreviewFor textAnimation: NSWritingToolsCoordinator.TextAnimation,
              of range: NSRange,
              in context: NSWritingToolsCoordinator.Context,
              completion: @escaping ([NSTextPreview]?) -> Void) {
      }
          
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              requestsPreviewFor rect: NSRect,
              in context: NSWritingToolsCoordinator.Context,
              completion: @escaping (NSTextPreview?) -> Void) {
      }
    • 14:58 - Generate preview for animation (UIKit)

      // Generate preview for animation (iOS)
      
      func writingToolsCoordinator(_ writingToolsCoordinator: UIWritingToolsCoordinator,
              requestsPreviewFor textAnimation: UIWritingToolsCoordinator.TextAnimation,
              of range: NSRange,
              in context: UIWritingToolsCoordinator.Context,
              completion: @escaping (UITargetedPreview?) -> Void) {
      }
    • 15:08 - Delegate callbacks before and after animation

      // Generate preview for animation
      
      func writingToolsCoordinator(
          _ writingToolsCoordinator: NSWritingToolsCoordinator,
          prepareFor textAnimation: NSWritingToolsCoordinator.TextAnimation,
          for range: NSRange,
          in context: NSWritingToolsCoordinator.Context,
          completion: @escaping () -> Void) {
      
          // Hide the specific range of text from the text view
      }
      
      func writingToolsCoordinator(
          _ writingToolsCoordinator: NSWritingToolsCoordinator,
          finish textAnimation: NSWritingToolsCoordinator.TextAnimation,
          for range: NSRange,
          in context: NSWritingToolsCoordinator.Context,
          completion: @escaping () -> Void) {
      
          // Show the specific range of text again
      }
    • 15:39 - Delegate callbacks to show proofreading marks

      // Create proofreading marks
      
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              requestsUnderlinePathsFor range: NSRange,
              in context: NSWritingToolsCoordinator.Context,
              completion: @escaping ([NSBezierPath]) -> Void) {
      }
      
      func writingToolsCoordinator(_ writingToolsCoordinator: NSWritingToolsCoordinator,
              requestsBoundingBezierPathsFor range: NSRange,
              in context: NSWritingToolsCoordinator.Context,
              completion: @escaping ([NSBezierPath]) -> Void) {
      }
    • 0:00 - 서론
    • 이 영상에서는 글쓰기 도구의 새로운 기능을 살펴보고, 앱의 환경을 사용자 지정하는 방법, 리치 텍스트를 지원하는 방법, 이를 사용자 정의 텍스트 엔진에 통합하는 방법을 알아봅니다.

    • 0:46 - 새로운 기능
    • 글쓰기 도구는 이제 ChatGPT, visionOS, 톤 조정을 위한 후속 요청, 단축어를 사용한 자동화와의 통합을 지원합니다. 글쓰기 도구는 또한 앱에 통합하는 데 도움이 되는 새로운 API를 제공합니다.

    • 2:21 - 기본 텍스트 뷰 맞춤화
    • 앱에서 기본 텍스트 뷰를 사용하는 경우, 글쓰기 도구 지원을 무료로 받을 수 있습니다. 그뿐만 아니라, 동기화 일시 중지, 텍스트 내에서 무시되는 범위 지정, 툴바 버튼 제공 또는 빠른 메뉴 사용자 지정과 같은 작업에 반응하는 수명 주기 메서드를 채택하여 경험을 더욱 구체적으로 사용자 지정할 수 있습니다.

    • 4:00 - 리치 텍스트 포맷
    • 이제 글쓰기 도구에서 의미 스타일을 적용한 리치 텍스트를 지원합니다. 앱이 제목, 부제목, 인용문, 표, 목록 등의 프레젠테이션 의도를 지원하는 경우, 해당 정보를 글쓰기 도구에 전달할 수 있습니다. 글쓰기 도구는 가능한 경우 앱에서 지원하는 프레젠테이션 의도의 스타일을 사용하여 결과를 제공합니다.

    • 7:41 - 맞춤형 텍스트 엔진
    • 앱에서 사용자 정의 텍스트 엔진을 사용하는 경우, 이제 글쓰기 도구와 완벽하게 통합된 환경을 활성화할 수 있습니다. 일반적인 텍스트 편집 프로토콜을 채택하는 경우, 기본적인 글쓰기 도구 환경은 자동으로 작동합니다. 글쓰기 도구의 전체 경험을 통해 글쓰기 도구는 텍스트를 바로 다시 쓰고, 애니메이션을 제공하며, 교정된 변경 사항을 인라인으로 표시할 수 있습니다. 전체적인 경험을 위해 새로운 글쓰기 도구 코디네이터 API를 사용하여 사용자 정의 텍스트 엔진에 통합하세요.

    • 16:58 - 다음 단계
    • 앱에서 새로운 글쓰기 도구 기능을 살펴보고 사용자 정의 및 리치 텍스트 지원을 활용하세요. 사용자 정의 텍스트 엔진이 있는 경우, 코디네이터 API를 채택하여 전체 글쓰기 도구 환경을 활성화하세요.

Developer Footer

  • 비디오
  • WWDC25
  • 글쓰기 도구에 대해 자세히 알아보기
  • 메뉴 열기 메뉴 닫기
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    메뉴 열기 메뉴 닫기
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    메뉴 열기 메뉴 닫기
    • 손쉬운 사용
    • 액세서리
    • 앱 확장 프로그램
    • App Store
    • 오디오 및 비디오(영문)
    • 증강 현실
    • 디자인
    • 배포
    • 교육
    • 서체(영문)
    • 게임
    • 건강 및 피트니스
    • 앱 내 구입
    • 현지화
    • 지도 및 위치
    • 머신 러닝 및 AI
    • 오픈 소스(영문)
    • 보안
    • Safari 및 웹(영문)
    메뉴 열기 메뉴 닫기
    • 문서(영문)
    • 튜토리얼
    • 다운로드(영문)
    • 포럼(영문)
    • 비디오
    메뉴 열기 메뉴 닫기
    • 지원 문서
    • 문의하기
    • 버그 보고
    • 시스템 상태(영문)
    메뉴 열기 메뉴 닫기
    • Apple Developer
    • App Store Connect
    • 인증서, 식별자 및 프로파일(영문)
    • 피드백 지원
    메뉴 열기 메뉴 닫기
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(영문)
    • News Partner Program(영문)
    • Video Partner Program(영문)
    • Security Bounty Program(영문)
    • Security Research Device Program(영문)
    메뉴 열기 메뉴 닫기
    • Apple과의 만남
    • Apple Developer Center
    • App Store 어워드(영문)
    • Apple 디자인 어워드
    • Apple Developer Academy(영문)
    • WWDC
    Apple Developer 앱 받기
    Copyright © 2025 Apple Inc. 모든 권리 보유.
    약관 개인정보 처리방침 계약 및 지침