問題:
通過text field或text view等ui元件,可以讓使用者通過鍵盤輸入文字內容,不過當鍵盤顯示在螢幕上時,會遮擋住部分ui,如何避免遮擋發生呢?
1.ios 發布了很多關於螢幕上鍵盤的通知。下面列出了這些通知及相關介紹:
uikeyboardwillshownotification
當鍵盤即將要顯示的時候將會發出這個通知。這個通知包含了使用者資訊字典,裡面包括了鍵盤的各種資訊,鍵盤將以動畫的形式顯示在螢幕上。
uikeyboarddidshownotification
當鍵盤已經顯示在螢幕上時將發出這個通知。
uikeyboardwillhidenotification
當鍵盤將要從螢幕上移除時將會發出此通知。通知裡包含了使用者資訊字典,裡面包括了各種關於鍵盤資訊的詳細資訊,當鍵盤隱藏時的動畫,動畫的持續時間,等等。
uikeyboarddidhidenotification
當鍵盤完全隱藏後將發出此通知。
2.使用者資訊字典裡面包含了一些有效的鍵值。下面是字典中的一些 key:
uikeyboardanimationcurveuserinfokey
這個關鍵字的值指明了顯示和隱藏鍵盤使用的動畫型別。這個關鍵字包含了乙個 nsnumber 型別的值,此型別包含了乙個 nsuinteger 型別無符號整數
uikeyboardanimationdurationuserinfokey
這個鍵值指明了鍵盤顯示或隱藏的動畫所用的時間。這個鍵包含乙個 nsnumber 型別的 值,此類包含乙個 double 型別的雙位元組值。
uikeyboardframebeginuserinfokey
這個鍵值指明了鍵盤在動畫之前的 frame。假如鍵盤將要顯示時,在顯示之前將這個 frame 傳遞給這個動畫。假如鍵盤已經顯示了並即將要隱藏時,這個 frame 將會傳遞給這個 隱藏動畫,在鍵盤消失之前。這個鍵包含了乙個 cgrect 型別的值。
uikeyboardframeenduserinfokey
這個鍵值指明了動畫完成後的鍵盤 frame。假如鍵盤即將要顯示時,這個 frame 將會在 鍵盤完全顯示後傳遞給鍵盤。。假如鍵盤已經完全顯示,而且將要隱藏時,在完全隱藏後這 個 frame 將會傳遞給鍵盤。這個鍵值包含了乙個 cgrect 型別的值。
3.例子:
建立乙個tableview,每個cell加上textfield
- (void)viewdidload
#pragma mark - textfielddelegate
- (bool)textfieldshouldreturn:(uitextfield *)textfield
#pragma mark - tableviewdelegate
- (nsinteger)numberofsectionsintableview:(uitableview *)tableview
- (nsinteger)tableview:(uitableview *)tableview numberofrowsinsection:(nsinteger)section
- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath
result.textlabel.text = [nsstring stringwithformat:@"
cell %ld
",(long
)indexpath.row];
cgrect accessoryrect = cgrectmake(0, 0, 150, 31
); uitextfield *accessory =[[uitextfield alloc]initwithframe:accessoryrect];
accessory.borderstyle =uitextborderstyleroundedrect;
accessory.contentverticalalignment =uicontrolcontentverticalalignmentcenter;
accessory.placeholder = @"
enter text";
accessory.
delegate =self;
result.accessoryview = accessory;//
@property (nonatomic, retain) uiview *accessoryview;
return
result;
}
現在點選textfield會出現鍵盤並遮擋了tableview的有效顯示,看不到最後5-6行
我們現在要做的就是監聽 uikeyboardwillshownotification 和uikeyboardwillhidenotification 的通知,並根據情況調整 table view 的 content inset:
#pragma mark - 建立通知中心並新增監聽者,移除通知監聽者- (void
nsnotificationcenter *center =[nsnotificationcenter defaultcenter];
[center addobserver:self selector:@selector(handlekeyboardwillshow:) name:uikeyboardwillshownotification
object
:nil];
[center addobserver:self selector:@selector(handlekeyboardwillhide:) name:uikeyboardwillhidenotification
object
:nil];
}- (void
[[nsnotificationcenter defaultcenter]removeobserver:self];
}
既然已經開始監聽鍵盤通知,我們就來實現一下
監聽和通知
通知中心 基於觀察者模式 屬於foundation框架 通知 本地通知 推送通知 屬於uikit框架 通知中心是ios程式內部間的一種訊息廣播機制,主要解決程式內部不同物件間解耦 基於觀察者模式,不能跨應用程式程序通訊,通知中心接收到訊息之後會以廣播的形式通知所有監聽者。通知中心的本質是監聽乙個字串...
python 熱鍵和鍵盤監聽
熱鍵一般搭配執行緒來使用,下面我們使用執行緒池來使用熱鍵 from concurrent.futures import threadpoolexecutor from pynput import keyboard defgethwnd self print 你好 def keyboardlisten...
iPhone和ipad鍵盤高度及鍵盤響應事件
在ios3.2以後的系統中,蘋果就提供了鍵盤使用的api以及demo程式 keyboardaccessory 處理鍵盤事件的正確方法是這樣的 包括獲取鍵盤的高度以及鍵盤彈出和消失動畫的時間 1 在要使用鍵盤的檢視控制器中,接收鍵盤事件的通知 nsnotificationcenter defaultc...