К сожалению, использование 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;
}