【问题标题】:UISearchBar with a white background is impossible?不可能有白色背景的 UISearchBar?
【发布时间】:2020-08-05 10:01:40
【问题描述】:

我真的认为将 UISearchBar 的文本字段的背景颜色设置为白色会很容易。但无论我尝试什么,它总是保持灰白色/浅灰色 (#efeff0)。

import UIKit

class ViewController: UIViewController {
  private let searchController = UISearchController()

  override func viewDidLoad() {
    super.viewDidLoad()
    navigationItem.title = "Hello World"
    view.backgroundColor = #colorLiteral(red: 0.9588784575, green: 0.9528519511, blue: 0.9350754619, alpha: 1)
    searchController.searchBar.searchTextField.backgroundColor = .white
    navigationItem.searchController = searchController
  }
}

如何使搜索栏的背景颜色为纯白色?应用程序是 iOS 13+,如果有帮助的话。

小测试项目:https://github.com/kevinrenskers/WhiteSearch.

【问题讨论】:

    标签: ios uikit uisearchbar


    【解决方案1】:

    这是可能的。使用白色图像设置搜索字段的背景。

    let size = CGSize(width: searchController.searchBar.frame.size.width - 12, height: searchController.searchBar.frame.size.height - 12)
    let backgroundImage = createWhiteBG(size)!
    let imageWithCorner = backgroundImage.createImageWithRoundBorder(cornerRadiuos: 10)!
    
    searchController.searchBar.setSearchFieldBackgroundImage(imageWithCorner, for: UIControl.State.normal)
    

    如果您不想将图像输入到应用程序。试试这个以编程方式创建一个。

    func createWhiteBG(_ frame : CGSize) -> UIImage? {
        var rect = CGRect(x: 0, y: 0, width: 0, height: 0)
        rect.size = frame
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()
        context?.setFillColor(UIColor.white.cgColor)
        context?.fill(rect)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
    
    extension UIImage {
        func createImageWithRoundBorder(cornerRadiuos : CGFloat) -> UIImage? {
            UIGraphicsBeginImageContextWithOptions(self.size, false, scale)
            let rect = CGRect(origin:CGPoint(x: 0, y: 0), size: self.size)
            let context = UIGraphicsGetCurrentContext()
    
            let path = UIBezierPath(
                roundedRect: rect,
                cornerRadius: cornerRadiuos
            )
            context?.beginPath()
            context?.addPath(path.cgPath)
            context?.closePath()
            context?.clip()
            self.draw(at: CGPoint.zero)
            context?.restoreGState()
            path.lineWidth = 1.5
            let image = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return image
        }
    }
    

    【讨论】:

    • 这看起来很有希望!它肯定需要一个更好的图像,因为您的示例图像太大并且它失去了圆角,但这似乎是前进的方向。
    • 谢谢,我自己也做过同样的事情,但很高兴在这里为其他寻找相同内容的人提供完整的答案。
    【解决方案2】:

    这是我完整的自定义搜索栏,您可以定义搜索栏背景颜色和文本字段背景颜色

    测试

    import Foundation
    
    class SearchBar: UISearchBar {
    
        override init(frame: CGRect) {
            super.init(frame: frame)
    
            makeUI()
        }
    
        required init?(coder: NSCoder) {
            super.init(coder: coder)
    
            makeUI()
    
        }
    
        private func makeUI( ) {
    
            //SearchBar BackgroundColor
            self.backgroundImage = UIImage(color: UIColor.white)
    
            //Border Width
            self.layer.borderWidth = 1
    
            //Border Color
            self.layer.borderColor = UIColor("DEDEDE")?.cgColor
    
            //Corner Radius
            self.layer.cornerRadius = 3
            self.layer.masksToBounds = true
    
            //Change Icon
            self.setImage(UIImage(named: "search")?
                .byResize(to: CGSize(width: 30, height: 30)), for: .search, state: .normal)
    
            if let searchTextField = self.value(forKey: "searchField") as? UISearchTextField {
    
                //TextField Background !!!!!
                searchTextField.backgroundColor = UIColor.white
    
                //TextField Font
                searchTextField.font = UIFont(name: "Poppins-Regular", size: 21)
                searchTextField.textColor = .black
            }
    
        }
    
    }
    

    【讨论】:

      【解决方案3】:
      Try this ... Change colors and images according to your preference  
      
       DispatchQueue.main.async {
                  searchBar.backgroundImage = UIImage()
      
                  for s in searchBar.subviews[0].subviews {
                      if s is UITextField {
                          s.layer.borderWidth = 1.0
                          s.layer.borderColor = UIColor.lightGray.cgColor
      
                      }
                  }
      
                  let searchTextField:UITextField = searchBar.subviews[0].subviews.last as? UITextField ?? UITextField()
                  searchTextField.layer.cornerRadius = 10
                  searchTextField.textAlignment = NSTextAlignment.left
                  let image:UIImage = UIImage(named: "search")!
                  let imageView:UIImageView = UIImageView.init(image: image)
                  searchTextField.leftView = nil
                  searchTextField.placeholder = "Search..."
                  searchTextField.font = UIFont.textFieldText
                  searchTextField.rightView = imageView
                  searchTextField.rightViewMode = UITextField.ViewMode.always
      
              }
      

      【讨论】:

      猜你喜欢
      • 2013-09-17
      • 2021-03-23
      • 2020-02-07
      • 2013-11-27
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多