Многострочное TextField (аналогично SMS) и / или кнопка «Готово» в UITextView - PullRequest
6 голосов
/ 09 января 2010

Я исследовал это в течение нескольких дней и был бы признателен за небольшую помощь. Есть ли способ создать многострочное UITextField, как Apple, использует в приложении SMS? Полезная вещь в этом элементе управления состоит в том, что он имеет «утопленный» вид, который дает понять, что это текстовое поле ввода, но в то же время он расширяется на каждый символ новой строки.

В противном случае, если я вынужден использовать UITextView, кто-нибудь может посоветовать, как лучше отклонить клавиатуру? Кнопки «Готово» и «Вперед» просто появляются, чтобы генерировать символы новой строки ('\ n'). Это кажется мне неправильным - конечно, по крайней мере один из них должен генерировать другой символ, так что я все еще могу разрешить символы новой строки, но также и отклонить мою клавиатуру при нажатии определенной клавиши.

Я что-то упустил здесь?

Заранее спасибо:)

Ответы [ 5 ]

9 голосов
/ 04 июля 2010

Может быть, вы можете построить класс, который я написал? Это так же, как tttexteditor, без уродливых глюков: http://www.hanspinckaers.com/multi-line-uitextview-similar-to-sms

3 голосов
/ 04 ноября 2012

Старый вопрос, но через несколько часов я понял, как сделать его так же идеально, как в Instagram (у него лучший алгоритм среди всех BTW)

Инициализировать с этим:

    // Input
    _inputBackgroundView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, size.height - _InputBarHeight, size.width, _InputBarHeight)];
    _inputBackgroundView.autoresizingMask = UIViewAutoresizingNone;
   _inputBackgroundView.contentMode = UIViewContentModeScaleToFill;
    _inputBackgroundView.userInteractionEnabled = YES;
    [self addSubview:_inputBackgroundView];
   [_inputBackgroundView release];

   [_inputBackgroundView setImage:[[UIImage imageNamed:@"Footer_BG.png"] stretchableImageWithLeftCapWidth:80 topCapHeight:25]];

    // Text field
    _textField = [[UITextView alloc] initWithFrame:CGRectMake(70.0f, 0, 185, 0)];
   _textField.backgroundColor = [UIColor clearColor];
    _textField.delegate = self;
   _textField.contentInset = UIEdgeInsetsMake(-4, -2, -4, 0);
   _textField.showsVerticalScrollIndicator = NO;
   _textField.showsHorizontalScrollIndicator = NO;
    _textField.font = [UIFont systemFontOfSize:15.0f];
    [_inputBackgroundView addSubview:_textField];
   [_textField release];

   [self adjustTextInputHeightForText:@""];

Заполнить методы делегата UITextView:

- (void) textViewDidBeginEditing:(UITextView*)textView {

   [self adjustTextInputHeightForText:_textField.text];
}

- (void) textViewDidEndEditing:(UITextView*)textView {

   [self adjustTextInputHeightForText:_textField.text];
}

- (BOOL) textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text {

   if ([text isEqualToString:@"\n"])
   {
      [self performSelector:@selector(inputComplete:) withObject:nil afterDelay:.1];
      return NO;
   }
   else if (text.length > 0)
   {
      [self adjustTextInputHeightForText:[NSString stringWithFormat:@"%@%@", _textField.text, text]];
   }
   return YES;
}

- (void) textViewDidChange:(UITextView*)textView {

   [self adjustTextInputHeightForText:_textField.text];
}

И дело в том ...

- (void) adjustTextInputHeightForText:(NSString*)text {

   int h1 = [text sizeWithFont:_textField.font].height;
   int h2 = [text sizeWithFont:_textField.font constrainedToSize:CGSizeMake(_textField.frame.size.width - 16, 170.0f) lineBreakMode:UILineBreakModeWordWrap].height;

   [UIView animateWithDuration:.1f animations:^
   {
      if (h2 == h1)
      {
         _inputBackgroundView.frame = CGRectMake(0.0f, self.frame.size.height - _InputBarHeight, self.frame.size.width, _InputBarHeight);
      }
      else
      {
         CGSize size = CGSizeMake(_textField.frame.size.width, h2 + 24);
         _inputBackgroundView.frame = CGRectMake(0.0f, self.frame.size.height - size.height, self.frame.size.width, size.height);
      }
      CGRect r = _textField.frame;
      r.origin.y = 12;
      r.size.height = _inputBackgroundView.frame.size.height - 18;
      _textField.frame = r;

   } completion:^(BOOL finished)
   {
      //
   }];
}
2 голосов
/ 09 января 2010

Facebook выпустила пакет с открытым исходным кодом под названием Three20 , который имеет многострочное текстовое поле. Вы можете использовать это довольно легко для расширяющегося текстового поля.

Что касается кнопки «Готово», вы можете установить контроллер вида как UITextFieldDelegate. Тогда используйте этот метод:

 - (BOOL)textFieldShouldReturn:(UITextField *)textField {
     // Do whatever you want for your done button
      return YES;
 }

В случае Three20 используйте этот метод TTTextEditorDelegate:

 - (BOOL)textFieldShouldReturn:(TTTextEditor *)textField {
     // Do whatever you want for your done button
      return YES;
 }
1 голос
/ 10 января 2010

Что ж, у меня была похожая проблема, и в итоге я использовал на самом деле создание отключенного UITextField в качестве фона и UITextView над ним для получения ввода ... Это отстой, что iPhone API не может иметь это по умолчанию. Также обратите внимание, что это не расширяет автоматически, но вы можете сделать это, если хотите, обработав textViewDidChange:

Что касается обработки ключа возврата, попробуйте реализовать следующий метод из UITextViewDelegate:

- (void)textViewDidChange:(UITextView *)inTextView {
    NSString *text = inTextView.text;

    if ([text length] > 0 && [text characterAtIndex:[text length] -1] == '\n') {
        inTextView.text = [text substringToIndex:[text length] -1]; // remove last return from text view
        [inTextView resignFirstResponder]; // hide keyboard
    }
}
0 голосов
/ 23 февраля 2010
  • (void) textEditorDidBeginEditing: (TTTextEditor *) textEditor { И

    • (void) textEditorDidEndEditing: (TTTextEditor *) textEditor { может быть то, что вы ищете. Наслаждайтесь!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...