如何根据文本长度增加UITextview高度,如whatsapp

问题描述:

我已经使用websocket在我的iOS应用程序中实现了聊天功能,它对我来说很好。

I have implemented chat function in my iOS app using websocket, and it's working fine for me.

问题是我想增加UITextView的高度,并且UITableView应该根据UITextView增加的高度向上移动。任何人都可以帮助我吗?

The problem is i want to increase the height of the UITextView, and the UITableView should move up according to the height of the UITextView increase. Can anyone help me?

以下是我在我的应用程序中使用的代码:

Below is my code which i'm using in my application:

- (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,则可以使用此代码:

This works for both iOS 6.1 and iOS 7 and if you are using Objective C you can use this Code:

- (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,请使用:

Or if you'r using Swift use this:

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,那么您也应该这样做:

If you want support for iOS 6.1 then you should also do this as well:

textview.scrollEnabled = NO;