Multi-Line TextField (аналогично SMS) и/или кнопка "Готово" в UITextView

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

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

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

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

Ответ 2

Старый вопрос, но через несколько часов я понял, как сделать его таким же, как в 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)
   {
      //
   }];
}

Ответ 3

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;
 }

Ответ 4

Ну, у меня была аналогичная проблема, и то, что я закончил использовать, на самом деле создает отключенный 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
    }
}

Ответ 5

  • (void) textEditorDidBeginEditing: (TTTextEditor *) textEditor { И

    • (void) textEditorDidEndEditing: (TTTextEditor *) textEditor { может быть то, что вы ищете. Наслаждайтесь!