码迷,mamicode.com
首页 > 其他好文 > 详细

Keyboard、In-Call Status Bar的监听及视图位置改变调整(实例说明)

时间:2015-07-16 22:24:03      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:ios开发   通知模式   status-bar   frame   keyboard   


写于前:
当有textField的时候,键盘出现时,需要改变其他视图的frame,以及来电时In-Call Status Bar的出现也会影响其他视图的frame,那么通过通知模式,来观察两者的变化,并当其变化时进行一些操作。


代码思路:(视图frame的调整,以创建一个简单toolBar为例来实现)
1、底栏的创建,其中textField设置代理,遵循
2、UITextFieldDelegate协议,设置点击return返回键盘消失
3、通知的注册
4、通知的移除,在viewWillDisappear函数中移除
5、showKeyBoard,hideKeyBoard,statusBarChange分别监测到改变后执行的函数,此例修改bottom的frame,其他操作也可以在此处进行,此例的设置,可以实现statusBar和键盘之间任意情况的组合,不影响bottom的视图位置
(效果图在结尾)


#import "ViewController.h"

#define kwidth [UIScreen mainScreen].bounds.size.width
#define kheight [UIScreen mainScreen].bounds.size.height
#define kbottom 49

@interface ViewController ()
{
    UIView *_bottomView;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor grayColor];
    [self _creatBottomBar];       //创建底栏
    [self _notificationSet];      //通知注册
}

- (void)_notificationSet {
    //监听键盘事件——出现
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(showKeyBoard:) name:UIKeyboardWillShowNotification object:nil];
    //监听键盘事件——消失
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(hideKeyBoard:) name:UIKeyboardDidHideNotification object:nil];
    //监听状态栏的改变
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(statusBarChange:) name:UIApplicationWillChangeStatusBarFrameNotification object:nil];
}

- (void)_creatBottomBar {
    //自定制
    _bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, kheight-kbottom, kwidth, kbottom)];
    _bottomView.backgroundColor = [UIColor darkGrayColor];

    //输入框
    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 5, kwidth-20, 40)];
    textField.background = [UIImage imageNamed:@"chat_bottom_textfield"];
    //设置代理,要遵循协议UITextFieldDelegate
    textField.delegate = self;
    [_bottomView addSubview:textField];

    [self.view addSubview:_bottomView];
}

当键盘出现时进行的操作

- (void)showKeyBoard:(NSNotification *)notification {
//    NSLog(@"%@",notification.userInfo);     //可以打印看看里面有哪些细节
    NSValue *rectValue = [notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
    CGRect keyboardRect = [rectValue CGRectValue];
    CGRect keyboardFrame = [self.view convertRect:keyboardRect fromView:[[UIApplication sharedApplication] keyWindow]];
    CGFloat keyboardHeight = keyboardFrame.size.height;

    //记录前一次的bottomView的位置
    CGFloat lastBottomY = _bottomView.frame.origin.y;
    //调整frame
    _bottomView.frame = CGRectMake(0, lastBottomY-keyboardHeight, kwidth, kbottom);
}

当键盘隐藏时进行的操作:

- (void)hideKeyBoard:(NSNotification *)notification {
    NSValue *rectValue = [notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
    CGRect keyboardRect = [rectValue CGRectValue];
    CGRect keyboardFrame = [self.view convertRect:keyboardRect fromView:[[UIApplication sharedApplication] keyWindow]];
    CGFloat keyboardHeight = keyboardFrame.size.height;

    CGFloat lastBottomY = _bottomView.frame.origin.y;
    _bottomView.frame = CGRectMake(0, lastBottomY+keyboardHeight, kwidth, kbottom);
}

In-Call Status Bar的变化:

- (void)statusBarChange:(NSNotification *)notification {
    //获取变化参数
    NSValue *rectValue = [notification.userInfo objectForKey:UIApplicationStatusBarFrameUserInfoKey];
    CGRect statusRect = [rectValue CGRectValue];
    CGRect statusFrame = [self.view convertRect:statusRect fromView:[[UIApplication sharedApplication]keyWindow]];
    CGFloat statusHeight = statusFrame.size.height-20;

    //修改
    CGFloat lastBottomY = _bottomView.frame.origin.y;
    if (statusHeight == 0) {
        _bottomView.frame = CGRectMake(0, lastBottomY+20, kwidth, kbottom);
    }else {
        _bottomView.frame = CGRectMake(0, lastBottomY-statusHeight, kwidth, kbottom);
    }
}

观察者移除

- (void)viewWillDisappear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillChangeStatusBarFrameNotification object:nil];
    NSLog(@"解除通知");
}

单击键盘return键,键盘消失

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}

效果图:(正常实现所有Keyboard和In-Call Satus Bar所有组合情况)
技术分享

技术分享

技术分享

版权声明:本文为博主原创文章,未经博主允许不得转载。

Keyboard、In-Call Status Bar的监听及视图位置改变调整(实例说明)

标签:ios开发   通知模式   status-bar   frame   keyboard   

原文地址:http://blog.csdn.net/zsk_zane/article/details/46916115

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!