Будь-яким способом виділити жирним шрифт частиною NSString?


77

Чи є спосіб виділити жирним шрифтом лише частину рядка? Наприклад:

Приблизна відстань: 120 метрів

Дякую!


3
Це залежить від того, в якому ви його відображаєте, оскільки рядок - це лише серія символів і не містить інформації про форматування.
— BoltClock

Відповіді:


103

Що ви могли б зробити, це використовувати NSAttributedString.

NSString *boldFontName = [[UIFont boldSystemFontOfSize:12] fontName];
NSString *yourString = ...;
NSRange boldedRange = NSMakeRange(22, 4);

NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:yourString];

[attrString beginEditing];
[attrString addAttribute:kCTFontAttributeName 
                   value:boldFontName
                   range:boldedRange];

[attrString endEditing];
//draw attrString here...

Погляньте на цей зручний посібник з малювання NSAttributedStringоб’єктів за допомогою основного тексту.


2
Хто-небудь може сказати мені, як визначається "kCTFontAttributeName"?
— Сохан

1
На жаль просто зрозумів, що це константа, яка визначена в CTFont.h у вашій структурі CoreText.
— Сохан

8
там сказано: Використання невизначеного ідентифікатора 'kCTFontAttributeName', ви мали на увазі 'NSFontAttributeName'? Що в цьому поганого? чи можу я замість цього використовувати NSFontAttributeName?
— тестер

1
@tester Яку версію iOS ви будуєте? Я думаю, NSFontAttributeNameце доступно лише в OS X.
— Якоб Рєлкін,

11
Цей не працює на iOS7 (аварійно завершує роботу з exc_bad_access). Причиною цього є те, що вам потрібно надіслати шрифт замість назви шрифту як частину повідомлення. @Chris Frederick робить це правильно нижче.
— Філіп Сабурін

61

Як згадував Яків, ви, мабуть, хочете використовувати NSAttributedStringабо NSMutableAttributedString. Далі подано один із прикладів того, як ви можете це зробити.

NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"Approximate Distance: 120m away"];
NSRange selectedRange = NSMakeRange(22, 4); // 4 characters, starting at index 22

[string beginEditing];

[string addAttribute:NSFontAttributeName
           value:[NSFont fontWithName:@"Helvetica-Bold" size:12.0]
           range:selectedRange];

[string endEditing];

1
Коли я спробую це, я виходжу Use of Undeclared identifier 'NSFont'на value:лінію. Як це виправити?
— ZuluDeltaNiner

Це чудовий приклад. Вам не вистачає @навколо рядка прикладу після вашого initWithString:методу в першому рядку. :)
— Кліфтон Лабрум

12
@ZuluDeltaNiner Якщо ви використовуєте iOS, замініть NSFontнаUIFont
— Clifton Labrum

Я зрозумів це деякий час тому; Здається, я забув видалити свій коментар.
— ZuluDeltaNiner

2
Врятував мене! Відповідь на це питання потрібно відредагувати. Я витратив на це
— Michal Shatz

12

Якщо ви не хочете заморочуватися зі шрифтами (оскільки не кожен варіант шрифту містить "Жирний шрифт"), ось ще один спосіб зробити це. Зверніть увагу, це наразі доступно лише в OS X ...:

NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:"Approximate Distance: 120m away"];
[attrString beginEditing];
[attrString applyFontTraits:NSBoldFontMask
                      range:NSMakeRange(22, 4)];
[attrString endEditing];

NSBoldFontMask незадекларований для iOS? Будь-яка заміна?
— coolcool1994

@ coolcool1994 - Вибачте, не те, що я знаю. Я відредагую свою відповідь, щоб пояснити, що це лише фокус для OS X ...
— Юра,

beginEditing та endEditing - "Замінено підкласами для буферизації або оптимізації серії змін символів або атрибутів одержувача" і тут не потрібні. В іншому випадку це було саме те, що мені потрібно.
— green_knight

6

Код вище дав мені збій, коли я створив UILabel з цим attributedString.

Я використовував цей код, і він працював:

NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:string];
NSRange boldedRange = NSMakeRange(0, 1);
UIFont *fontText = [UIFont systemFontOfSize:12]; //[UIFont fontWithName:@"Lato-Bold" size:12];
NSDictionary *dictBoldText = [NSDictionary dictionaryWithObjectsAndKeys:fontText, NSFontAttributeName, nil];
[attrString setAttributes:dictBoldText range:boldedRange];

5

Стрімкий

Також включає отримання діапазону рядка, який ви хочете динамічно підбадьорювати

let nameString = "Magoo"
let string = "Hello my name is \(nameString)"

let attributes = [NSFontAttributeName:UIFont.systemFontOfSize(14.0),NSForegroundColorAttributeName: UIColor.black]
let boldAttribute = [NSFontAttributeName:UIFont.boldSystemFontOfSize(14.0)]

let attributedString = NSMutableAttributedString(string: string, attributes: attributes)

let nsString = NSString(string: string)
let range = nsString.rangeOfString(nameString)

if range.length > 0 { attributedString.setAttributes(boldAttribute, range: range) }

someLabel.attributedText = attributedString

4

Щоб виділити рядок жирним шрифтом без жорсткого кодування шрифту, ви можете використовувати атрибут StrokeWidth із від'ємним значенням:

let s = NSMutableAttributedString(string: "Approximate Distance: 120m away")
s.addAttribute(NSStrokeWidthAttributeName, value: NSNumber(value: -3.0), range: NSRange(22..<26))

3

An NSString- це просто контейнер даних. Він не містить жодних подробиць щодо проблем з презентацією.

Схоже, те, що ви, мабуть, хочете зробити, - це напівжирна частина того UILabel, що використовується для відображення вашого рядка. Що, я думаю, ти не можеш зробити. Але ви завжди можете розбити інтерфейс на три мітки, одну для "Приблизна відстань:", одну для " 120 м " і одну для "далеко". Розмістіть їх на одній лінії один з одним, і ви повинні отримати бажаний ефект.

Іншим варіантом може бути використання UIWebViewрозмітки і трохи розмітки для відображення вашого рядка з вбудованою інформацією про форматування, як обговорюється тут:

http://iphoneincubator.com/blog/windows-views/display-rich-text-using-a-uiwebview


2

У Xamarin ios ви можете виділити жирним шрифт частиною NSSring таким чином:

public static NSMutableAttributedString BoldRangeOfString (string str, float fontSize, int startRange, int lengthRange)
    {
        var firstAttributes = new UIStringAttributes {
            Font = UIFont.BoldSystemFontOfSize(fontSize)
        };

        NSMutableAttributedString boldString = new NSMutableAttributedString (str);
        boldString.SetAttributes (firstAttributes.Dictionary, new NSRange (startRange, lengthRange));
        return boldString;
    }    

і викликати цей метод:

myLabel = new UILabel (); 
...
myLabel.AttributedText = BoldRangeOfString("my text", fontSize, startRange, lengthRange);    

6
Питання було не про Ксамарін.
— Zia

4
Xamarin працює з тим самим об’єктом NSString, питання не вказувало, якою мовою має бути відповідь. Я прийшов сюди, шукаючи синтаксис Xamarin, щоб це зробити. Правильна відповідь.
— корінь

2

Я поєднав відповіді @Jacob Relkin та @Andrew Marin, інакше я отримав збої. Ось відповідь на iOS9:

UIFont *boldFont = [UIFont boldSystemFontOfSize:12];
NSString *yourString = @"Approximate Distance: 120m away";
NSRange boldedRange = NSMakeRange(22, 4);

NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:yourString];

[attrString beginEditing];
[attrString addAttribute:NSFontAttributeName 
                   value:boldFont
                   range:boldedRange];

[attrString endEditing];

Я подивився офіційну документацію: 1 та 2 .


1

Коротший спосіб за допомогою Swift5 +

let labelNotes = UILabel()  //or UITextView(), etc...
let attributedNotes = NSMutableAttributedString(string: "Bold: some stuff not bold")
attributedNotes.addAttribute(NSAttributedString.Key.font, value: UIFont.boldSystemFont(ofSize: 14), range: NSRange(location: 0, length: 5))
labelNotes.attributedText = attributedNotes

0

Якщо ви не хочете жорстко кодувати шрифт або / та розмір, спробуйте цей код для виділення повних рядків:

NSMutableAttributedString *myString = [[NSMutableAttributedString alloc] initWithString:mainString];
[myString beginEditing];
[myString addAttribute:NSStrokeWidthAttributeName
                         value:[[NSNumber alloc] initWithInt: -3.f]
                         range:NSMakeRange(0, [mainString length])];
[myString endEditing];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.