基于UISearchBar 我想要以下功能
没有边界, origin searchbar有圆角文本字段。这个片段代码可以使它没有边框, *但是有一个问题:如果设置了书签按钮显示,书签按钮边框似乎也被剪切了1个像素*
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(10, 5, 300, 45)];
UITextField *inputField = (UITextField *)[textField.subviews objectAtIndex:0];
inputField.backgroundColor = [UIColor clearColor];
inputField.layer.borderWidth = 5.0f;
inputField.layer.cornerRadius = 14;
inputField.layer.borderColor = [[UIColor whiteColor] CGColor];
自定义书签按钮图标
答案 0 :(得分:4)
从iOS 5开始,你就拥有了出色的UIAppearance代理,它可以让你用一行代码设置所有东西,但是如果你想要达到4或更低的目标,那么你就是自己动手 - 你就是必须创建自己的自定义视图类,或者做一些子视图黑客攻击。你已经开始使用第一个片段,但是有一个问题......
进行子视图黑客攻击的“正确”方法是迭代subviews
数组,直到找到与您正在查找的视图匹配的视图。在这种情况下,您想要做的是:
for(UIView* i in [searchBar subviews) ]{
if ([i isKindOfClass:[UITextField class]]) {
//success! do what you want to do and break
break;
}
}
//maybe put some code here if you didn't find what you were looking for
子视图黑客攻击的问题在于视图层次结构可以随时更改,而不会发出警告,并且突然(充其量)您的应用程序看起来不一样或(最坏)它崩溃。出于这个原因,我建议你自己动手或者只针对iOS 5,这些东西都非常简单。
答案 1 :(得分:3)
从iOS 7开始,由Morgan Harris和wagashi提议的解决方案不再起作用,因为视图层次结构发生了变化(Morgan Harris已经在他的回答中警告过我们)。因此,这种情况不再受到影响。
如果你仍然需要通过子视图黑客来改变外观,这里有一段适用于iOS 7的更新代码:
// Make sure the searchbar has subviews
if (searchBar.subviews && searchBar.subviews.count > 0) {
// Get main searchBar view
UIView *searchBarView = [searchBar.subviews objectAtIndex:0];
// Iterate through its subviews
for (UIView* searchBarSubview in [searchBarView subviews]) {
// Check for a text field
if ([searchBarSubview isKindOfClass:[UITextField class]]) {
// Success. Now you can change its appearance.
break;
}
}
}
请注意,如果您也定位早期版本,则需要事先检查iOS版本。
如果可以的话,你应该按照Morgan Harris的建议使用UIAppearance。为方便起见,here是开发人员库参考。关于Mattt Thompson的UIAppearance也有一个很好的blog post。
答案 2 :(得分:0)
NSArray *subviews = [mySearchBar subviews] ;
for(id subview in subviews) {
if([subview isKindOfClass:[UITextField class]]) {
[(UITextField*)subview setReturnKeyType:UIReturnKeyDone];
[(UITextField*)subview setFrame:CGRectMake(0, 0, 100, 40)];
}
}
返回键完成确实有效,但不是文本框架。为什么? 顺便说一句,我的搜索栏框架设置为0,0,320,40。