自定义SearchBar iOS

时间:2015-08-23 09:10:47

标签: ios objective-c swift uisearchbar searchbar

我正在尝试创建自定义搜索栏,以便我可以

  1. 左对齐搜索图像
  2. 将教科书的角落更加圆润。
  3. 图像左对齐后,占位符文本也可以左对齐
  4. 更改搜索文字的颜色
  5. 然而,即使在继承UISearchBar之后,我也无法实现我想要的并面临以下问题:

    • 调试时,我可以在视图和视图中看到UISearchBar。在其中的searchField,但在self.subViews上迭代并检查元素是否为UITextField时,我什么也得不到。重新检查,我总是得到一个subView,其内存地址与调试模式下的搜索栏不同

      var customSearchBar:UISearchBar?
      var searchField:UITextField?
      var button:UIButton?
      
      override func layoutSubviews() {
      for subView in self.subviews {
          if (subView.isKindOfClass(UITextField)) {
              searchField = (subView as! UITextField)
              break
          }
      }
      
      if ((searchField) != nil) {
          searchField?.textColor = UIColor.redColor() //Testing if code works?
      }
      
      super.layoutSubviews()
      }
      
    • 我不想使用无证件的方式,几乎尝试了我在这里找到的所有方法,但没有取得任何成功

    请帮助我。我正在使用Xcode 7和iOS 8

2 个答案:

答案 0 :(得分:4)

1.您可以尝试以下代码:

let searchBar = UISearchBar(frame: CGRect(x: 0, y: 0, width: 300, height: 40))

searchBar.backgroundImage = UIImage()//Without this you can't change background color
searchBar.backgroundColor = UIColor.greenColor()

searchBar.showsCancelButton = true
searchBar.returnKeyType = .Done
searchBar.placeholder = "Test text"

var txtSearchField = searchBar.valueForKey("_searchField")
txtSearchField?.layer.cornerRadius = 15
txtSearchField?.layer.borderWidth = 1.5
txtSearchField?.layer.borderColor = UIColor.orangeColor().CGColor

let image = txtSearchField?.subviews?[1]
image?.frame = CGRect(x: 0, y: 7.5, width: 13, height: 13)

let lbl = txtSearchField?.subviews.last as! UILabel
lbl.textColor = UIColor.whiteColor()
lbl.backgroundColor = UIColor.blueColor()
lbl.frame = CGRect(x: 13, y: 1, width: 127.5, height: 25)

游乐场的结果:enter image description here

  1. 您还可以查看thisthis开源解决方案。

答案 1 :(得分:2)

要了解如何构建UISearchBar的逻辑,您可以查看其所有私有apis here的UISearchBar.h文件。如您所见,它有UISearchBarTextField作为子视图。

去年在iOS 7项目中,我使用此代码访问UISearchBar的UITextField:

UITextField *searchBarTextField;    
for (UIView *subview in self.searchBar.subviews) {
    for (UIView *subsubview in subView.subviews){
    if ([subsubview isKindOfClass:[UITextField class]]) {
            searchBarTextField = (UITextField *)subsubview;
            break;
        }
    }
}

但是,我不建议使用此逻辑,就像Apple更改私有API方法一样,UI和布局可能会被破坏。您可以尝试使用循环方法循环抛出UISearchBar子视图的所有子视图并查找所需的文本字段,但同样,它可能会随时被删除。

将来,如果您对如何访问Apple构建UI上的任何子视图有任何疑问 - 可以通过在调试面板上按此按钮调试视图层次结构:

enter image description here

如果你想让它自定义 - 为什么不创建自己的? UIView + UITextField + UIButton + some logic = UISearchBar。