Я работаю с атрибутами textStorage UITextView
. У меня есть строка и массив объектов моего класса TextFormattingElement
. Экземпляр этого класса состоит из NSRange
(на котором этот элемент должен быть применен в тексте) и некоторые параметры форматирования:Подчеркнутый текст - толщина линии в пересекающихся диапазонах с разными размерами шрифтов
@interface TextFormattingElement : NSObject
@property (nonatomic) NSRange range;
@property (nonatomic, strong) NSString *fontName; //e.g. @"TimesNewRomanPSMT"
@property (nonatomic) int fontSize;
@property (nonatomic, strong) UIColor *fontColor;
@property (nonatomic) BOOL isBold;
@property (nonatomic) BOOL isItalic;
@property (nonatomic) BOOL isUnderlined;
@property (nonatomic) BOOL isStriked;
@end
Теперь я цикл через этот массив и последовательно применять эти элементы к textStorage из TextView. Я использую этот метод:
-(void)setFontWithName:(NSString*)name AndSize:(float)fontSize AndTextColor:(UIColor*)textColor AndIsBold:(BOOL)isBold AndIsItalic:(BOOL)isItalic AndIsUnderlined:(BOOL)isUnderLined andIsStriked:(BOOL)isStriked ToRange:(NSRange)rangeToSet{
__block UIFont *font = [UIFont fontWithName:name size:fontSize];
__block UIFontDescriptor *fontDescriptor = [font fontDescriptor];
[textView.textStorage enumerateAttributesInRange:rangeToSet options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:^(NSDictionary *attrs, NSRange range, BOOL *stop) {
NSParagraphStyle *paragraphStyle = [attrs objectForKey:NSParagraphStyleAttributeName];
NSMutableDictionary *attributesToSetDict = [NSMutableDictionary dictionary];
[attributesToSetDict setObject:paragraphStyle forKey:NSParagraphStyleAttributeName]; //i need to clear all attributes at this range exсept NSParagraphStyleAttributeName
if(isBold){
uint32_t existingTraitsWithNewTrait = [fontDescriptor symbolicTraits] | UIFontDescriptorTraitBold;
fontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits:existingTraitsWithNewTrait];
}
if(isItalic){
uint32_t existingTraitsWithNewTrait = [fontDescriptor symbolicTraits] | UIFontDescriptorTraitItalic;
fontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits:existingTraitsWithNewTrait];
}
font = [UIFont fontWithDescriptor:fontDescriptor size:fontSize];
[attributesToSetDict setObject:font forKey:NSFontAttributeName];
[attributesToSetDict setObject:textColor forKey:NSForegroundColorAttributeName];
if(isUnderLined){
[attributesToSetDict setObject:@1 forKey:NSUnderlineStyleAttributeName];
}
if(isStriked){
//TODO: isStriked
}
[textView.textStorage setAttributes:attributesToSetDict range:range];
}];
}
меня есть одна проблема: если у меня есть два TextFormattingElement
экземпляры с диапазонами пересечения (например NSMakeRange(9,28)
и NSMakeRange(26,7)
) толщина подчеркивание всегда имеет значение, зависящее от размера шрифта последнего элемента. Иллюстрацией этого вы можете увидеть на этом скриншоте:
Параметры моих 2-х элементов форматирования являются:
первый: место = 9, длина = 28, Fontname = TimesNewRomanPSMT, FONTSIZE = 15, FontColor = UIDeviceRGBColorSpace 1 0 0 1, isBold = 0, isItalic = 0, isUnderlined = 1, isStriked = 0
второе: место = 26, длина = 7, FontName = TimesNewRomanPSMT, FontSize = 25, FontColor = UIDeviceRGBColo rSpace 0 0 1 1, isBold = 1, isItalic = 0, isUnderlined = 1, isStriked = 0
Но я хочу, чтобы получить такой эффект, как в Google Docs:
Как я могу делать это с помощью TextKit?
Спасибо! Я также начал работать в этом направлении, но имел проблему с поиском формулы для подчеркивания толщины и подчеркивания отступа от персонажей. Теперь с вашим ответом я знаю, как это сделать с помощью Core Text. Большое спасибо вам тысячи раз !!! – xexe
@xexe Добро пожаловать. – Emmanuel