UI 監聽和響應鍵盤通知

2022-08-14 01:42:15 字數 4334 閱讀 1128

問題:

通過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...