Об AttributeString - выделение жирным шрифтом нескольких вхождений - PullRequest
6 голосов
/ 12 марта 2012

Я пытаюсь сделать несколько вхождений в приписанной строке жирным шрифтом, используя что-то вроде следующего

[attrStr setFont:[UIFont ...] range:[attrStr.string rangeOfString:@"hello world"]];

Как вы знаете, rangeOfString всегда возвращает ПЕРВОЕ вхождение совпадения ... Я все еще новичок в iOS, просто задаюсь вопросом, каков наилучший способ установить все вхождения жирным шрифтом ... Есть ли какая-либо функция в Или что-то еще?

Заранее спасибо!

Ответы [ 3 ]

24 голосов
/ 12 марта 2012

Сначала вы должны попытаться получить все диапазоны в строке, а затем установить атрибут для каждого диапазона. Вот несколько великолепных примеров кода на stackoverflow: https://stackoverflow.com/a/4653266/381870

Edit:

Вот вам пример

- (NSArray *)rangesOfString:(NSString *)searchString inString:(NSString *)str {
    NSMutableArray *results = [NSMutableArray array];
    NSRange searchRange = NSMakeRange(0, [str length]);
    NSRange range;
    while ((range = [str rangeOfString:searchString options:0 range:searchRange]).location != NSNotFound) {
        [results addObject:[NSValue valueWithRange:range]];
        searchRange = NSMakeRange(NSMaxRange(range), [str length] - NSMaxRange(range));
    }
    return results;
}

Использование:

NSArray *results = [self rangesOfString:@"foo" inString:@"foo bar foo"];
NSLog(@"%@", results);

дает вам

(
    "NSRange: {0, 3}",
    "NSRange: {8, 3}"
)
1 голос
/ 09 ноября 2018

Преобразование ответа Тима в Swift 4:

extension NSString {
    open func ranges(of searchString: String) -> [NSRange] {
        var ranges = [NSRange]()
        var searchRange = NSRange(location: 0, length: self.length)
        var range: NSRange = self.range(of: searchString)
        while range.location != NSNotFound {
            ranges.append(range)
            searchRange = NSRange(location: NSMaxRange(range), length: self.length - NSMaxRange(range))
            range = self.range(of: searchString, options: [], range: searchRange)
        }
        return ranges
    }
}

Также сделал это в примитиве Swift's String:

extension String {
    func ranges(of substring: String, options: CompareOptions = [], locale: Locale? = nil) -> [Range<Index>] {
        var ranges: [Range<Index>] = []
        while let range = self.range(of: substring, options: options, range: (ranges.last?.upperBound ?? self.startIndex)..<self.endIndex, locale: locale) {
            ranges.append(range)
        }
        return ranges
    }
}
0 голосов
/ 12 марта 2012

Вам нужно будет использовать NSScanner для сканирования текста и замены его. Вы можете найти пример для NSScanner здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...