ASEditableTextNode

ASEditableTextNode는 UIKit에서 제공해주는 UITextViewUITextField를 사용하듯이 사용할 수 있는 Node입니다.

UITextViewwrapping되어 있으며 ASTextKitComponents 를 통해서 glyph에 따른 노드의 사이즈를 렌더링합니다.

let node = ASEditableTextNode()
let textView: UITextView = node.textView
let view: UIView = node.view
// view와 textView는 동일하지 않습니다. 

사용법

Basic initialization

기본적으로 아래와 같이 기본 attributedText와 textContainerInset를 지정하여 사용할 수 있습니다.

let node = ASEditableTextNode()

node.attributedText = NSAttributedString(string: "안녕하세요.")
node.attributedPlaceholderText = NSAttributedString(string: "입력해주세요.")
node.textContainerInset = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)

가장 기본적인 사용방법이며 내부적으로는 ASTextKitComponents를 이용하여 초기화합니다.

let textKitComponents = ASTextKitComponents(attributedSeedString: nil,
                                            textContainerSize: CGSize.zero)
let placeholderComponents = ASTextKitComponents(attributedSeedString: nil, 
                                                textContainerSize: CGSize.zero)                                            
let node = ASEditableTextNode.init(textKitComponents: textKitComponents,
                                   placeholderTextKitComponents: placeholderComponent)

Advanced initialization

필요에 따라서 custom NSTextLayoutManager 및 NSTextStorage를 이용하여 초기화해야하는 경우도 있는데 이러한 경우는 아래의 코드와 같이 ASTextKitComponents를 사용해서 Initialization하는 방법이 있습니다.

let textStorage = NSTextStorage.init()
let manager = NSTextLayoutManager.init()
        
let textKitComponents: ASTextKitComponents =
            .init(textStorage: textStorage,
                  textContainerSize: .zero,
                  layoutManager: manager)
        
let placeholderTextKit: ASTextKitComponents =
            .init(attributedSeedString: NSAttributedString(string: "insert:"),
                  textContainerSize: .zero)
        
let node = ASEditableTextNode.init(textKitComponents: textKitComponents,
                                   placeholderTextKitComponents: placeholderTextKit)

Typing Attribute

타이핑하는데 있어서 어트리뷰트를 지정하기 위해선 typingAttributes에 원하는 값을 지정하면 됩니다.

editableTextNode.typingAttributes = [NSForegroundColorAttributeName: UIColor.blue, 
                                      NSBackgroundColorAttributeName: UIColor.red]

ASEditableTextNode Delegate

UITextViewDelegate와 마찬가지로 ASEditableTextNode도 유사한 Delegate를 제공해줍니다.

let node = ASEditableTextNode()
node.delegate = self

shouldEditing

editing가능 여부에 대한 제어 메서드로 제어 가능 여부를 Boolean값으로 반환합니다.

func editableTextNodeShouldBeginEditing(_ editableTextNode: ASEditableTextNode) -> Bool

didBeginEditing

editing 시작이후에 대한 이벤트를 받습니다.

func editableTextNodeDidBeginEditing(_ editableTextNode: ASEditableTextNode)

didFinishEditing

editing이 끝난 이후에 대한 이벤트를 받습니다.

func editableTextNodeDidFinishEditing(_ editableTextNode: ASEditableTextNode)

shouldChangeText

Text변화에 대한 이벤트를 받습니다.

추가 또는 제거되는 text(replacementText)와 영역(shouldChangeTextIn range)를 받습니다.

func editableTextNode(_ editableTextNode: ASEditableTextNode, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool

didChangeSelection

TextView상 커서의 위치 및 selection의 변화에 대한 이벤트를 받습니다.

func editableTextNodeDidChangeSelection(_ editableTextNode: ASEditableTextNode, fromSelectedRange: NSRange, toSelectedRange: NSRange, dueToEditing: Bool)

didUpdateText

shouldChangeText이후 업데이트 결과가 끝났을 때에 대한 이벤트를 받습니다.

func editableTextNodeDidUpdateText(_ editableTextNode: ASEditableTextNode)

ASEditableTextNode의 변화에 따라 상위 노드의 사이즈에 변화를 주기 위해선 setNeedsLayout을 호출하면됩니다.

func editableTextNodeDidUpdateText(_ editableTextNode: ASEditaleTextNode) {
    editableTextNode.supernode?.setNeedsLayout()
}

이외 유용한 프로퍼티와 메서드들

UITextView에서 제공해주는 기본 property와 동일하게 사용합니다.

다음 내역은 ASEditableTextNode에서만 제공해주는 편의용 기능들 입니다.

Last updated