我可以更改 UISearchBar 清除按钮的颜色/图像吗?

2023-11-21

enter image description here

我想将清除按钮颜色更改为白色。我尝试了很多方法但没有运气。:( 我还参考了以下内容link。但这对我不起作用。

请找到我尝试过的以下代码。我正在开发最新的 ios 11。感谢任何帮助。

class SearchBar: UISearchBar {

    override init(frame: CGRect) {
        super.init(frame: frame)

        sharedInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        sharedInit()
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        sharedInit()
    }

    private func sharedInit() {
        self.placeholder = "Search"
        self.setTextColor(color: .white)
        self.setTextFieldColor(color: UIColor.hexString("549C64"))
        self.setPlaceholderTextColor(color: .white)
        self.setSearchImageColor(color: .white)
        self.setTextFieldClearButtonColor(color: .white)

        if let textfield = self.value(forKey: "searchField") as? UITextField {
            if let backgroundview = textfield.subviews.first {
                backgroundview.layer.cornerRadius = 18.0;
                backgroundview.clipsToBounds = true;
            }
            //textfield.frame = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: self.frame.size.width, height: 10.0)
        }


        //NO LUCK FOR HEIGHT
        for subView in self.subviews  {
            for subsubView in subView.subviews  {
                if let textField = subsubView as? UITextField {
                    for subsubView in textField.subviews  {
                        if let btn = subsubView as? UIButton {
                            print(btn)
                        }
                    }

                }else  if let btn = subsubView as? UIButton {
                    print(btn)
                }
            }
            if let btn = subView as? UIButton {
                print(btn)
            }
        }

    }
}

extension UISearchBar {

    private func getViewElement<T>(type: T.Type) -> T? {
        let svs = subviews.flatMap { $0.subviews }
        guard let element = (svs.filter { $0 is T }).first as? T else { return nil }
        return element
    }

    func getSearchBarTextField() -> UITextField? {
        return getViewElement(type: UITextField.self)
    }

    func getSearchBarButton() -> UIButton? {
        return getViewElement(type: UIButton.self)
    }

    func setTextColor(color: UIColor) {
        if let textField = getSearchBarTextField() {
            textField.textColor = color
        }
    }

    func setTextFieldColor(color: UIColor) {
        if let textField = getViewElement(type: UITextField.self) {
            switch searchBarStyle {
            case .minimal:
                textField.layer.backgroundColor = color.cgColor
                textField.layer.cornerRadius = 18.0
                if let backgroundview = textField.subviews.first {
                    backgroundview.layer.cornerRadius = 18.0;
                    backgroundview.clipsToBounds = true;
                }
            case .prominent, .default:
                textField.backgroundColor = color
            }
        }
    }

    func setPlaceholderTextColor(color: UIColor) {
        if let textField = getSearchBarTextField() {
            textField.attributedPlaceholder = NSAttributedString(string: self.placeholder != nil ? self.placeholder! : "", attributes: [NSAttributedStringKey.foregroundColor: color])
        }
    }

    func setTextFieldClearButtonColor(color: UIColor) {
        if let textField = getSearchBarTextField() {
            let button = textField.value(forKey: "_clearButton") as! UIButton
            if let image = button.imageView?.image {
                button.setImage(image.transform(withNewColor: color), for: .normal)
            }else{
                //button.setImage(#imageLiteral(resourceName: "icon-hotel"), for: .normal)
            }
        }
        if let btn = getSearchBarButton() {
            let button = btn.value(forKey: "_clearButton") as! UIButton
            if let image = button.imageView?.image {
                button.setImage(image.transform(withNewColor: color), for: .normal)
            }else{
                //button.setImage(#imageLiteral(resourceName: "icon-hotel"), for: .normal)
            }
        }

    }

    func setSearchImageColor(color: UIColor) {
        if let imageView = getSearchBarTextField()?.leftView as? UIImageView {
            imageView.image = imageView.image?.transform(withNewColor: color)
        }
    }
}

extension UIImage {

    func transform(withNewColor color: UIColor) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size, false, scale)

        let context = UIGraphicsGetCurrentContext()!
        context.translateBy(x: 0, y: size.height)
        context.scaleBy(x: 1.0, y: -1.0)
        context.setBlendMode(.normal)

        let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
        context.clip(to: rect, mask: cgImage!)

        color.setFill()
        context.fill(rect)

        let newImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return newImage
    }
}

您可以在 iOS 11 中使用自定义图标:

Code:

searchBar.setImage(UIImage(named: "ic_clear"), for: .clear, state: .normal)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以更改 UISearchBar 清除按钮的颜色/图像吗? 的相关文章

随机推荐

  • 版本号无效:版本号可能为负数或大于 255

    当我尝试访问应用程序中的页面时 出现以下错误 SEVERE Servlet service for servlet jsp threw exception java lang IllegalArgumentException Invalid
  • UrlFetchApp 未定义

    我正在调用 UrlFetchApp fetch www google com 从我的 chrome javascript 代码中我得到 未捕获的引用错误 UrlFetchApp 未定义 有人知道为什么没有定义吗 我还以为是内置的 网址获取服
  • R中的关联规则 - 删除冗余规则(arules)

    假设我们有 3 条规则 1 A B D gt C 2 A B gt C 3 Whatever it is Rule 2 是规则的子集 1 因为规则 1 包含规则中的所有项目 2 所以规则 1 应该被消除 因为规则 1 过于具体 其信息已包含
  • 将行从一个数据帧添加到另一个数据帧

    我正在尝试从一个数据帧插入或添加到另一个数据帧 我正在浏览原始数据框 在一列中寻找某些单词 当我找到这些术语之一时 我想将该行添加到新的数据框中 我通过使用得到了行 entry df loc df A item 但是 当尝试使用 add i
  • Rails 如何在 gem 中创建初始化程序

    我正在尝试在 Rails 3 中构建一个 gem 并在其中尝试传递一个初始化程序 Credentials configure do config file File read Rails root config twitter yaml f
  • Java(正则表达式?)在数字/字母组合之间分割字符串

    我一直在浏览谷歌结果的一页又一页 但没有发现任何可以帮助我的东西 我想做的就是分割一个字符串 比如Bananas22Apples496Pears3 并将其分解为某种可读的格式 自从String split 无法做到这一点 我想知道是否有人可
  • 如何在敏捷类型中对 IDublinCore 的行为进行排序?

    我正在使用 Python Dexterity Type 编写一个产品 并且我有Title and Description 这个字段来自一个行为plone app dexterity behaviors metadata IDublinCor
  • JComponent 未显示图片背景?

    我的组件没有显示 我该如何解决 Code import java awt import java awt event ActionEvent import java awt event ActionListener import java
  • ActionBar 上没有应用程序图标

    这里有很多关于向 ActionBar 添加图标的查询 但没有一个解决我的问题 如果您知道此问题的重复项 请随时发表评论或关闭此问题 我将我的项目迁移到 IntelliJ 并且在我以前的 IDE Eclipse 中没有遇到这个问题 问题 应用
  • Hyperledger:运行“./byfn -m up”时获取“/bin/bash: ./scripts/script.sh: No such file or directory”

    我是超级账本的新手 只是按照以下教程来学习它http hyperledger fabric readthedocs io 我正在尝试使用结构样本中的 first network 构建第一个网络 这 byfn m generate没问题 但打
  • Angular 4.3:使用新的 HttpClient 获取数组缓冲区

    我想更改为新的 HttpClient 到目前为止 我处理文件下载如下 getXlsx Observable
  • 如何以文化感知方式格式化 TimeSpan 的 HH:mm:ss 分隔符?

    我正在开发一款可以在世界许多国家 地区看到的应用程序 没有多少国家 地区会使用 以外的其他内容作为分隔符来显示小时 分钟和秒 但有一些国家 地区 我想确保其所在地区的时间格式正确 DateTime 在这方面很擅长 但 TimeSpan 则不
  • 无需拖放即可快速创建用户界面的最佳语言? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我是一名盲人大学生 正在参加专注于用户界面设计的编程入门课程 该类正在使用Processing 这是完全无法访问的 我正在寻找一种语言 它允许我无需拖放即可创建 GUI 并希望足够智能来完
  • GWT 将 ClickHandler 添加到 DOM 元素

    可以说我有一个带有 ClickHandler 的自定义小部件 这是例子 public class TestWidget extends Composite private static TestWidgetUiBinder uiBinder
  • jinja2.exceptions.TemplateNotFound:bootstrap/base.html

    我在继承引导程序 base html在安装 Bootstrap Flask 扩展后的 Flask 应用程序中 但出现以下错误 jinja2 exceptions TemplateNotFound bootstrap base html 您需
  • MP4 正在下载而不是播放

    MP4 文件有时会被下载 有时会在浏览器中播放 这两个链接有什么区别 1 如果您在 Chrome 中打开此 URL 将下载视频 http video video mall com video mall 400241188377 video
  • Angular 2 获取div的宽度

    我看过很多帖子 但没有一个完全符合我的要求 我有一个超出页面宽度的表格 由于各种原因我需要获取它的宽度 I used ViewChild tableToMeasure elementView ElementRef 然后将 tableToMe
  • 如何化简分数?

    如何在 C 中化简分数 例如 给定1 11 6 我需要它简化为2 5 6 如果你想要的只是将你的分数变成一个带分数 其小数部分是像前面假设的答案一样的真分数 你只需要添加numerator denominator到数字的整个部分并将分子设置
  • 如何使用 python nltk 加速 stanford NER 的 NE 识别

    首先 我将文件内容标记为句子 然后对每个句子调用斯坦福 NER 但这个过程确实很慢 我知道如果我在整个文件内容上调用它会更快 但是我在每个句子上调用它 因为我想在 NE 识别之前和之后索引每个句子 st NERTagger stanford
  • 我可以更改 UISearchBar 清除按钮的颜色/图像吗?

    我想将清除按钮颜色更改为白色 我尝试了很多方法但没有运气 我还参考了以下内容link 但这对我不起作用 请找到我尝试过的以下代码 我正在开发最新的 ios 11 感谢任何帮助 class SearchBar UISearchBar over