转载: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);