2009-10-05 2 views
4

형식이 지정된 텍스트를 대지 (NSRTFPboardType)에 넣으면 모든 서식이 유지 된 채 붙여집니다. 하지만 내가 정말로 원하는 것은 무게, 색 등을 보존하면서 글꼴 및 크기 정보를 무시하는 것입니다.Cocoa : 현재 글꼴에 서식이 지정된 텍스트를 붙여 넣으시겠습니까?

문서에 따르면 글꼴 정보가없는 NSAttributedString은 Helvetica 12로 기본 설정되어 있으므로 막 다른 골목처럼.

요청시 텍스트를 생성 할 수도 있으므로 현재 UI 요소에서 글꼴을 찾을 수 있으면 텍스트가 마분지로 들어가기 전에 수정할 수 있습니다. 내게 필요한 옵션 API가 도움이되기를 기대했지만 UIElementInspector에서 찾을 수있는 속성 중 아무 것도 서식을 처리하는 것 같지 않습니다.

아이디어가 있으십니까?

다음은 테스트 사례입니다. 유일한 속성이 초록색인데도 Helvetica 12에 붙여 넣습니다 :

// Create the string with no attributes, and strip the font just in case. 
NSMutableAttributedString *s = [[[NSMutableAttributedString alloc] initWithString:@"Hello green world!"] autorelease]; 
[s removeAttribute:NSFontAttributeName range:NSMakeRange(0, [s length])]; 

// Add a test attribute 
[s addAttribute:NSForegroundColorAttributeName value:[NSColor greenColor] range:NSMakeRange(6, 5)]; 

// Generate RTF data 
NSData *rtf = [s RTFFromRange:NSMakeRange(0, [s length]) documentAttributes:nil]; 

// Copy to pasteboard 
NSPasteboard *pb = [NSPasteboard generalPasteboard]; 
[pb declareTypes:[NSArray arrayWithObject:NSRTFPboardType] owner:nil]; 
[pb setData:rtf forType:NSRTFPboardType]; 

흥미로운 점이 있습니다. 내가 가장 평범한 원시 RTF 데이터를 만들려고한다면, 글꼴 정보가 전혀 없습니다, 여전히 Helvetica 12에 붙여 넣습니다!

char *rawrtf = "{\\rtf1\\ansi\\ansicpg1252\n" 
       "Hello world.}"; 
NSData *rtf = [NSData dataWithBytes:rawrtf length:strlen(rawrtf)]; 

이렇게 가능하다면 현재 실행중인 응용 프로그램에 현재 글꼴을 쿼리하는 것만 가능합니다.

+0

'NSPasteboardTypeHTML'을 사용하여 페이스트 보드에 HTML을 추가 할 수는 있지만 목표를 달성 할 가능성이 있는지는 잘 모르겠습니다. –

+0

정말 해로운 해킹이 없다면 불가능하다고 생각하기 시작했습니다. 대부분의 앱은 HTML 형식을 허용하지 않지만 한 번만해볼 가치가 있습니다. – kvance

답변

0

NSAttributedString은 변경할 수 없습니다. 아마도 당신이 필요로하는 것은 NSMutableAttributedString입니다. This guide에는 사물을 변경하는 방법의 예가 있습니다. 새로운 NSMutableAttributedString을 NSAttributedString의 복사본으로 생성 한 다음 대지 위에 전달하기 전에 수정해야합니다.

편집 :

나는 무엇을해야할지 잘 모르겠습니다. 당신은 어떤 포맷팅을 보존하고 다른 포맷팅을 제거하기를 원한다는 것을 말하고 있는데, NSMutableAttributedString 속성을 조작하는 방법을 이해하는 것처럼 보이므로, 무엇이 문제인가? 새 속성 문자열을 작성하고 이전 글꼴을 조사한 다음 원하는 속성을 새 글꼴에 적용하십시오. 기본 글꼴이 마음에 들지 않으면 변경하십시오. 나는이 문제가 어디에 있는지 이해하지 못한다.

EDIT2 :

을 통해 글꼴 속성을 복사해야 initWithAttributedString:을 사용하여,하지만 당신은

EDIT3 원래 NSAttributedString은 심문 enumerateAttributesInRange:options:usingBlock:을 사용할 수 있어야하지 않는 경우

NSAttributedString *attrStr; 
NSRange limitRange; 
NSRange effectiveRange; 
id attributeValue; 

limitRange = NSMakeRange(0, [attrStr length]); 

while (limitRange.length > 0) { 
    attributeValue = [attrStr attribute:NSFontAttributeName 
     atIndex:limitRange.location longestEffectiveRange:&effectiveRange 
     inRange:limitRange]; 

    // apply attributeValue to the other mutable attributed string range here 

    limitRange = NSMakeRange(NSMaxRange(effectiveRange), 
     NSMaxRange(limitRange) - NSMaxRange(effectiveRange)); 
} 
+0

형식을 지정하지 않고 새 NSMutableAttributedString을 생성하고 글꼴 특성을 제거하려고했습니다. 그것은 여전히 ​​Helvetica 12로 붙여 넣습니다. – kvance

+0

[mutableAttrStr addAttribute : NSFontAttributeName value : nameOfFont range : r]는 작동해야합니다. – slf

+0

문제는 nameOfFont을 모른다는 것입니다. 사용자가 편집중인 현재 글꼴을 확인할 수 있다면 설정할 수 있습니다. 사용자가 일반적으로 내 응용 프로그램 외부에 붙여 넣을 예정이며 내 응용 프로그램 외부에서 현재 글꼴에 액세스 할 수 있는지 확실하지 않습니다. 그것이 접근성 API를 조사한 이유입니다. – kvance

0

을 복사 된 텍스트를 복사하여 사용자가 복사 한 것과 다른 내용으로 복사 및 붙여 넣기에 반대 할 수 있습니까?

+0

이 경우 사용자가 복사 한 것이 아닙니다. 사용자가 현재 글꼴로 붙여 넣으려는 내 앱에 의해 생성되는 서식있는 텍스트입니다. – kvance

+0

아, 그래. 나는 네가 지금하려는 일을 얻는다. 그럴 때는 쓰레기 쏘지. 사용자가 붙여 넣는 앱 자체는 붙여 넣은 텍스트로 원하는대로 할 수 있습니다. – pxl

1

"현재 글꼴"에 대한 시스템 전체 또는 응용 프로그램 전체 개념은 없습니다. 얻을 수있는 가장 가까운 것은 현재 활성 인 NSTextView의 타이핑 속성입니다. 활성화되어 있지 않으면 현재 글꼴과 같은 것이 없습니다.

이렇게 말하면, RTF 데이터를 페이스트 보드에 제공 할 수 있고, 요청할 때 현재 활성화 된 응용 프로그램에 AppleEvent 명령 복사를 보내고 응답을 기다리고, 리치 텍스트를 붙여 넣은 다음 리치 텍스트를 가져옵니다. 글꼴 속성.서식있는 텍스트를 사용할 수없는 경우 현재 글꼴 및 크기로 고정하십시오. 이 경험적 방법이 실제로 얼마나 잘 작동하는지 전혀 알지 못하지만 더 나은 접근법을 생각할 수는 없습니다.

내가 가장 평범한 원시 RTF 데이터를 만들 수 있다면, 글꼴 정보가 전혀 없어도 여전히 Helvetica 12에 붙여 넣을 수 있습니다!

모든 문자가 그려지 때문에 더 폰트 정보를 제공하지 돋움 12 폰트 기본값 에서 어떤 크기의 일부 폰트되어야한다. Helvetica-12는 기본적으로 선택하기에 읽기 쉽고 충분히 불쾌한 것 같았습니다.

+0

일반적으로 복사 작업이 선택없이 비워지지 않습니까? 나는이 생각으로 놀아 보겠다. 나는 그것을 좋아한다. – kvance

관련 문제