Сохранение пользовательского ввода контента UITextVIew, ограниченного его собственным фреймом - PullRequest
0 голосов
/ 06 февраля 2011

Попытка создать большое текстовое поле фиксированного размера.

Эта проблема очень похожа на проблему ограничения 140 символов, но вместо того, чтобы прекратить вводить 140 символов, я хочу прекратить печатать, когда крайРамка textView достигается, а не расширяется ниже в пропасть.Вот что я получил за метод делегата.Кажется, он всегда немного выключен.Есть мысли?

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    BOOL edgeBump = NO;
    CGSize constraint = textView.frame.size;

    CGSize size = [[textView.text stringByAppendingString:text] sizeWithFont:textView.font 
                                                           constrainedToSize:constraint 
                                                               lineBreakMode:UILineBreakModeWordWrap];
    CGFloat height = size.height;

    if (height > textView.frame.size.height) {
        edgeBump = YES;
    }

    if([text isEqualToString:@"\b"]){
        return YES;
    } else if(edgeBump){
        NSLog(@"EDGEBUMP!");
        return NO;
    }   

    return YES;
}

РЕДАКТИРОВАТЬ: Согласно предложению Макса ниже, вот код, который работает (заметьте, однако, что автозамена и вырезать здесь не работают):

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    CGSize constraint = textView.frame.size;

    NSString *whatWasThereBefore = textView.text;

    textView.text = [textView.text stringByReplacingCharactersInRange:range withString:text];

    if (textView.contentSize.height >= constraint.height) {
        textView.text = whatWasThereBefore;
    }

    return NO;
}

1 Ответ

0 голосов
/ 06 февраля 2011

У меня была похожая проблема, и я заметил, что sizeWithFont возвращает неправильный размер. Я использовал yourTextView.contentSize вместо этого. Таким образом, вы можете добавлять символы, получать размер содержимого, а затем удалять вновь добавленные символы, если размер содержимого превышает максимальный.

Edit2: исправлено

 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    UITextView* clone_tv = [[[UITextView alloc] initWithFrame: textView.frame] autorelease];
    clone_tv.text = [textView.text stringByReplacingCharactersInRange:range withString:text];

    return (clone_tv.contentSize.height <= textView.frame.size.height*2);
}

Обратите внимание на clone_tv. Мы на самом деле меняем текст в клонированном текстовом представлении, а не в реальном. В этом случае автозамена и вырезка работает. Тем не менее, я рекомендую вам создать какой-нибудь ivar с именем cloneTextView в вашем контроллере представления и использовать его каждый раз. Делая так, вы избежите ненужных выделений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...