隐藏键盘时避免出现空白区域的BUG
2013-11-14 17:45
225 查看
转载:http://blog.csdn.net/kmyhy/article/details/7568026
iPhone软键盘占据216像素高,这对于iPhone仅仅320*480像素的屏幕来说,不能说不是一个很糟糕的事情。 为了避免输入控件被弹出的216像素高的软键盘所遮挡,程序员们想出了各种各样的方式,在软键盘弹出时调整窗口视图的尺寸。
程序员们普遍采用的一种方式,是监听软键盘事件。当软键盘弹出时,窗体的View被上移,当软键盘隐藏时,窗体的View恢复原来位置,这样就避免了输入控件被遮挡。
但是,由于SDK的原因,在View移动的过程中,会导致一个“20像素Bug”的问题。即键盘隐藏后,View下移的位置会偏离原来位置20个像素。这个Bug最直观的表现是,View的最下端露出了20像素的空白。
解决20像素的bug的方法很简单,就是在隐藏键盘时,手动将View的 y坐标下移20像素。
但是,对于另一种情况,我们做这样的调整则是多余的,它反而会在View的上端露出20像素空白。
SDK的这种Bug让我们无所适从。到底什么时候需要调整View的20像素,什么时候不需要调整呢?
问题就在于状态栏上。状态栏是否可视,直接影响这20像素是否需要调整。很显然,当statusBarHidden为NO(默认)时,view的有效高度为480,否则view的有效高度只有460而已。我们在xib中设计view的位置的时候,不管statusbar是否为None,view的origin都是(0,0),但SDK在加载xib之后,会根据statusBarHidden的属性自动调整view的位置,使得view最上端的20像素不会被状态栏所遮盖。
也就是说,当statusBarHidden为NO时,虽然我们在IB中看到view的origin是(0,0),但实际运行时,view的origin已经被SDK调整为正确的(20,0)。
因此,在键盘隐藏时,程序员不应该把view移动到(0,0)处,而应该调整到(20,0)处。因为SDK已经不会为我们做这件事情,我们得用自己的代码来做。
当然,如果你确实不需要在你的app中显示一个状态栏,我们会在application:didfinishLaunchWithOption:方法中这样做 :
[[UIApplicationsharedApplication]
setStatusBarHidden:YESwithAnimation:UIStatusBarAnimationNone];
注意,setStatusBarHidden:animated方法现在已经被新的方法所代替。
如果是这样,我们没有必要将view的位置调整到(20,0)。我们可以在代码中通过判断statusBarHidden的值来决定是否需要调整20像素。
int bug20px=([[UIApplicationsharedApplication]isStatusBarHidden]?0:20);
注意,statusBarHidden属性很奇怪,它既不是view的属性,也不是window的属性,而是UIApplication的属性。
另外还有一个问题,如果ViewController如果是使用NavigationController负责导航的,则这20像素也不需要调整。
int bug20px=([[UIApplicationsharedApplication]isStatusBarHidden]||viewController.navigationController?0:20);
iPhone软键盘占据216像素高,这对于iPhone仅仅320*480像素的屏幕来说,不能说不是一个很糟糕的事情。 为了避免输入控件被弹出的216像素高的软键盘所遮挡,程序员们想出了各种各样的方式,在软键盘弹出时调整窗口视图的尺寸。
程序员们普遍采用的一种方式,是监听软键盘事件。当软键盘弹出时,窗体的View被上移,当软键盘隐藏时,窗体的View恢复原来位置,这样就避免了输入控件被遮挡。
但是,由于SDK的原因,在View移动的过程中,会导致一个“20像素Bug”的问题。即键盘隐藏后,View下移的位置会偏离原来位置20个像素。这个Bug最直观的表现是,View的最下端露出了20像素的空白。
解决20像素的bug的方法很简单,就是在隐藏键盘时,手动将View的 y坐标下移20像素。
但是,对于另一种情况,我们做这样的调整则是多余的,它反而会在View的上端露出20像素空白。
SDK的这种Bug让我们无所适从。到底什么时候需要调整View的20像素,什么时候不需要调整呢?
问题就在于状态栏上。状态栏是否可视,直接影响这20像素是否需要调整。很显然,当statusBarHidden为NO(默认)时,view的有效高度为480,否则view的有效高度只有460而已。我们在xib中设计view的位置的时候,不管statusbar是否为None,view的origin都是(0,0),但SDK在加载xib之后,会根据statusBarHidden的属性自动调整view的位置,使得view最上端的20像素不会被状态栏所遮盖。
也就是说,当statusBarHidden为NO时,虽然我们在IB中看到view的origin是(0,0),但实际运行时,view的origin已经被SDK调整为正确的(20,0)。
因此,在键盘隐藏时,程序员不应该把view移动到(0,0)处,而应该调整到(20,0)处。因为SDK已经不会为我们做这件事情,我们得用自己的代码来做。
当然,如果你确实不需要在你的app中显示一个状态栏,我们会在application:didfinishLaunchWithOption:方法中这样做 :
[[UIApplicationsharedApplication]
setStatusBarHidden:YESwithAnimation:UIStatusBarAnimationNone];
注意,setStatusBarHidden:animated方法现在已经被新的方法所代替。
如果是这样,我们没有必要将view的位置调整到(20,0)。我们可以在代码中通过判断statusBarHidden的值来决定是否需要调整20像素。
int bug20px=([[UIApplicationsharedApplication]isStatusBarHidden]?0:20);
注意,statusBarHidden属性很奇怪,它既不是view的属性,也不是window的属性,而是UIApplication的属性。
另外还有一个问题,如果ViewController如果是使用NavigationController负责导航的,则这20像素也不需要调整。
int bug20px=([[UIApplicationsharedApplication]isStatusBarHidden]||viewController.navigationController?0:20);
相关文章推荐
- Android 中单击空白区域隐藏键盘
- ios点击键盘以外空白区域隐藏键盘
- UINavigationController使用时,导航栏隐藏时出现空白黑色区域?
- iOS点击键盘以外空白区域隐藏键盘的常见方法
- android朋友圈监听键盘状态 点击空白区域隐藏键盘
- IOS点击键盘以外空白区域隐藏键盘的4种常见写法
- iOS点击空白区域隐藏键盘
- IOS(1) 点击空白区域隐藏(关闭)键盘
- ios 有scrollview的时候点击键盘以外空白区域隐藏键盘
- android 监听软键盘弹起和关闭状态与点击空白区域软键盘隐藏
- Android中单击空白区域隐藏键盘
- Android中单击空白区域隐藏键盘
- 点击 空白区域 隐藏 软键盘
- IOS 单指点击空白区域隐藏键盘(贴项目中的代码,未整理)UITapGestureRecognizer
- 安卓隐藏键盘与点击空白区域隐藏键盘
- Android中单击空白区域隐藏键盘
- 在Android Studio中隐藏标题出现BUG
- 关于键盘出现与隐藏时调整UITextField的显示位置问题
- 进入Activity时,隐藏默认出现的键盘。
- IE7下父元素及子元素的隐藏顺序不当带来的display:none出现BUG