2009-10-05 4 views
4

Когда я вставляю форматированный текст в картон (NSRTFPboardType), он вставляет все сохраненные форматирования. Но мне бы очень хотелось сбросить информацию о шрифте и размере, сохраняя вес, цвет и т. Д.Какао: вставка форматированного текста в текущем шрифте?

Согласно документам, NSAttributedString без информации о шрифте по умолчанию будет использовать Helvetica 12, как тупик.

Я также могу сгенерировать текст по требованию, поэтому, если бы я мог узнать шрифт в текущем элементе пользовательского интерфейса, я мог бы изменить текст до его ввода в картон. Я надеялся, что 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

Вы можете попробовать добавить HTML в картотеку с помощью 'NSPasteboardTypeHTML', но я не совсем уверен, есть ли какая-либо возможность достичь вашей цели. –

+0

Я начинаю подозревать, что это невозможно без какого-либо особо неприятного взлома. Большинство приложений, вероятно, не будут принимать HTML-формат, но это может стоить того. – kvance

ответ

0

NSAttributedString является неизменным. Я думаю, что, возможно, вам нужен NSMutableAttributedString. This guide имеет пример того, как изменить ситуацию. Вы должны создать новую NSMutableAttributedString в качестве копии NSAttributedString, а затем внести свои изменения в нее, прежде чем передавать ее на картотеку.

EDIT:

Я не совсем уверен, что вы, что делать. Вы говорите, что хотите сохранить некоторое форматирование и удалить другое форматирование, и кажется, что вы понимаете, как манипулировать атрибутами NSMutableAttributedString, так что в чем проблема? Создайте новую атрибутированную строку, опросите старый и примените любые атрибуты, которые вы хотите к новому, если вам не нравится шрифт по умолчанию, измените его. Я не понимаю, в чем проблема.

EDIT2:

Использование initWithAttributedString: должны скопировать свойства шрифта более, но если это не вы должны быть в состоянии использовать enumerateAttributesInRange:options:usingBlock: опрашивать свой оригинальный NSAttributedString

EDIT3:

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 значение: nameOfFont range: r] должно работать – slf

+0

Проблема в том, что я не знаю nameOfFont. Если бы я мог определить текущий шрифт для редактирования пользователем, я мог бы установить его. Пользователь обычно будет вставлен вне моего приложения, и я не уверен, что можно получить доступ к текущему шрифту за пределами моего собственного приложения. Вот почему я изучал API доступности. – kvance

0

изменение скопированного текста, чтобы он отличался от того, что пользователь скопировал, будет против идеи копирования и вставки, нет?

+0

В этом случае это не то, что пользователь скопировал. Это форматированный текст, который создается моим приложением, которое пользователь хотел бы вставить в текущем шрифте. – kvance

+0

ах, хорошо. Я получаю то, что вы намереваетесь сделать сейчас. в этом случае это дерьмовая стрельба. приложение, в которое вставляется ваш пользователь, может делать все, что захочет, с вложенным текстом. – pxl

1

Общесистемного или даже общесистемного понятия «текущий шрифт» отсутствует. Ближе всего вы можете получить атрибуты ввода текущего активного NSTextView; если ни один не активен, то нет ничего похожего на текущий шрифт.

Сказав это, вы можете пообещать данные RTF на картоне, и когда он его попросит, отправьте текущему активному приложению копию команды AppleEvent, дождитесь ответа, вытащите любой богатый текст из картона и захватите его атрибуты шрифта.Если нет богатого текста, используйте текущий шрифт и размер. Я понятия не имею, насколько хорошо эта эвристика работает на практике, но я не могу придумать лучшего подхода.

Если я попытаюсь сгенерировать самые простые сырые данные RTF, я могу с абсолютно никакой информацией о шрифте, это все еще пасты в Helvetica 12!

шрифта по умолчанию Helvetica-12, когда нет шрифта не поставляются, потому что весь текст втягивания должно быть в некоторых шрифта в некоторые размера. Helvetica-12 должен казаться читаемым и достаточно безобидным, чтобы быть выбранным по умолчанию. (Sure beats Comic Sans-72!)

+0

Не будет ли операция копирования обычно пустой без выбора? Я буду играть с этой идеей, хотя мне это нравится. – kvance

Смежные вопросы