iOS 9中的IOS UISearchBar背景颜色

时间:2016-05-11 09:40:37

标签: ios swift search ios9

我一直在搜索此问题,我希望我的搜索栏显示为BBC新闻应用SearchBar In BBC News APP

我尝试了所有相关的方法

  for view in searchBar.subviews {
        if view.isKindOfClass(NSClassFromString("UISearchBarBackground")!) {
            view.removeFromSuperview()
            break;
        }
  }

    self.searchBar.tintColor = UIColor.clearColor()
    self.searchBar.backgroundColor = UIColor.clearColor()
    self.searchBar.translucent = true

这是我的输出 enter image description here

我错过了什么?请帮助我,谢谢!

5 个答案:

答案 0 :(得分:20)

Swift 3

要完全删除背景,请将backgroundImage设置为空图像:

searchBar.backgroundImage = UIImage()

要设置自定义背景颜色,请使用barTintcolor属性:

searchBar.barTintColor = .green

答案 1 :(得分:11)

总而言之,我通过将背景图像设置为'nil'来解决问题,这是我应用中不存在的图像

enter image description here

我的最终输出 enter image description here

==================== 更新最终解决方案 ================= ===

阅读更多文件后。最后我找到了一个更好的解决方案,

for subView in searchBar.subviews {
        for view in subView.subviews {
            if view.isKindOfClass(NSClassFromString("UINavigationButton")!) {
                let cancelButton = view as! UIButton
                cancelButton.setTitle("取消", forState: UIControlState.Normal)
                cancelButton.setTitleColor(UIColor.whiteColor(), forState: .Normal)
            }
            if view.isKindOfClass(NSClassFromString("UISearchBarBackground")!) {
                let imageView = view as! UIImageView
                imageView.removeFromSuperview()
            }
        }
    }

==================== 更新Swift4 ================== ==

for subView in searchBar.subviews {
        for view in subView.subviews {
            if view.isKind(of: NSClassFromString("UINavigationButton")!) {
                let cancelButton = view as! UIButton
                cancelButton.setTitleColor(.white, for: .normal)
                cancelButton.setTitle("取消", for: .normal)
            }
            if view.isKind(of: NSClassFromString("UISearchBarBackground")!) {
                let imageView = view as! UIImageView
                imageView.removeFromSuperview()
            }
        }
    }

答案 2 :(得分:5)

替代版本作为扩展名

extension UISearchBar {
    func removeBackgroundImageView(){
        if let view:UIView = self.subviews.first {
            for curr in view.subviews {
                guard let searchBarBackgroundClass = NSClassFromString("UISearchBarBackground") else {
                    return
                }
                if curr.isKind(of:searchBarBackgroundClass){
                    if let imageView = curr as? UIImageView{
                        imageView.removeFromSuperview()
                        break
                    }
                }
            }
        }
    }
}

答案 3 :(得分:2)

就我而言,它有帮助:

searchView.backgroundImage = UIImage()
searchView.searchTextField.backgroundColor = .white

答案 4 :(得分:0)

如果在iOS 13中运行,当前答案将导致运行时错误:

Terminating app due to uncaught exception 'NSGenericException', reason:
'Missing or detached view for search bar layout. The application must not remove
<UISearchBarBackground: 0x102d05050; frame = (0 0; 414 56); alpha = 0; hidden = YES;
userInteractionEnabled = NO; layer = <CALayer: 0x280287420>> from the hierarchy.'

如果代码必须由iOS 9和iOS 13之间的设备运行,则以下是可能的解决方案。

首先,创建一个扩展,该扩展允许基于类名递归查找子视图:

extension UIView {
/// Find the first subview of the specified class.
/// - Parameter className: The class name to search for.
/// - Parameter usingRecursion: True if the search should continue through the subview tree until a match is found; false otherwise
/// - Returns: The first child UIView of the specified class
func findSubview(withClassName className: String, usingRecursion: Bool) -> UIView? {
    // If we can convert the class name until a class, we look for a match in the subviews of our current view
    if let reflectedClass = NSClassFromString(className) {
        for subview in self.subviews {
            if subview.isKind(of: reflectedClass) {
                return subview
            }
        }
    }

    // If recursion was specified, we'll continue into all subviews until a view is found
    if usingRecursion {
        for subview in self.subviews {
            if let tempView = subview.findSubview(withClassName: className, usingRecursion: usingRecursion) {
                return tempView
            }
        }
    }

    // If we haven't returned yet, there was no match
    return nil
}
}

然后,不删除子视图,而是使其完全透明。 backgroundColorView视图是直接显示在文本下方的颜色,但是调整它不是解决方案的必要部分。

    // On iOS 9, there is still an image behind the search bar. We want to remove it.
    if let backgroundView = searchBar.findSubview(withClassName: "UISearchBarBackground", usingRecursion: true) {
        backgroundView.alpha = 0
    }

    // The color on iOS 9 is white. This mimics the newer appearance of the post-iOS 9
    // search controllers
    if let backgroundColorView = searchBar.findSubview(withClassName: "_UISearchBarSearchFieldBackgroundView", usingRecursion: true) as? UIImageView {
        backgroundColorView.backgroundColor = UIColor.lightGray
        backgroundColorView.layer.cornerRadius = 8
        backgroundColorView.alpha = 0.3
        backgroundColorView.image = nil
    }