Я пытаюсь ограничить ввод текста в UITextView в какао-тач. Я действительно хочу ограничить количество строк, а не количество символов. Пока у меня есть это, чтобы подсчитать количество строк:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
if ([text isEqualToString:@"\n"]) {
rows++;
}
NSLog(@"Rows: %i", rows);
return YES;
}
Однако это не работает, если строка автоматически переносится, а не пользователь нажимает клавишу возврата. Есть ли способ проверить, был ли текст перенесен, аналогично проверке на "\ n"?
Спасибо.





К сожалению, использование NSString -stringWithFont: forWidth: lineBreakMode: не работает - какой бы режим переноса вы ни выбрали, текст переносится с шириной, меньшей, чем текущая ширина, а высота становится равной 0 на любых строках переполнения. Чтобы получить реальную фигуру, поместите веревку в рамку, которая выше, чем та, которая вам нужна - тогда вы получите высоту, превышающую ваш реальный рост.
Обратите внимание на мою выдумку (вычитая 15 из ширины). Это может быть как-то связано с моими взглядами (у меня одно внутри другого), поэтому оно может вам не понадобиться.
- (BOOL)textView:(UITextView *)aTextView shouldChangeTextInRange:(NSRange)aRange replacementText:(NSString*)aText
{
NSString* newText = [aTextView.text stringByReplacingCharactersInRange:aRange withString:aText];
// TODO - find out why the size of the string is smaller than the actual width, so that you get extra, wrapped characters unless you take something off
CGSize tallerSize = CGSizeMake(aTextView.frame.size.width-15,aTextView.frame.size.height*2); // pretend there's more vertical space to get that extra line to check on
CGSize newSize = [newText sizeWithFont:aTextView.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap];
if (newSize.height > aTextView.frame.size.height)
{
[myAppDelegate beep];
return NO;
}
else
return YES;
}
В iOS 7 я обнаружил следующие значения полей и отступов для UITextView, которые могут быть причиной того, что вам нужно использовать tallerSize: textContainerInset и textContainer.lineFragmentPadding. См. Ссылка на UITextView
Привет, Джейн. Я знаю, что этот пост довольно старый, но похоже, что это очень похожая проблема на ту, с которой я столкнулся [здесь] (stackoverflow.com/questions/5605226/…). Это проблема, которую вы здесь описываете, или ваше решение немного другой проблемы?