3

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

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
    }
}
Lorenzo
  • 3,293
  • 4
  • 29
  • 56
user1482192
  • 111
  • 1
  • 6

1 Answers1

0

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

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;

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

textview.scrollEnabled = NO;