最近做的项目中,有一个类似微博中的评论转发功能,屏幕底端有一个输入框用textView来做,当textView成为第一响应者的时候它的Y值随着键盘高度的改变而改变,保证textView紧贴着键盘,但又不会被键盘挡住。

下面是我实现的方法:(利用通知)

1
2
3
4
5
6
7
8
9
10
11
12
//
键盘通知
    //
键盘的frame发生改变时发出的通知(位置和尺寸)
    //   
UIKeyboardWillChangeFrameNotification
    //   
UIKeyboardDidChangeFrameNotification
    //
键盘显示时发出的通知
    //   
UIKeyboardWillShowNotification
    //   
UIKeyboardDidShowNotification
    //
键盘隐藏时发出的通知
    //   
UIKeyboardWillHideNotification
    //   
UIKeyboardDidHideNotification
     
    [[NSNotificationCenter
defaultCenter] addObserver:self selector:
@selector(keyboardWillChangeFrame:)
name:UIKeyboardWillChangeFrameNotification object:nil];
//在这里注册通知

下面是监听通知:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#pragma
mark - 监听方法
/**
 *
键盘的frame发生改变时调用(显示、隐藏等)
 */
-
(
void)keyboardWillChangeFrame:(NSNotification
*)notification
{
    //   
if (self.picking) return;
    /**
     notification.userInfo
= @{
     //
键盘弹出\隐藏后的frame
     UIKeyboardFrameEndUserInfoKey
= NSRect: {{0, 352}, {320, 216}},
     //
键盘弹出\隐藏所耗费的时间
     UIKeyboardAnimationDurationUserInfoKey
= 0.25,
     //
键盘弹出\隐藏动画的执行节奏(先快后慢,匀速)
     UIKeyboardAnimationCurveUserInfoKey
= 7
     }
     */
     
    NSDictionary
*userInfo = notification.userInfo;
     
    //
动画的持续时间
    doubleduration
= [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
     
    //
键盘的frame
    CGRect
keyboardF = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
     
    //
执行动画
    [UIView
animateWithDuration:duration animations:^{
        //
工具条的Y值 == 键盘的Y值 - 工具条的高度
        if(keyboardF.origin.y
> self.view.height) {
//
键盘的Y值已经远远超过了控制器view的高度
            self.toolbar.y
= self.view.height - self.toolbar.height;
//这里的<span
style="background-color: rgb(240, 240, 240);">self.toolbar就是我的输入框。</span>
 
        }else{
            self.toolbar.y
= keyboardF.origin.y - self.toolbar.height;
        }
    }];
}

当然,这里我为UIView写了一个类别,实现如下:

.h文件中声明

1
2
3
4
5
6
7
8
9
10
@interfaceUIView
(Extension)
@property(nonatomic,
assign) CGFloat x;
@property(nonatomic,
assign) CGFloat y;
@property(nonatomic,
assign) CGFloat width;
@property(nonatomic,
assign) CGFloat height;
@property(nonatomic,
assign) CGFloat centerX;
@property(nonatomic,
assign) CGFloat centerY;
@property(nonatomic,
assign) CGSize size;
@property(nonatomic,
assign) CGPoint origin;
@end

.m文件中实现(重写setter 和 getter)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
@implementationUIView
(Extension)
 
-
(
void)setX:(CGFloat)x
{
    CGRect
frame = self.frame;
    frame.origin.x
= x;
    self.frame
= frame;
}
 
-
(
void)setY:(CGFloat)y
{
    CGRect
frame = self.frame;
    frame.origin.y
= y;
    self.frame
= frame;
}
 
-
(CGFloat)x
{
    returnself.frame.origin.x;
}
 
-
(CGFloat)y
{
    returnself.frame.origin.y;
}
 
-
(
void)setCenterX:(CGFloat)centerX
{
    CGPoint
center = self.center;
    center.x
= centerX;
    self.center
= center;
}
 
-
(CGFloat)centerX
{
    returnself.center.x;
}
 
-
(
void)setCenterY:(CGFloat)centerY
{
    CGPoint
center = self.center;
    center.y
= centerY;
    self.center
= center;
}
 
-
(CGFloat)centerY
{
    returnself.center.y;
}
 
-
(
void)setWidth:(CGFloat)width
{
    CGRect
frame = self.frame;
    frame.size.width
= width;
    self.frame
= frame;
}
 
-
(
void)setHeight:(CGFloat)height
{
    CGRect
frame = self.frame;
    frame.size.height
= height;
    self.frame
= frame;
}
 
-
(CGFloat)height
{
    returnself.frame.size.height;
}
 
-
(CGFloat)width
{
    returnself.frame.size.width;
}
 
-
(
void)setSize:(CGSize)size
{
    CGRect
frame = self.frame;
    frame.size
= size;
    self.frame
= frame;
}
 
-
(CGSize)size
{
    returnself.frame.size;
}
 
-
(
void)setOrigin:(CGPoint)origin
{
    CGRect
frame = self.frame;
    frame.origin
= origin;
    self.frame
= frame;
}
 
-
(CGPoint)origin
{
    returnself.frame.origin;
}
@end

有需要的朋友可以直接用

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

iOS开发之监听键盘高度的变化 分类: ios技术 2015-04-21 12:04 233人阅读 评论(0) 收藏的更多相关文章

  1. iOS开发之监听键盘高度的变化

    最近做的项目中,有一个类似微博中的评论转发功能,屏幕底端有一个输入框用textView来做,当textView成为第一响应者的时候它的Y值随着键盘高度的改变而改变,保证textView紧贴着键盘,但又 ...

  2. ios UIKit动力 分类: ios技术 2015-07-14 12:55 196人阅读 评论(0) 收藏

    UIkit动力学是UIkit框架中模拟真实世界的一些特性. UIDynamicAnimator 主要有UIDynamicAnimator类,通过这个类中的不同行为来实现一些动态特性. 它一般有两种初始 ...

  3. 架构师速成6.7-设计开发思路-uml 分类: 架构师速成 2015-07-29 18:25 157人阅读 评论(0) 收藏

    uml是什么东西?统一建模语言,一门语言,是用来进行软件设计的一门语言. 其实一门语言的诞生并不伟大,让大多数人都使用才足够伟大.uml就是一门伟大的语言,因为目前软件设计的唯一语言就是它. UML其 ...

  4. iOS开发UITableView基本使用方法总结 分类: ios技术 2015-04-03 17:51 68人阅读 评论(0) 收藏

    本文为大家呈现了iOS开发中UITableView基本使用方法总结.首先,Controller需要实现两个delegate ,分别是UITableViewDelegate 和UITableViewDa ...

  5. iOS开发:创建真机调试证书 分类: ios相关 2015-04-10 10:22 149人阅读 评论(0) 收藏

    关于苹果iOS开发,笔者也是从小白过来的,经历过各种困难和坑,其中就有关于开发证书,生产证书,in_house证书,add_Hoc证书申请过程中的问题,以及上架发布问题.今天就着重说一下关于针对于苹果 ...

  6. iOS开发~CocoaPods使用详细说明 分类: ios相关 2015-04-01 16:45 68人阅读 评论(0) 收藏

    iOS开发-CocoaPods使用详细说明 一.概要 iOS开发时,项目中会引用许多第三方库,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用来 ...

  7. 苹果应用商店AppStore审核中文指南 分类: ios相关 app相关 2015-07-27 15:33 84人阅读 评论(0) 收藏

    目录 1. 条款与条件 2. 功能 3. 元数据.评级与排名 4. 位置 5. 推送通知 6. 游戏中心 7. 广告 8. 商标与商业外观 9. 媒体内容 10. 用户界面 11. 购买与货币 12. ...

  8. IOS之富文本编辑 分类: ios技术 2015-03-06 22:51 89人阅读 评论(0) 收藏

    之前做项目时遇到一个问题:          使用UITextView显示一段电影的简介,由于字数比较多,所以字体设置的很小,行间距和段间距也很小,一大段文字挤在一起看起来很别扭,想要把行间距调大,结 ...

  9. 浅谈IOS8之size class 分类: ios技术 2015-02-05 19:06 62人阅读 评论(0) 收藏

    文章目录 1. 简介 2. 实验 3. 实战 3.1. 修改 Constraints 3.2. 安装和卸载 Constraints 3.3. 安装和卸载 View 3.4. 其他 4. 后话 以前和安 ...

随机推荐

  1. JS 的NULL undefined 空

    null,对象不存在 var ii= document.getElementById("id"); alert(ii); 当前页面不存在id对象 undefined var i; ...

  2. Reverse complement DNA

    用法:python rev_comp.py input.fa out.fa 输入文件为 fasta 格式文件,若输入文件中序列的 header 有 '+' 或 '-' 号标记正负链,则带有 '+' 的 ...

  3. width为auto或者100%的区别

    一.四个理论 1. 某div不显示设置宽度,那么width为auto. 2. 某div的width在默认情况设置的是盒子模型中content的值 3. 某div的width为100%表示的是此div盒 ...

  4. MyEclipse8.5安装findbugs方法

    step 1:首先从官网下载findbugs插件: edu.umd.cs.findbugs.plugin.eclipse_1.3.9.20090821.zipstep 2:将解压之后的edu.umd. ...

  5. maven 教程一 入门

    摘要: (1)maven是项目管理工具,类似makefile.主要的生命阶段有 validate:验证工程是否正确,所有需要的资源是否可用.  compile:编译项目的源代码.    test:使用 ...

  6. 第13章 Swing程序组件----常用布局管理器

    在Swing中,每个组件在容器中都有一个具体的位置和大小,而在容器中摆放各种组件时很难判断其具体位置和大小.布局管理器提供了Swing组件安排.展示在容器中的方法及基本的布局功能. Swing提供的常 ...

  7. Android面试经验1

    1,java基本数据类型. Byte.short.int.long.float.double.char.boolean. 1         2       2     2      4       ...

  8. HDU 1160 FatMouse's Speed 动态规划 记录路径的最长上升子序列变形

    题目大意:输入数据直到文件结束,每行两个数据 体重M 和 速度V,将其排列得到一个序列,要求为:体重越大 速度越低(相等则不符合条件).求这种序列最长的长度,并输出路径.答案不唯一,输出任意一种就好了 ...

  9. hudson配置教程

    Hudson配置教程 hudson是个优 秀的开源工具,可惜是小日本开发的.这点不爽.拿过来用吧.我们公司(Qisda)的用途是 用来晚上定时的抓Android的代码,然后编译,保存img文件,然后根 ...

  10. (转)java 排序算法

    排序算法汇总(java实现,附源代码)   整理系统的时候发现了原来写的各种算法的总结,看了一下,大吃一惊,那时候的我还如此用心,具体的算法,有的已经模糊甚至忘记了,看的时候就把内容整理出来,顺便在熟 ...