Как увеличить высоту UITextview в соответствии с длиной текста, например whatsapp

Я внедрил функцию чата в моем приложении iOS с помощью websocket, и он отлично работает для меня.

Проблема в том, что я хочу увеличить высоту UITextView, а UITableView должен двигаться вверх по высоте увеличения UITextView. Может кто-нибудь мне помочь?

Ниже мой код, который я использую в своем приложении:

- (void)viewDidAppear:(BOOL)animated { AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication]delegate]; [super viewDidAppear:animated]; UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)]; [self.messagesTextView addGestureRecognizer:tgr]; [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillChangeFrameNotification object:nil queue:nil usingBlock:^(NSNotification *note) { CGRect endFrame = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; UIViewAnimationCurve curve = [note.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]; CGFloat duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue]; UIViewAnimationOptions options = curve << 16; [UIView animateWithDuration:duration delay:0.0 options:options animations:^{ NSLog(@"frame: %@", NSStringFromCGRect(endFrame)); CGRect frame = self.txtView.frame; if (isMsgLong==TRUE) { frame.origin.y = self.view.frame.size.height- CGRectGetHeight(self.txtView.frame)-216; } else { frame.origin.y = CGRectGetMinY(endFrame) - CGRectGetHeight(self.txtView.frame); } self.txtView.frame = frame; CGRect frame1 = self.sendButton.frame; frame1.origin.y = CGRectGetMinY(endFrame) - CGRectGetHeight(self.sendButton.frame); self.sendButton.frame = frame1; frame = self.messagesTextView.frame; frame.size.height = CGRectGetMinY(self.txtView.frame) - CGRectGetMinY(frame); self.messagesTextView.frame = frame; NSLog(@"did appear: %@", NSStringFromCGRect(self.txtView.frame)); } completion:nil]; }]; } - (void)keyboardWillShow:(NSNotification *)note { [UIView animateWithDuration:0.3 animations:^{ NSDictionary *info = note.userInfo; NSValue *value = info[UIKeyboardFrameEndUserInfoKey]; CGRect rawFrame = [value CGRectValue]; CGRect keyboardFrame = [self.view convertRect:rawFrame fromView:nil]; NSLog(@"frame: %@", NSStringFromCGRect(self.txtView.frame)); self.txtView.transform = CGAffineTransformMakeTranslation(0, -keyboardFrame.size.height); self.sendButton.transform = CGAffineTransformMakeTranslation(0, -keyboardFrame.size.height); self.messagesTableView.contentInset=UIEdgeInsetsMake(0, 0,keyboardFrame.size.height,0); //keyboardFrame.size.height NSLog(@"frame1: %@", NSStringFromCGRect(self.txtView.frame)); isMsgLong = FALSE; }]; } - (void)keyboardWillHide:(NSNotification *)note { [UIView animateWithDuration:0.3 animations:^{ NSLog(@"frame2: %@", NSStringFromCGRect(self.txtView.frame)); self.txtView.transform = CGAffineTransformIdentity; NSLog(@"frame3: %@", NSStringFromCGRect(self.txtView.frame)); self.sendButton.transform = CGAffineTransformIdentity; self.messagesTableView.transform = CGAffineTransformIdentity; isMsgLong = TRUE; }]; } -(void)textViewDidEndEditing:(UITextView *)textView { self.messagesTableView.contentInset=UIEdgeInsetsMake(0, 0, 0, 0); self.txtView.transform = CGAffineTransformMakeTranslation(0, -216); self.sendButton.transform = CGAffineTransformMakeTranslation(0, -216); NSLog(@"frame5: %@", NSStringFromCGRect(self.txtView.frame)); NSInteger lastSectionIndex = [self.messagesTableView numberOfSections] - 1; NSInteger lastRowIndex = [self.messagesTableView numberOfRowsInSection:lastSectionIndex] - 1; if (lastRowIndex==-1) { lastRowIndex=0; } NSIndexPath *pathToLastRow = [NSIndexPath indexPathForRow:lastRowIndex inSection:lastSectionIndex]; if (lastRowIndex==0) { } else { [self.messagesTableView scrollToRowAtIndexPath:pathToLastRow atScrollPosition:UITableViewScrollPositionBottom animated:NO]; //UITableViewScrollPositionMiddle } } 

Это работает как для iOS 6.1, так и для iOS 7, и если вы используете Objective C, вы можете использовать этот код:

 - (void)textViewDidChange:(UITextView *)textView { CGFloat fixedWidth = textView.frame.size.width; CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)]; CGRect newFrame = textView.frame; newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height); textView.frame = newFrame; } 

Или если вы используете Swift, используйте это:

 let fixedWidth = textView.frame.size.width textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max)) let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max)) var newFrame = textView.frame newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height) textView.frame = newFrame; 

Если вы хотите поддерживать iOS 6.1, вам также следует сделать это:

 textview.scrollEnabled = NO; 
  • Как получить фотографию из UITextView после добавления ее с помощью NSAttributedString?
  • UITextView не реагирует на события Touch после анимации
  • Раскладка клавиатуры Emoji неправильно рисуется и отсутствует много эмоций
  • Обнаружение нажатий на атрибут текста в UITextView при показе клавиатуры
  • UITextView с озвучиванием
  • Получить в настоящее время введенное слово в UITextView
  • используя UITextPosition, получите предыдущий символ из textInRange
  • Изменение свойства межстрочного интервала в NSParagraphStyle вызывает удлинение курсора
  • UITextView не загружает / не показывает большой текст?
  • Получить информацию о линии из UITextView и NSLayoutManager
  • Использование атрибутаText (NSAttributedString) в UITextView на iOS6 работает только с стилем абзаца или шрифтом, но не с обоими
  • Давайте будем гением компьютера.