2012-05-25 90 views
9

我正在創建一個類似於iPad的iMessage應用程序的應用程序,它可以進行消息傳遞。因此,在顯示鍵盤時,在消息視圖和輸入附件視圖的底部有一個輸入視圖。此外,當停放或取消鎖定鍵盤時,必須正確調整消息視圖的大小。iPad分離鍵盤

我遇到的問題是來自UIKeyboardWillChangeFrameNotification的通知數據不一致。

首先,有3種方式,用戶可以取消停靠鍵盤:

  1. 按下並按住右下鍵,然後向上滑動
  2. 按下並按住右下鍵,當屏幕上彈出菜單中選擇「取消停靠」
  3. 按下並按住右下鍵,當屏幕上彈出菜單中選擇「拆分」

情形#1,從UIKeyboardWillChangeFrameNotification預告數據是組成ENT。下面是數據:

userInfo = { 
    UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 0}, {768, 304}}"; 
} 

情形#2,#3中的數據是不一致的,這裏是我得到:

userInfo = { 
    UIKeyboardAnimationCurveUserInfoKey = 0; 
    UIKeyboardAnimationDurationUserInfoKey = "0.25"; 
    UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {768, 304}}"; 
    UIKeyboardCenterBeginUserInfoKey = "NSPoint: {384, 872}"; 
    UIKeyboardCenterEndUserInfoKey = "NSPoint: {384, 1136}"; 
    UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 0}, {768, 304}}"; 
    UIKeyboardFrameChangedByUserInteraction = 0; 
    UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, -264}, {768, 304}}"; 
} 

什麼是奇數這裏要說的是,當我下的情況下監聽UIKeyboardDidChangeFrameNotification #2或#3,數據按預期進入:

userInfo = { 
    UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 0}, {768, 304}}"; 
} 

爲什麼通知數據不同?有沒有人找到明確的方法來檢測分割鍵盤事件?

回答

3

沒有明確的方法沒有。

我在接下來的步驟解決這個麻煩:

  1. 獲取當前方向。
  2. 如果方向是橫向,那麼我會得到UIKeyboardFrameEndUserInfoKey的高度。它必須等於216.這意味着鍵盤是分割模式,否則不是;
  3. 如果方向是縱向,那麼我會得到UIKeyboardFrameEndUserInfoKey的高度。它必須等於216.這意味着鍵盤是分割模式,否則不是;

我更新我的gist for example.使用convertRect方法。

+0

自推出iPad Mini以來,這會變得更加困難。我甚至還沒有碰過iOS 7呢...... –

+2

沒什麼區別。 216不是像素,其點參數與分辨率無關。但是這不適用於iPhone 4和5.而iPhone沒有分離鍵盤。他們改變形式因素。 – Bimawa

+0

請注意,這不是一個好的解決方案。鍵盤高度根據語言環境,ios版本和設備而變化。 – capikaw

1

這是一個有點冒失,但可靠的方式來確定鍵盤是否分裂。

NSArray *classPath = @[ 
    @"KeyboardAutomatic", 
    @"KeyboardImpl", 
    @"KeyboardLayoutStar", 
    @"KBKeyplaneView", 
    @"KBSplitImageView" 
]; 
UIView *splitView = textField.inputAccessoryView.superview; 
for (NSString *className in classPath) { 
    for (UIView *subview in splitView.subviews) { 
    if ([NSStringFromClass([subview class]) rangeOfString:className].location != NSNotFound) { 
     splitView = subview; 
     break; 
    } 
    } 
} 
BOOL isSplit = [splitView.subviews count] > 1; 

顯然爲了這個工作,你需要爲UITextField/UITextView的一個非空inputAccessoryView(你可以只使用一個空的觀點)。

注:textField.inputAccessoryView.superview的行爲是相當挑剔,而且通常取決於調用superview之前已經顯示一次鍵盤。此外,爲了通過App Store提交過程,我從私有類名稱中刪除了'UI'前綴。這不是Apple保證不會標記你的應用的保證,但是這種方法之前已經成功使用。

我只在iOS7上測試過它,但如果它不適用於其他版本的iOS,可以使用類似的方法。

+0

這可能會工作,但爲什麼你訪問子視圖0 0 1 0? –

+0

因爲它遍歷視圖層次結構查找實際呈現鍵盤的私有類。我用[Reveal](http://revealapp.com)查看鍵盤視圖的狀態。見[這裏](http://imgur.com/v8rFMKP)。 – cagey

+0

在生產中使用這個確切的代碼顯然是一個壞主意,但希望答案對一些人仍然有用。 – cagey