如何根据文字长度像whatsapp一样增加UITextview的高度
我使用websocket在iOS应用程序中实现了聊天function,对我来说工作正常。
问题是我想增加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;