UILabel – видимая часть текста
Есть ли способ получить видимую часть текста в слове, обернутом UILabel
? Я имею в виду именно последний видимый персонаж?
Я хотел бы сделать два ярлыка, округляющие изображение, и хотел бы продолжить текст, который был неправым для первого ярлыка на втором.
Я знаю [NSString sizeWithFont...]
но есть ли что-то вроде « [NSString stringVisibleInRect: withFont:...]
? 🙂
- Как управлять расстоянием между строками в UILabel
- Как изменить расстояние между буквами UILabel / UIFont?
- Как нарисовать границу вокруг UILabel?
- UILabel и NSLinkAttributeName: ссылка не доступна для кликов
- Как настроить интерактивный интерфейс UILabel
Заранее спасибо.
- Метод sizeWithFont устарел. boundingRectWithSize возвращает неожиданное значение
- Динамическое обновление UILabel
- Как установить жирный шрифт и курсив на UILabel iPhone / iPad?
- Почему UINavigationBar крадет события касания?
- objective C: Как вы можете повернуть текст для UIButton и UILabel?
- Форматирование номера для отображения запятых и / или знака доллара
- Как добавить gradleиент к тексту UILabel, но не к фону?
- Как получить текст из n-й строки UILabel?
Вы можете использовать категорию для расширения NSString и создания метода, который вы упоминаете
@interface NSString (visibleText) - (NSString*)stringVisibleInRect:(CGRect)rect withFont:(UIFont*)font; @end @implementation NSString (visibleText) - (NSString*)stringVisibleInRect:(CGRect)rect withFont:(UIFont*)font { NSString *visibleString = @""; for (int i = 1; i <= self.length; i++) { NSString *testString = [self substringToIndex:i]; CGSize stringSize = [testString sizeWithFont:font]; if (stringSize.height > rect.size.height || stringSize.width > rect.size.width) break; visibleString = testString; } return visibleString; } @end
Вот метод O (log n) с API iOS 7. Только поверхностно проверенные, прокомментируйте, если вы найдете какие-либо ошибки.
- (NSRange)hp_visibleRange { NSString *text = self.text; NSRange visibleRange = NSMakeRange(NSNotFound, 0); const NSInteger max = text.length - 1; if (max >= 0) { NSInteger next = max; const CGSize labelSize = self.bounds.size; const CGSize maxSize = CGSizeMake(labelSize.width, CGFLOAT_MAX); NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; paragraphStyle.lineBreakMode = self.lineBreakMode; NSDictionary * attributes = @{NSFontAttributeName:self.font, NSParagraphStyleAttributeName:paragraphStyle}; NSInteger right; NSInteger best = 0; do { right = next; NSRange range = NSMakeRange(0, right + 1); NSString *substring = [text substringWithRange:range]; CGSize textSize = [substring boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil].size; if (textSize.width <= labelSize.width && textSize.height <= labelSize.height) { visibleRange = range; best = right; next = right + (max - right) / 2; } else if (right > 0) { next = right - (right - best) / 2; } } while (next != right); } return visibleRange; }