iOS键盘显示事件处理 [英] iOS Keyboard show event handling

查看:213
本文介绍了iOS键盘显示事件处理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用一个聊天应用程序,其中有一个textview(没有textfield),当我单击它时,键盘应该会显示并且一切都应该向上移动.

I am working on a chat app wherein I have a textview (not textfield) and when I click on it, the keyboard should show and everything should move up.

到目前为止,我已经设法将表格视图和textview的框架向上移动,并使用以下代码显示键盘.

Till now, I have managed to shift the frame of the table view and textview up and show the keyboard using the below code.

- (void)keyboardWasShown:(NSNotification *)notification {

    NSDictionary* info = [notification userInfo];

    keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    CGPoint contentViewOrigin = self.contentView.frame.origin;

    CGFloat contentViewHeight = self.contentView.frame.size.height;

    CGRect visibleRect = self.view.frame;

    visibleRect.size.height -= keyboardSize.height;
    BOOL up = CGRectContainsPoint(visibleRect, contentViewOrigin);

    if (!up){


    self.tableView.frame = CGRectMake(self.tableView.frame.origin.x,self.tableView.frame.origin.y,self.tableView.frame.size.width,280.0f);


    self.contentView.frame = CGRectOffset(self.contentView.frame, 0, 0 - keyboardSize.height);

    if([self.tableView numberOfRowsInSection:0]!=0)
    {
        NSIndexPath* ip = [NSIndexPath indexPathForRow:[self.tableView numberOfRowsInSection:0]-1 inSection:0];
        [self.tableView scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionBottom animated:UITableViewRowAnimationLeft];
    }


}

}

- (void)keyboardWillBeHidden:(NSNotification *)notification {

self.contentView.frame = originalContentView;
self.tableView.frame = originalTable;
}


- (void)registerForKeyboardNotifications {

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWasShown:)
                                             name:UIKeyboardDidShowNotification
                                           object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillBeHidden:)
                                             name:UIKeyboardWillHideNotification
                                           object:nil];

}

- (void)deregisterFromKeyboardNotifications {

[[NSNotificationCenter defaultCenter] removeObserver:self
                                                name:UIKeyboardDidHideNotification
                                              object:nil];

[[NSNotificationCenter defaultCenter] removeObserver:self
                                                name:UIKeyboardWillHideNotification
                                              object:nil];

}

但是,当我看到whatsapp的工作方式时,我的样子就像是骇客. Whatsapp的键盘和所有元素一起向上移动,而我的工作方式是这样的:首先显示键盘,向应用程序发送通知,接收到通知,代码计算键盘的高度,然后根据高度向上移动元素.

But when I saw how whatsapp does it, mine looked like a hack. Whatsapp's keyboard moves up together with all the elements while mine works like this: First the keyboard is shown, a notification is sent to the app, notification is received, the code calculates the height of keyboard and moves up the elements according to the height.

我已经搜索并找到了已实施的解决方案.

I have searched and found the solution that I have implemented.

有人可以帮忙吗?

推荐答案

我在我的应用程序中经常使用此技巧.您想听UIKeyboardWillShowNotificationUIKeyboardWillHideNotification. 我认为处理动画的最佳方法是使用自动布局.当您调用[self.view layoutIfNeeded]时;您的视图将随键盘动画一起移动.不需要动画块.

I use this trick a lot in my apps. You want to listen to UIKeyboardWillShowNotification and UIKeyboardWillHideNotification. The best way to handle animation in my opinion is using autolayout. When you call [self.view layoutIfNeeded]; your views will move along with the keyboard animation. No animation block needed.

我已经建立了一个简单的项目,供任何人尝试并查看其工作原理!

I've set up a simple project for anyone to try and see how it works!

- (void)addKeyboardNotificationsObserver {

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(handleKeyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(handleKeyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

}

- (void)handleKeyboardWillShow:(NSNotification *)paramNotification

{

    NSDictionary* info = [paramNotification userInfo];

    //when switching languages keyboard might change its height (emoji keyboard is higher than most keyboards). 
    //You can get both sizes of the previous keyboard and the new one from info dictionary. 

    // size of the keyb that is about to disappear
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    // size of the keyb that is about to appear
    CGSize kbSizeNew = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;

    //make adjustments to constraints here...

    //and here where's magick happen!

    [self.view layoutIfNeeded];

}

- (void)handleKeyboardWillHide:(NSNotification *)paramNotification

{
    //adjust constraints

    [self.view layoutIfNeeded];

}

这篇关于iOS键盘显示事件处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆