粗体,斜体使用UIFontDescriptor

时间:2015-04-19 17:53:20

标签: ios uitextview

我有一个UITextView,它有一些文字和2个按钮,用于选择短文加粗,以使其斜体

    - (IBAction)boldedSelectedText:(UIButton*)sender {
UIFontDescriptor* bodyFontDescriptor=[UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleBody];
UIFontDescriptor* boldFontdescriptor=[bodyFontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold];
self.body.font=[UIFont  fontWithDescriptor:boldFontdescriptor size:0.0];
 }
  - (IBAction)italicSelectedText:(UIButton *)sender {
UIFontDescriptor* bodyFontDescriptor=[UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleBody];
UIFontDescriptor* italicFontdescriptor=[bodyFontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic];
self.body.font=[UIFont  fontWithDescriptor:italicFontdescriptor size:0.0];
}

问题是,当我选择一个文本并使其粗体然后斜体时,它只变为斜体和副 它不能大胆和斜体同时我不知道为什么?

2 个答案:

答案 0 :(得分:2)

您需要先检索现有的符号特征,然后添加新的特征。 我使用辅助方法来添加/删除我的特征,

-(void) addOrRemoveFontTraitWithName:(NSString*)traitName andValue:(uint32_t)traitValue
{
    NSMutableDictionary *attributes;
    NSRange selectedRange=[self.attributedTextview selectedRange];
    if (selectedRange.length == 0)
    {
        //no text selected
        attributes=[[NSMutableDictionary alloc] initWithDictionary:self.attributedTextview.typingAttributes];
    }
    else
    {
        attributes=[[NSMutableDictionary alloc] initWithDictionary:[self.attributedTextview.textStorage attributesAtIndex:selectedRange.location effectiveRange:nil]];
    }

    UIFont *currentFont=[attributes objectForKey:NSFontAttributeName];
    UIFontDescriptor *fontDescriptor=[currentFont fontDescriptor];
    NSString *fontNameAttribute=[[fontDescriptor fontAttributes] objectForKey:UIFontDescriptorNameAttribute];
    UIFontDescriptor *changedFontDescriptor;
    if ([fontNameAttribute containsString:traitName])
    {
        uint32_t existingTraitsWithNewTrait=[fontDescriptor symbolicTraits] | traitValue;
        changedFontDescriptor=[fontDescriptor fontDescriptorWithSymbolicTraits:existingTraitsWithNewTrait];
    }
    else
    {
        uint32_t existingTraitsWithoutTrait=[fontDescriptor symbolicTraits] & ~traitValue;
        changedFontDescriptor=[fontDescriptor fontDescriptorWithSymbolicTraits:existingTraitsWithoutTrait];
    }
    UIFont *updatedFont=[UIFont fontWithDescriptor:changedFontDescriptor size:0.0];

    [attributes setObject:updatedFont forKey:NSFontAttributeName];

    if (selectedRange.length != 0)
    {
        [self.attributedTextview.textStorage beginEditing];
        [self.attributedTextview.textStorage setAttributes:attributes range:selectedRange];
        [self.attributedTextview.textStorage endEditing];
    }

    [self.attributedTextview setTypingAttributes:attributes];
}

如果用户选择了某些文本,则该特征将应用于该特定选择,否则将应用于textview的typingAttributes属性。 添加/删除特征需要按位操作。

本文详细介绍了这一主题,非常值得一读 Using Text Kit to Manage and Draw Text in IOS Apps

此致

答案 1 :(得分:0)

它是粗体,然后是斜体,因为你要求粗体然后斜体。电脑无法读懂你的想法;它正在做你正在告诉它做的事情。如果你想要粗体和斜体,你必须要求粗体斜体。当您说fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBoldUIFontDescriptorTraitItalic时,您只提供一个特征。如果你想要两个特征,提供两个特征。