二.处理文本框与键盘之间的关系(当键盘弹出遮挡到文本框的时候进行调整)
原理:
首先要明白:
1,键盘隐藏的时候,键盘上边界紧贴屏幕最低端,键盘在屏幕正下方。
2:键盘弹起的时候,键盘下边界跟屏幕下边界重合,键盘出现在屏幕最下方。
3:系统自带的键盘高度是固定的216,iOS8之后第三方的键盘,比如百度键盘高度可以任意调整。
4:当键盘弹起时,有可能会遮挡到文本框,也有可能遮挡不到。当遮挡到的时候需要处理,没遮挡的时候取消处理。
5:实现处理:(1):需要判断键盘弹起之后frame的Y值与文本框最大Y值的关系。(2):底层试图往上移动的距离 = 二者之间的差值(注意往上移动为负值)。
步骤:
1.接收系统发出的的三个通知
键盘弹起:获取两个Y值,即文本框的最大Y值和键盘弹起之后Y值。修改底层试图的transform。
键盘隐藏:取消对底层的transform的修改。
键盘frame值改变:可以获知改变的frame值,我暂时没有用到。
注意点:

1.键盘通知名都是系统自己定义好了的,不可改变。

UIKeyboardWillShowNotification

UIKeyboardWillHideNotification

UIKeyboardWillChangeFrameNotification

2.通知中传的字典类型参数

UIKeyboardAnimationCurveUserInfoKey = 7;

UIKeyboardAnimationDurationUserInfoKey ="0.25";                                    键盘弹起或隐藏动画时长

UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {414, 271}}";             键盘的bounds值

UIKeyboardCenterBeginUserInfoKey = "NSPoint: {207, 871.5}";                 键盘隐藏时中心位置

UIKeyboardCenterEndUserInfoKey = "NSPoint: {207, 600.5}";                    键盘弹起是中心位置

UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 736}, {414, 271}}";   键盘隐藏时的frame值

UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 465}, {414, 271}}";      键盘弹起时的frame值

UIKeyboardIsLocalUserInfoKey = 1;

// .m文件中的源码,可以拷贝观看

//  ViewController.m

//  Text_文本框通知

//

//  Created by mncong on 15/12/4.

//  Copyright © 2015年 mancong. All rights reserved.

//

#import "ViewController.h"

@interface ViewController () <UITextFieldDelegate>

{

UITextField *_tf;

}

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor = [UIColor grayColor];

//获取系统发出的键盘弹起的通知。

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

//获取系统发出的键盘隐藏的通知。

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

//获取系统发出的键盘frame值改变的通知。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardFrameChange:) name:UIKeyboardWillChangeFrameNotification object:nil];

//添加文本框

[self addTF];

}

#pragma mark 添加文本框

- (void)addTF

{

_tf = [[UITextField alloc] init];

_tf.translatesAutoresizingMaskIntoConstraints = NO;

_tf.delegate = self;

_tf.placeholder = @"这里就是万恶的被遮挡的文本框";

_tf.borderStyle  = UITextBorderStyleLine;

[self.view addSubview:_tf];

//可以不必在意,我为了实验vfl语句能否获取控件的frame值。可以删掉这两行,再添加frame属性。

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_tf]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_tf)]];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_tf(==40)]-100-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_tf)]];

}

#pragma mark 键盘弹起

- (void)keyboardWillShow:(NSNotification *)noti

{

NSLog(@"键盘弹起");

NSDictionary * dict = noti.userInfo;

NSLog(@"%@",dict);

/**dict:

{

UIKeyboardAnimationCurveUserInfoKey = 7;

UIKeyboardAnimationDurationUserInfoKey = "0.25";

UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {414, 271}}";

UIKeyboardCenterBeginUserInfoKey = "NSPoint: {207, 871.5}";

UIKeyboardCenterEndUserInfoKey = "NSPoint: {207, 600.5}";

UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 736}, {414, 271}}";

UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 465}, {414, 271}}";

UIKeyboardIsLocalUserInfoKey = 1;

}

*/

//获取文本框的最大Y值。

CGFloat tfMaxY = CGRectGetMaxY(_tf.frame);

//获取键盘弹起之后的Y值。

CGFloat keyboardY = [dict[UIKeyboardFrameEndUserInfoKey] CGRectValue].origin.y;

//获取键盘弹起使用的时间。

CGFloat duration = [dict[UIKeyboardAnimationDurationUserInfoKey] floatValue];

//判断是否遮挡

if (tfMaxY > keyboardY) {

//如果遮挡,添加动画,改变view的transform。

[UIView animateWithDuration:duration animations:^{

self.view.transform = CGAffineTransformMakeTranslation(0, keyboardY-tfMaxY);

}];

}

}

#pragma mark 键盘隐藏

- (void)keyboardWillHide:(NSNotification *)noti

{

//获取隐藏时间

CGFloat duration = [noti.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue];

//取消transform的改变量。

[UIView animateWithDuration:duration animations:^{

self.view.transform = CGAffineTransformIdentity;

}];

}

#pragma mark frame改变的通知

- (void)keyboardFrameChange:(NSNotification *)noti

{

NSLog(@"键盘frame改变了");

}

#pragma mark 键盘的代理方法 点击return

- (BOOL)textFieldShouldReturn:(UITextField *)textField

{

[textField resignFirstResponder];

return YES;

}

@end

iOS-UITextField-通知的更多相关文章

  1. ios 消息通知

    苹果的通知分为本地通知和远程通知,这里主要说的是远程通知 历史介绍 iOS 3 - 引入推送通知UIApplication 的 registerForRemoteNotificationTypes 与 ...

  2. iOS - Notification 通知

    1.Notification 通知中心实际上是在程序内部提供了消息广播的一种机制,它允许我们在低程度耦合的情况下,满足控制器与一个任意的对象进行通信的目的.每一个 iOS 程序(即每一个进程)都有一个 ...

  3. IOS Notification 通知中心

    1.     通知中心概述 通知中心实际上是在程序内部提供了消息广播的一种机制.通知中心不能在进程间进行通信.实际上就是一个二传手,把接收到的消息,根据内部的一个消息转发表,来将消息转发给需要的对象. ...

  4. IOS开发-通知与消息机制

    在多数移动应用中不论什么时候都仅仅能有一个应用程序处于活跃状态.假设其它应用此刻发生了一些用户感兴趣的那么通过通知机制就能够告诉用户此时发生的事情. iOS中通知机制又叫消息机制,其包含两类:一类是本 ...

  5. IOS 本地通知 UILocalNotification

    IOS 本地通知 UILocalNotification [本文章第四部分中的代码逻辑来自网上的借鉴,并非我自己原创] 大概一个月前,我开始跟着做IOS项目了.学习C++,了解Objective-C, ...

  6. IOS中通知中心(NSNotificationCenter)

    摘要 NSNotification是IOS中一个调度消息通知的类,采用单例模式设计,在程序中实现传值.回调等地方应用很广.   IOS中通知中心NSNotificationCenter应用总结 一.了 ...

  7. iOS 本地通知 操作

    iOS 本地通知 操作 1:配置通知:然后退出程序: UILocalNotification *localNotif = [[UILocalNotification alloc] init]; loc ...

  8. 提高 iOS App 通知功能启用率的三个策略

    我们都知道推送通知在 App 运营中的作用巨大.但是,很多用户却并不买帐,App 第一次启动提示是否「启用推送通知」时,他们直接选择了「否」. 是的,最近我本人就转变成了这样的人 - 认真地评估每个应 ...

  9. IOS NSNotification 通知

    一. 先看下官方对NSNotification通知的解释 1. NSNotification 通知 @interface NSNotification : NSObject <NSCopying ...

  10. iOS - Push 通知推送

    1.UserNotifications 通知是 App 用来和用户交流的一种方式,特别是当 App 并没有在前台运行的时候.通知,正如它的名称所强调的,被用作向用户'通知'一个事件,或者仅仅向用户提示 ...

随机推荐

  1. Beego源码分析(转)

    摘要 beego 是 @astaxie 开发的重量级Go语言Web框架.它有标准的MVC模式,完善的功能模块,和优异的调试和开发模式等特点.并且beego在国内企业用户较多,社区发达和Q群,文档齐全, ...

  2. AsyncTask实现断点续传

    之前公司里面项目的下载模块都是使用xUtils提供的,最近看了下xUtils的源码,它里面也是使用AsyncTask来执行异步任务的,它的下载也包含了断点续传的功能.这里我自己也使用AsyncTask ...

  3. Java中long和Long有什么区别 (转载)

    “Long is a class. long is a primitive. That means Long can be null, where long can't. Long can go an ...

  4. ThinkBox DOC

    插件源码下载 @github https://github.com/Aoiujz/ThinkBox.git 插件使用方法 引入文件 //使用ThinkBox弹出框必须引入以上三个文件. //jQuer ...

  5. MySQL vs. MongoDB: Choosing a Data Management Solution

    原文地址:http://www.javacodegeeks.com/2015/07/mysql-vs-mongodb.html 1. Introduction It would be fair to ...

  6. Drupal7_2:安装drupal

    Drupal7_2:安装drupal 分类: Drupal72012-10-30 01:06 1074人阅读 评论(0) 收藏 举报 假设你已经搭建好了所需的必备环境,接下来就参照以下几步,快速安装一 ...

  7. 图像拼接 SIFT资料合集

    转自 http://blog.csdn.net/stellar0/article/details/8741780 分类: 最近也注意一些图像拼接方面的文章,很多很多,尤其是全景图拼接的,实际上类似佳能 ...

  8. 写给已有编程经验的 Python 初学者的总结【转】

    当我开始学习Python的时候,有些事我希望我一早就知道.我花费了很多时间才学会这些东西.我想要把这些重点都编纂到一篇文章当中.这篇文章的目标读者,是刚刚开始学习Python语言的有经验的程序员,想要 ...

  9. android 开发 - 网络图片加载库 Fresco 的使用。

    概述 Fresco 是 facebook 的开源类库,它支持更有效的加载网络图片以及资源图片.它自带三级缓存功能,让图片显示更高效. 介绍 Fresco 是一个强大的图片加载组件. Fresco 中设 ...

  10. Android Studio通过JNI调用NDK程序

    NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西:另外就是为了效率更加高些,安全性更高. 如果你在Eclipse+ADT下开发过NDK就能体会到要么是配置NDK还要下载Cygwin,配 ...