隱藏鍵盤時避免出現空白區域的BUG

轉載: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);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章