當鍵盤出現,我想設置iPhone的UISearchBar&keyboardAppearance
keyboardAppearance = UIKeyboardAppearanceAlert
我檢查的文件,它看起來像你只能改變鍵盤類型。
這可以在不違反任何Apple私有API的情況下完成嗎?
當鍵盤出現,我想設置iPhone的UISearchBar&keyboardAppearance
keyboardAppearance = UIKeyboardAppearanceAlert
我檢查的文件,它看起來像你只能改變鍵盤類型。
這可以在不違反任何Apple私有API的情況下完成嗎?
keyboardAppearance是UITextInputTraitsProtocol的一個屬性,這意味着該屬性是通過TextField對象設置的。我不知道警報鍵盤是什麼,從SDK中它是一個適用於警報的鍵盤。
這裏是你如何訪問屬性:
UITextField *myTextField = [[UITextField alloc] init];
myTextField.keyboardAppearance = UIKeyboardAppearanceAlert;
現在,當用戶點擊文本框和鍵盤顯示出來,它應該是你想要的。
這應做到:
for(UIView *subView in searchBar.subviews)
if([subView isKindOfClass: [UITextField class]])
[(UITextField *)subView setKeyboardAppearance: UIKeyboardAppearanceAlert];
沒有發現這樣做的任何其他方式...
這不再適用於iOS 7,因爲的UISearchBar視圖層次結構發生了變化。 UITextView現在是第一個子視圖的子視圖(例如,它在searchBar.subviews[0].subviews
數組中)。
更具前景的方法是檢查整個視圖層次結構,並檢查UITextInputTraits
協議而不是UITextField
,因爲這是實際聲明該方法的原因。乾淨的做法是使用類別。首先做出的UISearchBar一個類別,增加了這種方法:
- (void) setKeyboardAppearence: (UIKeyboardAppearance) appearence {
[(id<UITextInputTraits>) [self firstSubviewConformingToProtocol: @protocol(UITextInputTraits)] setKeyboardAppearance: appearence];
}
然後在UIView的添加類別,增加了這種方法:
- (UIView *) firstSubviewConformingToProtocol: (Protocol *) pro {
for (UIView *sub in self.subviews)
if ([sub conformsToProtocol: pro])
return sub;
for (UIView *sub in self.subviews) {
UIView *ret = [sub firstSubviewConformingToProtocol: pro];
if (ret)
return ret;
}
return nil;
}
現在,您可以設置搜索欄上的鍵盤外觀相同的方式將一個文本框:
[searchBar setKeyboardAppearence: UIKeyboardAppearanceDark];
,我發現要做到這一點,如果你想這樣做在你的應用程序的最佳方式,是對的UITextField使用外觀。在啓動時將其放入AppDelegate。
[[UITextField appearance] setKeyboardAppearance:UIKeyboardAppearanceDark];
您錯過了來自UISearchBar而不是UITextField的事實。 UIKeyboardAppearanceAlert有一個透明的背景,我希望在整個應用程序中保持一致。這可以像你在UITextFields上演示的那樣實現,但是UISearchBar裏面也有一個文本字段。我想知道是否可以爲此文本字段設置鍵盤外觀。 –
我的不好。在文檔中,它看起來像沒有一個屬性或方法來設置UISearchBar類的鍵盤透明度。您只能設置鍵盤類型。 – Justin