iOS开发TextField根据键盘自适应位置

- (void)setNotification {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
}
- (void)closeNotification
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillChangeFrameNotification object:nil];
}

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

    NSDictionary *dict = [notification userInfo];
    // 键盘弹出和收回的时间
    CGFloat duration = [[dict objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];
    // 键盘初始时刻的frame
    CGRect beginKeyboardRect = [[dict objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
    // 键盘停止后的frame
    CGRect endKeyboardRect = [[dict objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    // 相减为键盘高度
    CGFloat yOffset = endKeyboardRect.origin.y - beginKeyboardRect.origin.y;

    // 创建appDelegate单例对象
    AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    // 初始化一个数组,UIWindow的所有子视图
    NSArray *array = appDelegate.window.subviews;
    // 获取当前Controller的view视图
    UIView *view = appDelegate.window.subviews[array.count - 1];
    // textField相对于UIWindow的frame
    CGRect selfFrameFromUIWindow = [self convertRect:self.bounds toView:appDelegate.window];
    // textField底部距离屏幕底部的距离
    CGFloat bottomHeight = [UIScreen mainScreen].bounds.size.height - selfFrameFromUIWindow.origin.y - selfFrameFromUIWindow.size.height;

    // 初始化一个frame,大小为UIWindow的frame
    CGRect windowFrame = appDelegate.window.frame;
    // 把这个frame的y值增加或减少相应的高度(这里的40是textField底部和键盘顶部的距离)
    windowFrame.origin.y += yOffset + bottomHeight - 40;
    // 根据yOffset判断键盘是弹出还是收回
    if (yOffset < 0) {
        // 键盘弹出,改变当前Controller的view的frame
        [UIView animateWithDuration:duration animations:^{
            view.frame = windowFrame;
        }];
    } else {
        // 键盘收回,把view的frame恢复原状
        [UIView animateWithDuration:duration animations:^{
            view.frame = appDelegate.window.frame;
        }];
    }
}

时间: 2024-10-14 00:45:50

iOS开发TextField根据键盘自适应位置的相关文章

iOS 开发之 - 关闭键盘 退出键盘 的5种方式

iOS 开发之 - 关闭键盘 退出键盘 的5种方式 1.点击编辑区以外的地方(UIView) 2.点击编辑区域以外的地方(UIControl) 3.使用制作收起键盘的按钮 4.使用判断输入字元 5.关于键盘遮蔽的问题 1,点击编辑区以外的地方(UIView) 这是一种很直觉的方法,当不再需要使用虚拟键盘时,只要点击虚拟键盘和编辑区域外的地方,就可以将键盘收起,下面程式码是在 UIView 中内建的触碰事件方法函式,您可以参考 Touch Panel / 触碰萤幕 / 压力感应器的基本使用方式一文

iOS开发之软键盘使用小技巧

在iOS开发过程中,有时候需要弹出软键盘进行输入,有时候又需要在某些情况下隐藏软键盘,以提高用户体验.今天有几个关于软键盘的小技巧和大家分享. (1)只弹出数字键盘 有某些需求中,要求用户只能在Text Field中只能输入数字,这需要怎么做呢?可以写一个正则表达式用于判断用户输入:或者进行字符匹配等等.但是这都要写代码.程序员都是爱偷懒的.在iOS中可以通过简单设置,使弹出为数字键盘,这样用户输入就只能为数字了. 选中某个Text Field.选择右侧的Show the Attributes

iOS开发-自动隐藏键盘及状态栏

1.隐藏状态栏 iOS升级至7.0以后,很多API被废止,其中原有隐藏状态栏StatusBar的方法就失效了. 原有方案 [[UIApplication sharedApplication] setStatusBarHidden:YES]; 但很不幸,在后来的版本中实效了,因此我们可以使用新的API来实现隐藏状态的栏的目的,如下: -(BOOL)prefersStatusBarHidden { return YES; } 2.自动隐藏键盘并自动布局 这里提供的解决方案适用于任何类型的键盘,主要是

iOS:iOS开发中用户密码保存位置

原文来自简书:http://www.jianshu.com/p/4af3b8179136/comments/1294203 如果要实现自动登录,不必每次打开应用都去登录,我们势必要把密码保存到本地.一般我们的操作是:每次打开应用后,如果存在密码,直接进入界面,然后再进行后台密码验证.如果没网络,我们可以跳过验证:如果有网络,我们可以后台去验证帐号密码的正确性,并根据服务器的response做一些操作. 为什么直接把密码存储在NSUserDefaults中不安全? iOS中沙盒有哪几个文件夹,都是

iOS开发——高级UI—OC篇&amp;退出键盘

退出键盘 iOS开发中键盘的退出方法用很多中我们应该在合适的地方使用合适的方法才能更好的提高开发的效率和应用的性能 下面给大家介绍几种最常用的键盘退出方法,基本上iOS开发中的键盘退出方法都是这几种中的一种活着几种. 一:textView 1 //通过委托来实现放弃第一响应者 2 #pragma mark - UITextView Delegate Method 3 -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(N

iOS开发自定义键盘回车键Return Key

在iOS开发中,用户在进行文本输入的时候,往往会用到虚拟键盘上的回车键,也就是Return Key.回车键有时候可以是"完成"(表示输入结束),可以是"下一项"(连续信息输入),可以是"搜索"(网页中输入),可以是"发送"(邮件输入),可以是"加入"(比如连接Wi-Fi),等等.我们需要怎么设置呢?方法如下: (1)选中一个Text Field,点击右侧的"Show the Attributes

iOS开发之如何获取各种控件的输入值

如何对各种控件进行操作,获取值以及赋值操作是iOS开发中最基本的技能,现在我们对输入框(Text Field),分段控件(Segmented Control),日期控件(Date Picker),滑块(Slider),开关控件(Switch),文本输入(Text View)等控件进行操作.通过一个小例子来进行该功能,用户输入个人信息,然后程序再把输入的信息获取并显示. (1)界面设计如下: . (2)把界面中的控件绑定到代码中,Outlet属性如下: . (3)把滑块和确定按钮设置Action动

IOS开发隐藏键盘的4种方法

IOS开发隐藏键盘的4种方法 开发的app中常会用到键盘输入完成后隐藏键盘的情况.在此总结了4种方法来实现我们的目的. 方法一--delegate方式 第一种隐藏键盘的方法,称为delegate三步法: 1. 遵循(委托/代理); 2. 调用; 3. 关联头文件(ViewController.h)中遵循代理 . 代码如下: #import <UIKit/UIKit.h> @interface ViewController : UIViewController<UITextFieldDel

IOS开发之自定义系统弹出键盘上方的view

IOS开发之自定义系统弹出键盘上方的view 分类: IOS 2014-11-18 09:26 1304人阅读 评论(0) 收藏 举报 目录(?)[+] 这篇文章解决的一个开发中的实际问题就是:当弹出键盘时,自定义键盘上方的view.目前就我的经验来看,有两种解决方法.一个就是利用 UITextField或者UITextView的inputAccessoryView属性,另一种,就是监听键盘弹出的notification来自 己解决相关视图的位置问题. 第一种解决方法相对比较简单,第二种的方法中