Любой способ выделить часть NSString? - PullRequest
72 голосов
/ 16 мая 2011

Есть ли способ выделить только часть строки?Например:

Приблизительное расстояние: 120 м Вдали

Спасибо!

Ответы [ 10 ]

96 голосов
/ 16 мая 2011

Что вы могли бы сделать - это использовать 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 объектов с Core Text.

60 голосов
/ 16 мая 2011

Как упоминал Джейкоб, вы, вероятно, захотите использовать 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];
11 голосов
/ 12 июня 2014

Если вы не хотите беспокоиться о шрифтах (так как не каждый вариант шрифта содержит «Жирный шрифт»), вот еще один способ сделать это. Обратите внимание, что в настоящее время это доступно только в OS X ...:

NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:"Approximate Distance: 120m away"];
[attrString beginEditing];
[attrString applyFontTraits:NSBoldFontMask
                      range:NSMakeRange(22, 4)];
[attrString endEditing];
6 голосов
/ 10 февраля 2016

Приведенный выше код дал мне сбой, когда я создал UILabel с этой атрибутом String.

Я использовал этот код, и он работал:

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];
4 голосов
/ 20 марта 2017

Чтобы выделить строку без жесткого кодирования ее шрифта, вы можете использовать атрибут StrokeWidth с отрицательным значением:

let s = NSMutableAttributedString(string: "Approximate Distance: 120m away")
s.addAttribute(NSStrokeWidthAttributeName, value: NSNumber(value: -3.0), range: NSRange(22..<26))
4 голосов
/ 16 ноября 2016

Swift

Также включает получение диапазона строки, которую вы хотите динамически подбодрить

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
3 голосов
/ 16 мая 2011

NSString - это просто контейнер данных.Он не содержит никаких подробностей о проблемах презентации.

Похоже, что вы, вероятно, хотите сделать, это жирная часть UILabel, которая используется для отображения вашей строки.Что я не думаю, что вы можете сделать.Но вы всегда можете разбить пользовательский интерфейс на три метки: одну для «Приблизительное расстояние:», одну для « 120 м » и одну для «прочь».Поместите их в линию друг с другом, и вы получите желаемый эффект.

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

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

2 голосов
/ 23 марта 2016

Я связал ответы @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 .

2 голосов
/ 26 декабря 2014

В Xamarin ios вы можете выделить часть строки NSS следующим образом:

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);    
0 голосов
/ 15 ноября 2018

Если вы не хотите жестко задавать шрифт или размер шрифта, попробуйте этот код для полнотелых строк:

NSMutableAttributedString *myString = [[NSMutableAttributedString alloc] initWithString:mainString];
[myString beginEditing];
[myString addAttribute:NSStrokeWidthAttributeName
                         value:[[NSNumber alloc] initWithInt: -3.f]
                         range:NSMakeRange(0, [mainString length])];
[myString endEditing];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...