如何为iPhone定制UISearchBar

时间:2011-07-07 07:03:34

标签: iphone uisearchbar

基于UISearchBar 我想要以下功能

  1. 没有边界, 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];
    
  2. 自定义书签按钮图标

  3. 占位符textColor 我不知道这个。有人有线索吗?

3 个答案:

答案 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 Harriswagashi提议的解决方案不再起作用,因为视图层次结构发生了变化(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。