UISearchBar 自定义,加背景,取消按钮背景

一:添加searchBar的两种方式:

////////////添加搜索栏方式一:直接画一个,画不好的话会覆盖别的东西/////


     self.tableView.backgroundView = [[UIView alloc] init];

    [self.tableView setBackgroundColor:[UIColor clearColor]];

    UISearchBar *mySearchBar = [[UISearchBar alloc]

                                initWithFrame:CGRectMake(0.0, 0.0, self.view.bounds.size.width, 45)];

    mySearchBar.delegate = self;

    mySearchBar.showsCancelButton = NO;

    mySearchBar.barStyle=UIBarStyleDefault;

    mySearchBar.placeholder=@"Enter Name or Categary";

    mySearchBar.keyboardType=UIKeyboardTypeNamePhonePad;

    [self.view addSubview:mySearchBar];

    [mySearchBar release];


    

/////////////添加搜索栏方式二:添加置tableView////////////////

    

    UISearchBar *searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0.0, 0.0, self.view.bounds.size.width,40)];

    searchBar.placeholder=@"Enter Name";//默认搜索框文本内容;

    searchBar.barStyle = UIBarStyleBlackTranslucent;//设置bar的风格

    searchBar.delegate = self;

    self.tableView.tableHeaderView = searchBar;//searchBar添加到tableView上;且searchBar添加到tableView的头,注意滚动出屏幕后,搜索框也不在了,只出现在首页

    searchBar.autocorrectionType = UITextAutocorrectionTypeNo;//是否自动对输入文本对象进行风格校正

    searchBar.autocapitalizationType = UITextAutocapitalizationTypeNone;//设置什么时候用大写

    

    searchBar.backgroundColor = [UIColor redColor];//设置bar的背景颜色;

    searchBar.backgroundImage = [UIImageimageNamed:@"item.png"];//修改背景图片

    searchBar.showsSearchResultsButton =YES;//是否在控件的右端显示搜索结果按钮

    searchBar.showsCancelButton = YES;

    searchBar.showsScopeBar = YES;//控制搜索栏下部的选择栏是否显示出来

    searchBar.prompt = @"ewq";//显示在控件顶部的一行提示文字

    searchBar.translucent = YES;//指定控件是否会有透视效果

二、searchBar的结构了解:

 

iPhone开发UISearchBar学习是本文要学习的内容,主要介绍了UISearchBar的使用,不多说,我们先来看详细内容。关于UISearchBar的一些问题。

1、修改UISearchBar的背景颜色

 

UISearchBar是由两个subView组成的,一个是UISearchBarBackGround,另一个是UITextField. 要IB中没有直接操作背景的属性。方法是直接将 UISearchBarBackGround移去  (主要是了解这段话,其实换背景图片和背景颜色可以直接换。了解后可用于换searchBar的样式)

 

    for (UIView *subview in searchBar.subviews)

    {

        if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")])

        {

            [subview removeFromSuperview];

            break;  

        }   

    }

    

第二种解决的方法:

[[searchBar.subviews objectAtIndex:0]removeFromSuperview];

换cancel的样式:

 

for(id cc in [searchBar subviews])

    {

        if([cc isKindOfClass:[UIButton class]])

        {

            UIButton *btn = (UIButton *)cc;

            [btn setTitle:@"取消"  forState:UIControlStateNormal];

        }

        

    }

三、serarBar的属性及代理:

 

 

属性: 作用
UIBarStyle barStyle 控件的样式
id delegate 设置控件的委托
NSString *text 控件上面的显示的文字
NSString *prompt 显示在顶部的单行文字,通常作为一个提示行
NSString *placeholder 半透明的提示文字,输入搜索内容消失
BOOL showsBookmarkButton 是否在控件的右端显示一个书的按钮(没有文字的时候)
BOOL showsCancelButton 是否显示cancel按钮
BOOL showsSearchResultsButton 是否在控件的右端显示搜索结果按钮(没有文字的时候)
BOOL searchResultsButtonSelected 搜索结果按钮是否被选中
UIColor *tintColor bar的颜色(具有渐变效果)
BOOL translucent 指定控件是否会有透视效果
UITextAutocapitalizationType
autocapitalizationType
设置在什么的情况下自动大写
UITextAutocorrectionType
autocorrectionType
对于文本对象自动校正风格
UIKeyboardType
keyboardType
键盘的样式
NSArray *scopeButtonTitles 搜索栏下部的选择栏,数组里面的内容是按钮的标题
NSInteger selectedScopeButtonIndex 搜索栏下部的选择栏按钮的个数
BOOL showsScopeBar 控制搜索栏下部的选择栏是否显示出来

代理列表: 

 

编辑代理

 

  • – searchBar:textDidChange:

  • – searchBar:shouldChangeTextInRange:replacementText:

  • – searchBarShouldBeginEditing:

  • – searchBarTextDidBeginEditing:

  • – searchBarShouldEndEditing:

  • – searchBarTextDidEndEditing:

点击按钮

  • – searchBarBookmarkButtonClicked:

  • – searchBarCancelButtonClicked:

  • – searchBarSearchButtonClicked:

  • – searchBarResultsListButtonClicked:

范围代理

  • – searchBar:selectedScopeButtonIndexDidChange:

  • 利用UISearchBar的委托事件 textDidChange, 当在搜索框中输入完成后,如果输入的文本长度>0,可以调用自己的搜索方法,得到搜索结果,然后再reloadData,刷新一下。如果输入文本长 度<0,则需要恢复到原始数据。这个方法可以在边输入搜索文本边显示结果。 如果需要按“search”按钮再搜索,则将上述操作放在searchBarSearchButtonClicked中。


  • searchBar的范围控件showsScopeBar,官方学名叫Scope Buttons。
    首先就要设置这个属性:
    self.searchBar.showsScopeBar = YES;
    然后要给他添加按钮。比如说,这样:self.searchBar.scopeButtonTitles = [NSArray arrayWithObjects:@"BOY",@"GIRL",@"ALL",nil];
    还有一个很重要的事情就是我们要实现这个代理UISearchBarDelegate里的这个方法searchBar:selectedScopeButtonIndexDidChange:。告诉表格,你选择的范围是啥。
    还有要是设置默认选择哪个按钮的话,要设置这个属性,像这样就是默认选中第1个啦。
    self.searchBar.selectedScopeButtonIndex = 0;

四、UISearchDisplayController使用:

利用UISearchDisplayController可以简化很多操作,也能达到搜索的目的。

 

属性:

active————是搜索界面可视化,默认为no,可用setActive方法设置.

delegate————委托

searchBar————在searchdisplaycontroller初始化后,searchbar是不可修改的,是readonly属性的.

searchContentController————管理搜索内容的试图控制器,一般是一个UITableViewController的实例,意思是针对一个UITableView的内容进行搜索

searchResultsDataSource————搜索结果的数据源

searchResultsDelegate————搜索结果的委托

searchResultsTableView————搜索结果要展示在哪个tableview中(read-only);

searchResultsTitle————搜索结果视图的title

 

初始化一个searchDisplayController:

在正常初始化完一个searchBar后再加上如下代码:     

      UISearchDisplayController * searchdispalyCtrl = [[UISearchDisplayController  alloc] initWithSearchBar:theSearchBar contentsController:self];

        searchdispalyCtrl.active = NO;

        searchdispalyCtrl.delegate = self;

        searchdispalyCtrl.searchResultsDelegate=self;

        searchdispalyCtrl.searchResultsDataSource = self;

 

使用UISearchDisplayDelegate的委托方法进行搜索操作:

1.搜索状态改变:

  • – searchDisplayControllerWillBeginSearch:

  • – searchDisplayControllerDidBeginSearch:

  • – searchDisplayControllerWillEndSearch:

  • – searchDisplayControllerDidEndSearch:

2.装载和卸载tableview:

  • – searchDisplayController:didLoadSearchResultsTableView:

  • – searchDisplayController:willUnloadSearchResultsTableView:

3.显示和隐藏tableview:

  • – searchDisplayController:willShowSearchResultsTableView:

  • – searchDisplayController:didShowSearchResultsTableView:

  • – searchDisplayController:willHideSearchResultsTableView:

  • – searchDisplayController:didHideSearchResultsTableView:

4.搜索条件改变时响应:

  • – searchDisplayController:shouldReloadTableForSearchString:  

  • – searchDisplayController:shouldReloadTableForSearchScope:

 

searchDisplayController 自身有一个searchResultsTableView,所以在执行操作的时候首先要判断是否是搜索结果的tableView,如果是显示的就是搜索结 果的数据,如果不是,是TableView自身的view,则需要显示原始数据。

  if(tableView == self.searchDisplayController.searchResultsTableView)

    {

        arr = [self.filterContent valueForKey:key]; //搜索结果

    }

    else 

    {

        arr = [self.localresource valueForKey:key];  //原始数据

    }

 

这样就不需要每次都realoadData了。




UISearchBar *searchBar=[[UISearchBaralloc]initWithFrame:CGRectMake(0, 0, 320, 44)];

 
    [searchBarsetBackgroundColor:[UIColor clearColor]];
      //[searchBarsetTintColor:[UIColor clearColor]];
      searchBar.autocorrectionType=UITextAutocorrectionType No;
      searchBar.autocapitalizationType=UITextAutocapitalization TypeNone;
      searchBar.keyboardType=UIKeyboardTypeDefault;
      searchBar.placeholder=[NSStringstringWithCString:"输入城市名字"  encoding:NSUTF8StringEncoding];
     
      searchBar.showsCancelButton=YES;
      searchBar.delegate=self;
      searchBar.tag=100;
      searchBar.showsCancelButton=NO;//是否显示取消按钮
      //定义取消按钮
      for (UIView*searchbuttons in searchBar.subviews)
      {
              if ([searchbuttons isKindOfClass:[UIButton class]])
              {
                      UIButton *cancelButton = (UIButton*)searchbuttons;
                      cancelButton.enabled = YES;
                      [cancelButton setBackgroundImage:[UIImageimageNamed:@"search_bg.png"]forState:UIControlStateNormal];//背景
                  [cancelButton setTitle:@"取消"  forState:UIControlStateNormal];//文字
                      break;
              }
      }
      //5.0添加背景backggroundView
      //UIImage*img = [[UIImage imageNamed:@"search_bg.png"]stretchableImageWithLeft CapWidth:1 topCapHeight:0]; 
//      [searchsetBackgroundImage:img];
     
     
      //5.0之前,,添加背景-----删除searchBar的背景视图
      for (UIView*subview in searchBar.subviews)   
      { 
            if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) 
            {  
                  [subviewremoveFromSuperview];     
                  break;  
            }  
      } 
     
      UIImageView*searBarImg=[[UIImageView alloc]initWithImage:[UIImageimageNamed:@"search_bg.png"]];
      searBarImg.userInteractionEnabled=YES;
      searBarImg.frame=CGRectMake(0, 0, 320, 44);
      [self.viewaddSubview:searBarImg];
     
      //删除searchBar输入框的背景
      UITextField*searchField = nil;
     
      for (UIView*subview  in searchBar.subviews) {
           
              if ([subview isKindOfClass:[UITextField class]]) {
                 
                      searchField = (UITextField*)subview;
                 
                      searchField.leftView=nil;
                 
                      [searchField setBackground:nil];
                 
                      // [searchField setBackgroundColor:[UIColor clearColor]];
                 
                      [searchField setBorderStyle:UITextBorderStyleNone];
                 
                      break;
                 
              }
           
      }
     
     
      [searBarImgaddSubview:searchBar];

你可能感兴趣的:(UISearchBar 自定义,加背景,取消按钮背景)