Ограничение текста в UITextView - PullRequest
5 голосов
/ 04 января 2009

Я пытаюсь ограничить ввод текста в UITextView в Cocoa-Touch. Я действительно хочу ограничить количество строк, а не количество символов. Пока у меня есть это, чтобы посчитать количество строк:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if([text isEqualToString:@"\n"]) {
        rows++;
    }
    NSLog(@"Rows: %i", rows);
    return YES;
}

Однако это не работает, если строка переносится автоматически, а пользователь не нажимает клавишу возврата. Есть ли способ проверить, был ли текст перенесен, аналогично проверке "\ n"?

Спасибо.

1 Ответ

14 голосов
/ 08 апреля 2009

К сожалению, использование 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...