2009-06-04 4 views
2

NSAttributedString에있는 텍스트를 보유하고있는 NSTextView 컨트롤을 사용하는 코코아 앱이 있습니다 (실제로는 NSMutableAttributedString입니다). 그 문자열 안의 다른 문자 범위에서 다른 텍스트 속성 (예 : 글꼴, 밑줄 등)을 쉽게 설정하고 수정할 수 있습니다.NSAttributedString 내부 텍스트에 "숨김"속성을 설정하려면 어떻게해야합니까?

그러나 텍스트의 일부를 으로 숨기고 (CSS 속성 display: none의 효과와 유사)으로 설정하려고합니다. 외부 이벤트가 발생하면 (예 : 버튼 클릭) 문자의 특정 범위를 표시하거나 숨기려고합니다.

어쨌든 NSAttributedString으로 처리 할 수 ​​있습니까?

답변

2

또 다른 가능성은 숨기려는 텍스트에 사용자 정의 속성을 사용하는, 그리고 자신을 작성합니다 메서드를 NSAttributedString에있는 범주에서 숨김으로 표시된 텍스트를 제외하는 새 특성 문자열을 만듭니다.

- (NSAttributedString *)attributedStringWithoutHiddenText { 
    NSMutableAttributedString *result = [[[NSMutableString alloc] init] autorelease]; 
    NSRange fullRange = NSMakeRange(0, [self length]); 
    NSRange range = NSZeroRange; 
    while (NSMaxRange(range) < [self length]) { 
     NSDictionary *attributes = [self attributesAtIndex:range.location longestEffectiveRange:&range inRange:fullRange]; 
     if ([[attributes objectForKey:MyHiddenTextAttribute] boolValue]) 
      continue; 

     NSAttributedString *substring = [[NSAttributedString alloc] initWithString:[[self string] substringWithRange:range] attributes:attributes]; 
     [result appendAttributedString:substring]; 
     [substring release]; 
    } 
    return result; 
} 

주의해야 할 점은 : 나는 완전히 내 머리 위로 떨어져 쓴, 등 네 개,

이는 것을 걷어차하지, 작업, 화재에 하드 드라이브에 불을 컴파일 보장 아니에요 그리기에 적합한 문자열을 생성하지만 숨겨진 텍스트에 액세스하려면 원래 문자열이 필요합니다. 문자열의 크기에 따라 큰 메모리 오버 헤드가 될 수 있습니다.

+0

으로 설정하는 것입니다. 첫 번째 줄에는 NSMutableAttributedString이 있어야합니다. 내가 말했듯이 이것은 테스트되지 않았다 :-) – Alex

+1

당신의 솔루션과 나의 차이점을 언급해야한다. 나의 솔루션은 표시된 범위에서 공백을 남기는 반면 실제로 코드는 'MyHiddenTextAttribute'로 문자를 제거한다. –

+2

예,이 코드는 표시하기에 적합한 문자열을 만듭니다. 원래의 질문은 CSS 표시 : none 속성과 같은 것을 요구했고이 방법으로 생성 된 문자열을 그릴 때 비슷한 효과를 얻습니다. – Alex

2

NSAttributedString에 대한 보이지 않는 유형 속성이 없다는 것을 알고있는 한, NSAttributedString (또는 변경 가능한 버전이지만 서브 클래스는 만들지 만 필요하지 않을 수도 있음)을 생성하여 drawInRect를 재정의 할 수 있습니다. 속성이있는 텍스트

하지만 약간 지저분 할 수 있습니다.

4

NSAttributedString에 지원되는 속성은 AppKit의 NSAttributedString.h 헤더에 나열되어 있습니다. '숨겨진'또는 '보이는'과 같은 핵심은 없습니다. 속성 (스타일)은 HTML에서 파생되지 않으며 모든 CSS 기능을 표현할 수 없습니다.

그럼에도 불구하고, 당신이 투명 전경 색상을 설정할 수있는 문자의 범위를 숨기려면 :

NSMutableAttributedString* myString; 

[myString addAttribute:NSForegroundColorAttributeName 
       value:[NSColor clearColor] 
       range:NSMakeRange(0, 10)]; 
3

나는 이것이 매우 오래된 스레드라는 것을 알고 있지만 다른 옵션은 사용자 정의 글리프 렌더링을 수행하는 것입니다. 코드 폴딩을 다루는 WWDC 2010의 고급 텍스트 처리 기술에 관한 세션이있었습니다. 이것은 당신이 이것을 할 필요가있는 것과 비슷한 테크닉을 사용합니다. 그것은 텍스트가 숨겨진 텍스트를 검사하고 실제 문자열이 아닌 숨겨진 텍스트에 null 글리프를 렌더링하는 것입니다. 세션은 세션 114 - WWDC 2010 비디오의 고급 코코아 텍스트 팁 및 트릭입니다. Mac 개발자 프로그램 회원 인 경우 개발자 포털을 통해 다운로드 할 수 있습니다.

3

간단한 옵션은 숨겨진 텍스트의 글꼴 크기를 0

+0

'0.0'은 유효하지 않지만'NSFont.systemFont (ofSize : 0.1)'는 텍스트를 사라지게합니다. 당신은 맑은 색깔조차 필요하지 않습니다. – Jano

관련 문제