поиск местоположения определенных символов в UILabel на iPhone - PullRequest
5 голосов
/ 07 июля 2010

У меня есть UILabel с некоторым текстом, скажем "Hello World abcdefg". Метка может иметь несколько строк, размер шрифта и т. Д.

Вопрос : Как найти координатывсе буквы "d" в этом UILabel.

Логический первый шаг - найти положение этих символов в строке (UILabel.text), но как мне перевести это в координаты, когда они фактически нарисованы на экране

Идея состоит в том, чтобы найти эти координаты и нарисовать что-то нестандартное поверх этого символа (в основном, чтобы накрыть его собственным изображением)

Ответы [ 2 ]

3 голосов
/ 07 июля 2010

Основные инструменты для измерения текста на iPhone находятся в UIStringDrawing.h, но ни один из них не делает то, что вам нужно. В основном вам придется перебирать подстроки по одному символу за раз, измеряя каждый. Когда линия переносится (результат выше), разделите ее после последнего не обернутого символа и добавьте высоту строки к вашей координате y.

- (CGSize)sizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode;
0 голосов
/ 17 марта 2014

Методы изменились с момента выхода iOS 7.0.Попробуйте это

- (CGFloat)charactersOffsetBeforeDayPartOfLabel {
    NSRange range = [[self stringFromDate:self.currentDate] rangeOfString:[NSString stringWithFormat:@"%i",[self dayFromDate:self.currentDate]]];
    NSString *chars = [[self stringFromDate:self.currentDate] substringToIndex:range.location];
    NSMutableArray *arrayOfChars = [[NSMutableArray alloc]init];
    [chars enumerateSubstringsInRange:NSMakeRange(0, [chars length]) options:(NSStringEnumerationByComposedCharacterSequences) usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
        [arrayOfChars addObject:substring];
    }];
    CGFloat charsOffsetTotal = 0;
    for (NSString *i in arrayOfChars){
        NSDictionary *attributes = @{NSFontAttributeName: [UIFont fontWithName:@"Helvetica Neue" size:16.0f]};
        charsOffsetTotal += [i sizeWithAttributes:attributes].width;
    }
    return charsOffsetTotal;
}
...