InputAccessoryView docked at bottom

后端 未结 5 1596
挽巷
挽巷 2020-12-04 08:13

I\'m trying to achieve similar positioning behavior as the bottom text input bar in Apple\'s Messages app.

I have tried many approaches, searched high and low and th

5条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-04 08:53

    So I know this is an old post and I am not sure if you resolved this or not, but I found a way to get this working. I believe there is a bug in the inputAccessoryView, but I created a hacky solution to behave the way the messages app does. I think I provided all the necessary code to implement the work around. I am going to try and get a more appropriate blog post created sometime in the near future, with a more in depth description with my findings. Any questions, let me know.

    @property(nonatomic,assign)BOOL isFirstKeyboard; //workaround for keyboard bug
    
    @property(nonatomic,assign)BOOL isViewAppear;
    
    @property(nonatomic,strong)ChatBarView *chatView; //custom chat bar view
    
    @property(nonatomic,strong)UIView *footerPadView; //just to add some nice padding
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    //in the view did load
    - (void)viewDidLoad
    {
        //more app specific code...
        self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
        self.chatView.textView.inputAccessoryView = self.chatView;
    }
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    -(void)done
    {
        self.isFirstKeyboard = YES;
        [self.chatView.textView becomeFirstResponder];
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    - (void) moveTextViewForKeyboard:(NSNotification*)aNotification up:(BOOL)up
    {
        if(!self.isViewAppear)
            return;
        //NSLog(@"keyboard is: %@", up ? @"UP" : @"Down");
        if(!up && !self.isFirstKeyboard)
            [self performSelector:@selector(done) withObject:nil afterDelay:0.01];
        else if(!up & self.isFirstKeyboard)
        {
            self.isFirstKeyboard = NO;
            [self.view addSubview:self.chatView];
            CGRect frame = self.chatView.frame;
            frame.origin.y = self.view.frame.size.height - self.chatView.frame.size.height;
            self.chatView.frame = frame;
        }
        else
        {
            NSDictionary* userInfo = [aNotification userInfo];
            NSTimeInterval animationDuration;
            UIViewAnimationCurve animationCurve;
            CGRect keyboardEndFrame;
    
            [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
            [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
            [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame];
    
            // Animate up or down
            [UIView beginAnimations:nil context:nil];
            if(up)
                [UIView setAnimationDuration:0.2];
            else
                [UIView setAnimationDuration:0.3];
            [UIView setAnimationCurve:animationCurve];
    
            CGRect frame = self.footerPadView.frame;
            CGRect keyboardFrame = [self.view convertRect:keyboardEndFrame toView:nil];
            if (up)
                frame.size.height = keyboardFrame.size.height - self.chatView.frame.size.height;
            else
                frame.size.height = 0;
            self.footerPadView.frame = frame;
            self.tableView.tableFooterView = self.footerPadView;
            [UIView commitAnimations];
        }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    - (void)keyboardWillShow:(NSNotification *)aNotification {
        [self moveTextViewForKeyboard:aNotification up:YES];
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    - (void)keyboardWillHide:(NSNotification *)aNotification
    {
        [self moveTextViewForKeyboard:aNotification up:NO];
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    

提交回复
热议问题