Длина строки с заданным шрифтом соответствует UITextView

Мне нужно переместить текст, который пользователь ввел в большой многострочный UITextView в меньший (но все же многострочный) UITextView *. Если пользователь ввел больше текста, чем будет отображаться на более мелком представлении, я хочу обрезать текст так, чтобы он соответствовал всем видимым (усеченным) текстам. (Не нужно прокручивать ни большой UITextView ни меньший.)

Каков наилучший способ сделать это?

Я могу использовать цикл, каждый раз сокращая строку с помощью символа, а затем использую NSString sizeWithFont: constrainedToSize: lineBreakMode: чтобы узнать высоту этой более короткой строки, а затем сравните ее с той высотой, которую я имею в моем меньший UITextView , заканчивая цикл, когда строка будет соответствовать – но это кажется медленным и неудобным. Должен быть лучший способ.

Я хотел бы просто указать целевому UITextView чтобы UITextView его элемент displayText, поскольку он отображает его на экране, но я не смог найти способ сделать это.

* Больше контекста на этом, из комментария, который я сделал ниже:

У меня есть приложение для пейзажа. Я изменяю расположение представления в зависимости от выбранной пользователем фотографии. Если это пейзажная фотография, заголовок меньше – просто строка внизу фотографии. Если она выбирает портретную фотографию, то есть много места, которое я могу использовать для надписи на стороне фотографии, поэтому надпись больше.

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

4 Solutions collect form web for “Длина строки с заданным шрифтом соответствует UITextView”

Для этого я написал следующий рекурсивный метод и открытый API. Ужасный фактор выдумки является предметом этого вопроса .

 #define kFudgeFactor 15.0 #define kMaxFieldHeight 9999.0 // recursive method called by the main API -(NSString*) sizeStringToFit:(NSString*)aString min:(int)aMin max:(int)aMax { if ((aMax-aMin) <= 1) { NSString* subString = [aString substringToIndex:aMin]; return subString; } int mean = (aMin + aMax)/2; NSString* subString = [aString substringToIndex:mean]; CGSize tallerSize = CGSizeMake(self.frame.size.width-kFudgeFactor,kMaxFieldHeight); CGSize stringSize = [subString sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap]; if (stringSize.height <= self.frame.size.height) return [self sizeStringToFit:aString min:mean max:aMax]; // too small else return [self sizeStringToFit:aString min:aMin max:mean];// too big } -(NSString*)sizeStringToFit:(NSString*)aString { CGSize tallerSize = CGSizeMake(self.frame.size.width-kFudgeFactor,kMaxFieldHeight); CGSize stringSize = [aString sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap]; // if it fits, just return if (stringSize.height < self.frame.size.height) return aString; // too big - call the recursive method to size it NSString* smallerString = [self sizeStringToFit:aString min:0 max:[aString length]]; return smallerString; } 

На самом деле это не исправление, но оно обеспечивает хорошее начало для вычисления.

Если вы используете NSString sizeWithFont: constrainedToSize: lineBreakMode: вы получаете вертикальную высоту для вашего текста. Если вы разделите это на высоту вашего шрифта, вы получите количество строк во всей строке. Разделение [NSString count] на это число дает вам приблизительное количество символов в строке. Это предполагает, что строка является однородной и будет неточной, если кто-то напечатает (например) «iiiiiiiiiii …», как это описано в «MMMMMMMMM …».

Вы также можете разделить ограничительную рамку на leading высоту соответствующего шрифта, чтобы получить количество строк, которые соответствуют вашей ограничительной рамке.

Умножение символов на строку по количеству строк дает вам отправную точку для поиска текста, который подходит.

Вы можете рассчитать маржу для ошибки на этом рисунке, выполнив тот же расчет для строк «iiiiii …» и «MMMMMM …».

Я хотел бы предложить несколько иной подход и посмотреть, можно ли использовать UILabel вместо меньшего UITextView.

UILabels можно настроить так, чтобы он был многострочным, как UITextView, через свойство numberOfLines.

У UILabels также есть свойство lineBreakMode, и я считаю, что значение по умолчанию этого свойства будет делать точный эффект усечения, который вы ищете.

Я думаю, что Джонатан что-то думал о UILabel …

Итак, пользователь заканчивает редактирование UITextView, вы получаете строку текста и передаете его в UILabel. Вы изменяете альфа UITextView на 0 и / или удаляете его из супервизора. Возможно, сохраните неиспользуемый полный текст в ivar.

UILabels не являются «редактируемыми», однако вы можете обнаружить прикосновение к UILabel (или это супервизор). Когда вы обнаруживаете касание на UILabel, вы просто восстанавливаете скрытый UITextView и восстанавливаете сохраненную вами строку.

Иногда SDK – это боль, но он почти всегда выигрывает бой. Много раз лучше настроить свой дизайн на соглашения UIKit

  • Почему разные константы анимации блоков имеют одинаковое значение?
  • UIScrollView contentOffset изменение после другого представления нажата
  • Поиск правильной ширины NSString
  • UITableView удаляет и перезагружает ячейки
  • Особенности доступности UISlider для VoiceOver?
  • Отображать оттенки серого MKMapView
  • Как скрыть панель навигации с одного конкретного контроллера представления
  • Количество дней между двумя NSDates
  • Я не могу инициализировать NSInputStream
  • Несколько теневых теней на одном экране iOS
  • UIViewController viewWillAppear вызывается после своего собственного просмотраWillDisappear
  • Interesting Posts

    Передача данных через контроллеры просмотра с помощью Swift без использования раскадровки

    Не удается загрузить файл с Google Диска в ios

    конвертировать NSDictionary в NSString

    Как получить номер телефона iPhone

    Можно ли объединить несколько прозрачных объектов SCNShape?

    Как использовать собственный корневой сертификат в IOS Secure Transport API?

    Ошибка Twitter_OAuth: домен = код HTTP = 410

    Тонная кривая OpenCV прогромматична

    Как идентифицировать уникальных пользователей без использования системы входа (iOS)

    Настройки записи AVAssetWriter не работают как AVAudioRecorder

    iOS как опубликовать действие на пользовательском объекте Graph Api – Facebook

    Представление контроллера модального вида без покрытия текущего вида на iPhone

    Соответствует UITableViewDelegate и UITableViewDatasource в Swift?

    Определить значение частоты с помощью iPhone

    Проверьте, пусто ли несколько текстовых полей – iOS с Swift

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.