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



写于前:

当有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所有组合情况)

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

时间: 2025-01-04 16:46:19

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

Android学习笔记二十二.使用ContentProvider实现数据共享(五).监听ContentProvider的数据改变

一.使用ContentProvider管理多媒体内容 Android提供了Camera程序来支持拍照.拍摄视频,用户拍摄的相片.视频都将存放在固定的位置.Android同样为这些多媒体内容提供了ContentProvider,所以我们可以通过使用ContentProvider实现其他应用直接访问Camera所拍摄的照片.视频等. 1.多媒体ContentProvider的Uri (1)MediaStore.Audio.Media.EXTERNAL_CONTENT_URI:存储在外部存储器(SD卡

17.swift怎么监听该属性的改变

import UIKit class Person : NSObject { var name : String? { // 可以给newValue自定义名称 willSet (new){ // 属性即将改变,还未改变时会调用的方法 // 在该方法中有一个默认的系统属性newValue,用于存储新值 print(name) print(new) } // 可以给oldValue自定义名称 didSet (old) { // 属性值已经改变了,会调用的方法 // 在该方法中有一个默认的系统属性ol

监听浏览器窗口大小的改变

<script type="text/javascript"> <!-- var winWidth = 0; var winHeight = 0; function findDimensions() //函数:获取尺寸 { //获取窗口宽度 if (window.innerWidth) { winWidth = window.innerWidth; } else if ((document.body) && (document.body.clientW

时时监听input内容的改变

心得:我们都知道inoput有一个change事件,但是是在input元素失去焦点的时候发生,不能时时的监听input内容的改变. 刚开始的时候我是想用setInterval设置计时器的原理定时监听input内容的改变,但是结果差强人意,效果一点也不好,有时候操做过快还会出现undefined的情况. 解决方法:通过阅读资料了解到input有意的input事件在大多当今主流的浏览器都能实现对input输入内容的时时监听: <input id="test"/> $("

iOS开发之监听网络连接,改变,断开

做iOS开发时,我们需要监控/监听网络状况,苹果提供了Reachability.h, Reachability.m. 导入Reachability.h 我们可以在 MainViewController的viewDidLoad方法内部写上: [self checkReachability]; 之后,具体方法如下 #pragma mark #pragma mark Reachability Methods #pragma mark - (void)checkReachability { [[NSNo

IOS开发:监听来电状态的改变。

#import <CoreTelephony/CTCallCenter.h> #import <CoreTelephony/CTCall.h> @property(nonatomic,strong)CTCallCenter *callCenter; 以下代码写在didFinishLaunchingWithOptions中. 必须将callCenter声明为成为变量,否则无法监听. self.callCenter = [[CTCallCenter alloc] init]; self

iOS 监听UITextView内容的改变

长文本输入时比较喜欢用UITextView,因为它会自动换行,比UITextField好用些,但是当需要监听text view中的内容变化时.Apple缺没有提供像UITextField那样方便的代理方法. 其实要监测text view中内容的改变也不难,只需下面三步操作,即可实现与UITextField的代理方法相似的效果. 1.在- (void) viewDidLoad:使用通知中心,给UITextView添加观察者 1 NSNotificationCenter *nc = [NSNotif

监听text等的改变事件

oninput事件是html5的标准事件,支持ie9和以上以及其他的火狐啊谷歌啊等浏览器 ie9以下的可以用onpropertychange <head>     <script type="text/javascript">     // Firefox, Google Chrome, Opera, Safari, Internet Explorer from version 9         function OnInput (event) {      

UITextView 监听 return key的改变

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { if([text isEqualToString:@"\n"]){ [self.textView endEditing:YES]; [self whenTheTextViewEndEditing]; return NO; } }