iOS: полужирный шрифт и курсив на одном и том же слове

Фон. Я пытался отобразить предложение жирным и курсивным шрифтом, а также обычным шрифтом.

Вопрос: как я могу отобразить что-то вроде этого "Здравствуйте, меня зовут Байт". Обратите внимание, что Byte выделен жирным шрифтом и курсивом, в то время как другие слова остаются обычными.

Я пытался: я думаю, что coreText должен уметь что-то делать, просто я не смог найти правильный способ сделать это. Я также использовал TTTAttributeLabel и не могу сделать его жирным и курсивным. У меня Три20 загрузился, только не знаю какой и чем пользоваться. Webview не работает с моим фоном.


Ответ Карлесу Эстевадеордалю:

UIWebView *webView = [[UIWebView alloc]initWithFrame:CGRectMake(10, 360, 300, 40)];
[webView setBackgroundColor: [UIColor clearColor]];
[webView loadHTMLString:[NSString stringWithFormat:@"<html><body style=\"background-color: transparent;\">Hello, my name is <b><i>Byte</b></i></body></html>"] baseURL:nil];
[self.view addSubview:webView];

Это именно тот код, который я использовал. Он отображал белый фон.


person Byte    schedule 09.04.2012    source источник
comment
Я считаю, что вы можете использовать CTFFontDescriptors для основного текста, чтобы получить желаемый эффект. developer.apple.com/library/ios /#documentation/Carbon/Reference/ Я не уверен в деталях того, как это работает.   -  person Joel    schedule 09.04.2012
comment
TTTAttributeLabel определенно может быть как полужирным, так и курсивным.   -  person Alastair Stuart    schedule 10.04.2012
comment
@AlastairStuart У вас есть пример, потому что я потратил немало времени, пытаясь понять TTTAttributeLabel, и ничего не придумал.   -  person Byte    schedule 10.04.2012


Ответы (5)


После хорошего ночного сна я нашел способ сделать это с помощью TTTAtributedlabel. Вот как:

TTTAttributedLabel *attLabel = [[TTTAttributedLabel alloc]initWithFrame:CGRectMake(x, y, xx, yy)];
NSString *text = @"Hello, my name is Byte";

[attLabel setText:text afterInheritingLabelAttributesAndConfiguringWithBlock:^(NSMutableAttributedString *mutableAttributedString) {

    //font helvetica with bold and italic 
    UIFont *boldSystemFont = [UIFont fontWithName:@"Helvetica-BoldOblique" size:10];

    CTFontRef font = CTFontCreateWithName((__bridge CFStringRef)boldSystemFont.fontName, boldSystemFont.pointSize, NULL);

    NSRange boldRange = [[mutableAttributedString string] rangeOfString:@"Byte" options:NSCaseInsensitiveSearch];
    [mutableAttributedString addAttribute:(NSString *)kCTFontAttributeName value:(__bridge id)font range:boldRange];

    CFRelease(font);

    return mutableAttributedString;
}];

У меня до сих пор нет способа добавить 2 атрибута (то есть: полужирный и курсив отдельно) в одно и то же слово/букву. Но это помогает.

person Byte    schedule 10.04.2012
comment
Эта библиотека намного лучше, чем использование uiwebview, если вы просто хотите выделить жирным шрифтом и курсивом! - person Carles Estevadeordal; 12.04.2012
comment
Вы забываете выпускать объекты? - person user4951; 31.01.2013
comment
в автоматическом подсчете ссылок? - person Byte; 04.02.2013
comment
@Byte Несмотря на ARC, вы все равно должны освободить созданный вами объект CTFont. Пример: CFRelease(font) - person lobianco; 05.05.2013

Если вы все еще заинтересованы в решении CoreText для этой проблемы:

newFont = CTFontCreateCopyWithSymbolicTraits(fontRef,
                                             self.textSize,
                                             NULL,
                                             kCTFontBoldTrait | kCTFontItalicTrait,
                                             kCTFontBoldTrait | kCTFontItalicTrait);

[attrString addAttribute:(NSString*)kCTFontAttributeName
                   value:(id)newFont
                   range:[copyString rangeOfString:customText.text]];
person TegRa    schedule 10.01.2013
comment
Как вы можете расширить это, чтобы использовать его как функцию, чтобы добавлять: kCTFontBoldTrait и kCTFontItalicTrait на лету? - person el.severo; 21.03.2016

Вы можете использовать это, когда отправитель является экземпляром UIButton

   sender.titleLabel.font=[UIFont fontWithName:@"Helvetica-BoldOblique" size:18.0f];
person Nagendra Tripathi    schedule 19.06.2013

Чтобы добавить два атрибута (это не код ARC):

#define kLabelFontSize 16.0

NSString labelString = @"Let's slide loudly";

[self.tttLabel setText:labelString afterInheritingLabelAttributesAndConfiguringWithBlock:^NSMutableAttributedString *(NSMutableAttributedString *mutableAttributedString) {

    UIFont *boldSystemFont = [UIFont boldSystemFontOfSize:kLabelFontSize];
    CTFontRef boldFont = CTFontCreateWithName((CFStringRef)boldSystemFont.fontName, boldSystemFont.pointSize, NULL);
    if (boldFont) {
        [mutableAttributedString addAttribute:(NSString *)kCTFontAttributeName value:(id)boldFont range:NSMakeRange(6, 11)];
        CFRelease(boldFont);
    }

    UIFont *italicSystemFont = [UIFont italicSystemFontOfSize:kLabelFontSize];
    CTFontRef italicFont = CTFontCreateWithName((CFStringRef)boldSystemFont.fontName, italicSystemFont.pointSize, NULL);
    if (italicFont) {
        [mutableAttributedString addAttribute:(NSString *)kCTFontAttributeName value:(id)italicFont range:NSMakeRange(12, 18)];
        CFRelease(italicFont);
    }

    }];

    return mutableAttributedString;
}];
person Alastair Stuart    schedule 11.04.2012
comment
Это правильно, но не к тому вопросу, который я задал. 2 атрибута не находятся в одном и том же слове. (6-11) (12-18). Спасибо за вклад. - person Byte; 11.04.2012

Если предложение имеет фиксированный формат, самым простым решением является использование двух разных UILabels, одного с обычным шрифтом, а другого с набором шрифтов Bold и Italic.

Если предложение является динамическим, вам следует использовать объект UIWebView, поскольку это был уровень, и загрузить простую веб-страницу с вашим текстом и полями ‹ b > ‹ i > ‹ /i > ‹ /b >, установленными на месте, когда вы этого хотите. жирным шрифтом и курсивом, например:

[myWebViewLabel loadHTMLString:[NSString stringWithFormat:@"<html><body style=\"background-color: transparent;\">Hello, my name is <b><i>Byte</b></i></body></html>"] baseURL:nil];

Я надеюсь, что это помогает.

person Carles Estevadeordal    schedule 09.04.2012
comment
Спасибо за ваш вклад. Как бы мне ни нравилась простота, я не могу сделать фон прозрачным. Я что-то пропустил? - person Byte; 10.04.2012
comment
Да, вы должны сделать: [myWebViewLabel setBackgroundColor:[UIColor clearColor]]; - person Carles Estevadeordal; 10.04.2012
comment
Да, конечно, я скопировал его из приложения, которое его использует. Поместили ли вы ‹body style=\background-color: Transparent;\› в код HTML и setBackgroundColor при создании объекта? - person Carles Estevadeordal; 10.04.2012
comment
Ну давай же! Просто погуглите: прозрачный uiwebview... Вам не хватает webView.opaque = NO; - person Carles Estevadeordal; 12.04.2012