가 사용자 정의 텍스트 잘림을 수행 할 때 그것에 대해 조금 회담 WWDC 2013 비디오가있다. 기본적으로 당신은 그것은 나에게 너무 많은 사실 이것에 대한 코드를 마련하기 위해 애 쓰고 걸린 NSLayoutManagerDelegate 방법을 layoutManager: shouldGenerateGlyphs: properties: characterIndexes: font: forGlyphRange:
을 구현하지만, 여기 hideNotes
-(NSUInteger)layoutManager:(NSLayoutManager *)layoutManager shouldGenerateGlyphs:(const CGGlyph *)glyphs
properties:(const NSGlyphProperty *)props characterIndexes:(const NSUInteger *)charIndexes
font:(UIFont *)aFont forGlyphRange:(NSRange)glyphRange {
if (self.hideNotes) {
NSGlyphProperty *properties = malloc(sizeof(NSGlyphProperty) * glyphRange.length);
for (int i = 0; i < glyphRange.length; i++) {
NSUInteger glyphIndex = glyphRange.location + i;
NSDictionary *charAttributes = [_textStorage attributesAtIndex:glyphIndex effectiveRange:NULL];
if ([[charAttributes objectForKey:CSNoteAttribute] isEqualToNumber:@YES]) {
properties[i] = NSGlyphPropertyNull;
} else {
properties[i] = props[i];
}
}
[layoutManager setGlyphs:glyphs properties:properties characterIndexes:charIndexes font:aFont forGlyphRange:glyphRange];
return glyphRange.length;
}
[layoutManager setGlyphs:glyphs properties:props characterIndexes:charIndexes font:aFont forGlyphRange:glyphRange];
return glyphRange.length;
}
NSLayoutManager 방법 setGlyphs: properties: characterIndexes: font: forGlyphRange:
기본 구현에서 호출되는 속성을 기준으로 내 구현입니다 기본적으로 모든 작업을 수행합니다. 반환 값은 실제로 생성 할 글리프 수입니다. 반환 값이 0이면 레이아웃 관리자에게 기본 구현을 수행하므로 전달되는 글리프 범위의 길이를 반환합니다. 메서드의 주요 부분은 모든 문자를 통과합니다. 텍스트 스토리지 및 특정 속성이있는 경우 관련 속성을 레이아웃 관리자에게 표시하지 않도록 NSGlyphPropertyNull로 설정합니다. 그렇지 않으면 속성을 전달 된 항목으로 설정합니다.
더 좋은 방법은 없지만 attributesAtIndex의 위험은 없습니다. 글리프가 1 : 1을 문자로 매핑하지 않으면 예상되는 값을 제공하지 않습니까? – griotspeak
글리프와 문자 인덱스가 일치하지 않게하려면 glyphIndex가 "glyphRange.location + i"대신 "charIndexes [i]"여야한다고 생각합니다. 또한 glyphIndex는 characterIndex로 이름을 바꿀 수 있습니다. – user965972