如果根据键盘的frame始终让一个控件始终在键盘的顶部

我们发现很多时候系统提供的键盘功能有限 有些功能无法实现,所以我们通常的做法就是自定义一个工具条放在键盘的顶部。

那么我们如何知道键盘的frame呢? 这个时候就需要监听键盘发出的通知,在ios中当键盘自身的frame发生改变的时候 它会发出以下通知:

键盘的frame(位置)即将改变, 就会发出UIKeyboardWillChangeFrameNotification 所以我们可以借助这个方法 获取到键盘最终的frame  拿到键盘的高度

如下代码:就监听了键盘的frame 将要改变的通知

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

实现监听方法代码如下:

/**
 * 监听键盘的frame发生改变的通知
 */
- (void)keyboardChangeFrame:(NSNotification*)note
{
    //拿到键盘最终的frame
    CGRect frame = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];

    //拿到键盘弹出的时间
    CGFloat duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];

    [UIView animateWithDuration:duration animations:^{

        self.toolBar.transform = CGAffineTransformMakeTranslation(0, frame.origin.y - ScreenH );

    }];

}

还有另外一种方法也可以达到同样的效果,那就是监听键盘的弹出和隐藏

如下代码时间了监听监听的弹出和隐藏的通知:

    // 键盘即将弹出, 就会发出UIKeyboardWillShowNotification
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    // 键盘即将隐藏, 就会发出UIKeyboardWillHideNotification
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

具体的监听方法实现代码如下:

/**
 * 监听键盘即将显示的通知
 */
- (void)keyboardWillShow:(NSNotification*)noto
{
    //获取键盘弹出的时间
    CGFloat duration = [noto.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    //取出键盘的高度
    CGRect keyboardF = [noto.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGFloat keyboardH = keyboardF.size.height;

    //执行动画跳转工具栏条的Y值
    [UIView animateWithDuration:duration animations:^{
        self.toolBar.transform = CGAffineTransformMakeTranslation(0, -keyboardH);
    }];

}
/**
 * 监听键盘即将隐藏的通知
 */
- (void)keyboardWillHide:(NSNotification*)noto
{
    //获取键盘弹出的时间
    CGFloat duration = [noto.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];

    //让工具条的transform复位
    [UIView animateWithDuration:duration animations:^{
        self.toolBar.transform = CGAffineTransformIdentity;
    }];

}

自己实现的新浪微博的发布微博界面如下:

时间: 2024-08-06 16:06:39

如果根据键盘的frame始终让一个控件始终在键盘的顶部的相关文章

ios--控件--自定义封装一个控件

感谢原作者的分享: http://blog.csdn.net/zhangao0086/article/details/45622875 前言 一个控件从外在特征来说,主要是封装这几点: 交互方式 显示样式 数据使用 对外在特征的封装,能让我们在多种环境下达到 PM 对产品的要求,并且提到代码复用率,使维护工作保持在一个相对较小的范围内:而一个好的控件除了有对外一致的体验之外,还有其内在特征: 灵活性 低耦合 易拓展 易维护 通常特征之间需要做一些取舍,比如灵活性与耦合度,有时候接口越多越能适应各

[C#]Winform下回车或Tab键自动切换下一个控件焦点

满足用户体验,在数据录入时,能在输入完一个信息后通过回车或Tab键自动的切换到下一个控件(字段). 在界面控件设计时,默认可以通过设置控件的TabIndex来实现.但在布局调整时或者是对输入的内容有选择性时,从用代码的方式来处理显得更好维护一点. 完整的实现方法如下: /// <summary> /// 回车.Tab键盘切换或执行操作 /// </summary> public sealed class TabEnter:IDisposable { private List<

javascript可编辑表格控件 支持全键盘操作

项目中经常会用到表格编辑控件,网上也有不少,但是确实没有完全符合我要求的, 自己写一个吧! 1.该控件支持 数据显示列,文本编辑列,选择列,下拉列,索引列,删除列 六种列类型 2.支持全键盘操作,自定义键位 包括:列焦点切换,行焦点切换,新建行,数据保存(默认 上,下,左,右 键操作) 3.丰富的事件,绝大多数的客户端操作都能触发无刷新后台事件 4.支持统计运算,可自定义运算插件 5.兼容 Ie,chorme,firefox等绝大多数主流浏览器 下载地址:http://files.cnblogs

一个控件用肉眼看不见,有哪些可能?

1.根本没有创建实例化这个控件 2.没有设置尺寸 3.控件的颜色跟父控件的背景色一样(实际上已经显示了,只不过用肉眼看不见) 4.透明度alpha <= 0.01 5.hidden = YES 6.没有添加到父控件中 7.被其他控件挡住了 8.位置不对 9.父控件发生了以上情况 10.特殊情况 * UIImageView没有设置image属性,或者设置的图片名不对 * UILabel没有设置文字,或者文字颜色和跟父控件的背景色一样 * UITextField没有设置文字,或者没有设置边框样式bo

iOS开发之通过代码自定义一个控件

关于控件的继承关系(面试重点): (1)所有的控件都继承自UIView. (2)能监听事件的都是先继承自UIControl,UIControl再继承自UIView.比如UIButton. (3)能整体滑动的都是继承自UIScrollView,UIScrollView再继承自UIView.比如UITableView. (4)UIWindow也是继承自UIView. 首先,创建控件的代码要写在 - (void)viewDidLoad{ }; 中,这个方法是在view被创建完毕后执行的方法. 1.创建

ios-当一个控件没有显示出来的时候

/** *  当一个控件没有显示出来的时候 1. 父控件的frame 2. 当前控件frame 3. 当前控件 hidden (是否为yes ) 4. alpha < = 0.01 */

IOS开发--一个控件添加后看不见 有哪些可能。

一个控件用肉眼看不见,有哪些可能 1.根本没有创建实例化这个控件 2.没有设置尺寸 3.控件的颜色跟父控件的背景色一样(实际上已经显示了,只不过用肉眼看不见) 4.透明度alpha <= 0.01 5.hidden = YES 6.没有添加到父控件中 7.被其他控件挡住了 8.位置不对 9.父控件发生了以上情况 10.特殊情况 * UIImageView没有设置image属性,或者设置的图片名不对 * UILabel没有设置文字,或者文字颜色和跟父控件的背景色一样 * UITextField没有

Android面试通过一个控件展示自己水平

说好的博客,终于要来了. 这篇文章写一下面试时我自己一般是如何展示自己技术水平的. 我是一名做Android的攻城狮,自己的面试经验还算不错,作为求职者自己的面试成功率比较高,而技术关我从来还没遇到不通过的.我面试的时候喜欢先自己展现下自己的技术,然后再是面试官提问:这样让面试官能全面充分的了解我的技术层次,接下来谈薪水待遇自己的话语权就会多一些. 首先声明一点:我不喜欢在面试的时候多谈业务逻辑.多谈项目经验.多去展示自己对具体Api的记忆之类的行为.因为你所谈的项目和业务逻辑,都是需要和别人配

ExtJs5_继承自定义一个控件

Extjs的开发都可以遵循OOP的原则,其对类的封装也很完善了.自定义一个控件最简单的办法就是继承一个已有的控件.根据上一节的需要,我做了一个Button的子类.首先根据目录结构,在app目录下建立一个ux目录,将自定义控件都放在这个目录下.在ux目录下建立一个文件ButtonTransparent.js. /** * 定义了一个背景透明的Button类,继承于Button */ Ext.define('app.ux.ButtonTransparent', { extend : 'Ext.but