当键盘出现,我想设置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