Будь-яким способом виділити жирним шрифт частиною 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.