首页 > 解决方案 > 如何使 UISearchbar 变成矩形并与导航栏合并?

问题描述

您好我正在尝试将 UISearchbar 更改为矩形而不是圆角矩形并将其与具有相同颜色的导航栏合并。

在此处输入图像描述

导航栏的背景颜色应该与搜索栏的背景颜色相同,但有区别,并且显示的边缘清晰,两者都应该显示背景颜色#be1b25 而不是#bc303a。同样,文本字段仍然显示圆角矩形而不是完全矩形。

主视图控制器代码

   @IBOutlet weak var searchBar: UISearchBar!
    self.navigationController?.navigationBar.isTranslucent = true
    navigationController?.navigationBar.backgroundColor = UIColor().HexToColor(hexString: REDCOLOR)
    searchBar.backgroundColor = UIColor().HexToColor(hexString: REDCOLOR)
    searchBar.tintColor = UIColor().HexToColor(hexString: REDCOLOR)
    searchBar.barTintColor = UIColor().HexToColor(hexString: REDCOLOR)
    searchBar.barStyle = .default
    searchBar.placeholder = NetworkManager.sharedInstance.language(key: "searchentirestore")
    searchBar.layer.cornerRadius = 0;
    searchBar.clipsToBounds = false;
    searchBar.barTintColor = UIColor().HexToColor(hexString: REDCOLOR)
    searchBar.layer.borderWidth = 0
    //searchBar.layer.borderColor = UIColor.clear as! CGColor

UISearchBar 扩展

extension UISearchBar {

    private var textField: UITextField? {
        return subviews.first?.subviews.flatMap { $0 as? UITextField }.first
    }

    private var activityIndicator: UIActivityIndicatorView? {
        return textField?.leftView?.subviews.flatMap{ $0 as? UIActivityIndicatorView }.first
    }

    var isLoading: Bool {
        get {
            return activityIndicator != nil
        } set {
            if newValue {
                if activityIndicator == nil {
                    let newActivityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray)
                    newActivityIndicator.transform = CGAffineTransform(scaleX: 0.7, y: 0.7)
                    newActivityIndicator.startAnimating()
                    newActivityIndicator.color = UIColor().HexToColor(hexString: BUTTON_COLOR)
                    newActivityIndicator.backgroundColor = UIColor.white
                    textField?.leftView?.addSubview(newActivityIndicator)
                    let leftViewSize = textField?.leftView?.frame.size ?? CGSize.zero
                    newActivityIndicator.center = CGPoint(x: leftViewSize.width/2, y: leftViewSize.height/2)
                }
            } else {
                activityIndicator?.removeFromSuperview()
            }
        }
    }

请提供任何帮助,这是 Swift 3。在此先感谢

标签: iosswiftuinavigationcontrolleruinavigationbaruisearchbar

解决方案


所以你正在处理一些事情

1 矩形UISearchbar

  • 要么您将遍历本机的子视图UISearchbar并更改其右子层角半径,但这是一个hack,Apple 可以更改该层次结构,您将再次开始
  • 你可以创建你自己的组件,看起来像UISearchbar,几个 UIViews,和UITextfield一些 UIImageViews。
  • GitHub 上有几个库可以使用https://github.com/CosmicMind/Samples
  • iOS 11 UISearchBar in UINavigationBar也有类似的问题

2 与导航栏合并

  • 一种方法是使用UISearchControlleriOS 11
  • 或者您可以使用自定义 UISearchbar 将其添加到 NavBar 下方UIView,而不是在导航中,但在这种情况下, NavBar 不能是半透明的,因为您将永远无法获得相同的色彩空间
  • 您可以将自定义视图作为自定义添加UIViewtitleView导航栏中

推荐阅读