2016-09-10 11 views
1

사용자 지정 NSTextStorage 하위 클래스에서 그림 이모티크 문제가 있습니다. 클래스는 전달 된 속성을 저장하지 않습니다. 대신 자체 생성 :사용자 지정 NSTextStorage : 이모티콘이 기본적으로 표시되지 않습니다.

override func attributesAtIndex(location: Int, effectiveRange range: NSRangePointer) -> [String : AnyObject] { 
    if range != nil { 
     range.memory = NSMakeRange(0, self.string.length) 
    } 

    let attributes = [ 
     NSFontAttributeName: NSFont.systemFontOfSize(14) 
    ] 

    return attributes 
} 

override func setAttributes(attrs: [String : AnyObject]?, range: NSRange) { 
    // does nothing 
} 

대부분 잘 작동합니다. 그러나 문자열에 그림이 있으면 단순히 나타나지 않습니다. NSTextView가 텍스트 저장소에하는 호출을 검사 할 때, 텍스트보기는 이모티콘 범위의 글꼴 특성이 나타날 때마다 AppleColorEmoji 글꼴로 설정하려고 시도합니다. 텍스트 뷰를 "속성 진리"의 소스로 사용하는 경우에는 괜찮습니다. 그러나 프로그램이 그런 식으로 작동하는 것을 원하지 않습니다. 필자의 경우 텍스트 저장 장치는 모든 특성의 유일한 공급 업체 여야합니다. 텍스트보기가 속성별로 보내는 모든 것을들을 수 없습니다.

내 문자열에서 이모티콘을 수동으로 감지하고 AppleColorEmoji 글꼴을 수동으로 설정해야합니까? 아니면 더 좋은 방법이 있습니까? 이미 대체 글꼴을 사용하고 누락 된 문자가 포함 된 글꼴을 자동 검색하려고 시도했지만 이모티콘은 이러한 방법으로는 다루지 않습니다.

답변

2

알아 냈어. 간단히 말해, 속성이 부여 된 문자열 (결과적으로 텍스트 저장소)은 프레젠테이션을 위해 속성을 정리하기 위해 편집 후 fixAttributesInRange(range: NSRange)을 호출합니다. 필요한 경우 이모티콘 글꼴을 추가합니다. fixAttributesInRangesetAttributes(attrs: [String : AnyObject]?, range: NSRange)을 호출하여 이러한 추가 속성을 커밋합니다. 즉, attributesAtIndex(location: Int, effectiveRange range: NSRangePointer)에서 로컬로 구성된 사전을 판매 할 수 없다는 것을 의미합니다. 이러한 고정 된 특성을 추적해야하거나 특정 상황에서 문자열이 깨지게됩니다.

불행히도 setAttributes은 무시하고 싶은 텍스트보기에서 속성을받습니다.

override func fixAttributesInRange(range: NSRange) { 
    self.isFixingAttributes = true 
    super.fixAttributesInRange(range) 
    self.isFixingAttributes = false 
} 

을 ... 그리고 setAttributesisFixingAttributes 플래그를 검사 : 다행히도,이 작업을 수행하여이 문제를 쉽게 얻을. 그렇게하면 "고정 된"속성 만 텍스트 저장소에 기록되고 외부에서 들어오는 속성은 기록되지 않습니다.