【问题标题】:Changing the color of the icons in a UItextField inside a UISearchBar更改 UISearchBar 内 UItextField 中图标的颜色
【发布时间】:2016-02-29 12:42:01
【问题描述】:

我正在尝试自定义搜索控制器中搜索栏的外观。

设置背景和文本颜色效果很好,但我只是没有找到改变文本字段中图标颜色的方法,特别是放大镜和 x 按钮。

我找到了这个 Objective-C 代码,它应该可以做我想做的事,但我正在努力将它翻译成 Swift:

(编辑:跳到有效的 Swift 3 解决方案的第一个答案。)

UITextField *searchBarTextField = [self.searchDisplayController.searchBar valueForKey:@"_searchField"];

// Magnifying glass icon.
UIImageView *leftImageView = (UIImageView *)searchBarTextField.leftView;
leftImageView.image = [LeftImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
leftImageView.tintColor = [UIColor whiteColor];

// Clear button
UIButton *clearButton = [searchBarTextField valueForKey:@"_clearButton"];
[clearButton setImage:[clearButton.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] forState:UIControlStateNormal];
clearButton.tintColor = [UIColor whiteColor];

我尝试翻译成 Swift:

let textField = searchController.searchBar.valueForKey("searchField") as! UITextField
// These two work fine.
textField.backgroundColor = UIColor.blackColor()
textField.textColor = UIColor.blackColor()

var glassIcon = textField.leftView
// This would work.
//glassIcon.hidden = true

// This does not have any effect.
//glassIcon?.tintColor = UIColor.whiteColor()

// My attempt to translate, but it gives an error.
glassIcon.image? = UIImage.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate)

 var clearButton = textField.valueForKey("clearButton")!
            clearButton.setImage(clearButton.imageWithRenderingMode(.AlwaysTemplate), forState: .Normal)
// This gives the error: "Cannot assign to property: 'clearButton' is immutable
clearButton.tintColor = UIColor.whiteColor()
  // Sorry for the weird formatting, it glitches here in the editor. 

leftView 似乎没有 image 属性。如何像 Objective-C 代码那样访问该属性? 另外,如果有更好的方法来实现我想要的,请告诉我。

【问题讨论】:

    标签: swift uiimage uitextfield uisearchbar


    【解决方案1】:

    解决办法如下:

    // Text field in search bar.
    let textField = searchController.searchBar.value(forKey: "searchField") as! UITextField
    
    let glassIconView = textField.leftView as! UIImageView
    glassIconView.image = glassIconView.image?.withRenderingMode(.alwaysTemplate)
    glassIconView.tintColor = UIColor.white
    
    let clearButton = textField.valueForKey("clearButton") as! UIButton
    clearButton.setImage(clearButton.imageView?.image?.withRenderingMode(.alwaysTemplate), for: .normal)
    clearButton.tintColor = UIColor.white
    

    【讨论】:

    • 嗨,使用此代码,如何将其附加到我的搜索栏?
    • 在您的视图控制器中实例化一个搜索控制器:var searchController: UISearchController! 并在您的 viewDidLoad() 中设置它,例如:tableView.tableHeaderView = searchController.searchBar searchController = UISearchController(searchResultsController: nil) searchController.searchResultsUpdater = self searchController.dimsBackgroundDuringPresentation = false searchController.searchBar.delegate = self searchController.searchBar.sizeToFit() searchController.searchBar.barTintColor = UIColor.white
    • 您可以将as! 替换为as?,使代码更安全,没有其他不利影响。
    【解决方案2】:

    解决办法如下:

    extension UITextField{
    
    func setLeftIcon(_ icon: UIImage) {
        
        let padding = 8
        let size = 20
        
        let outerView = UIView(frame: CGRect(x: 0, y: 0, width: size+padding, height: size) )
        let iconView  = UIImageView(frame: CGRect(x: padding, y: 0, width: size, height: size))
        iconView.image = icon.withRenderingMode(.alwaysTemplate)
        iconView.tintColor = UIColor.white
        outerView.addSubview(iconView)
        
        leftView = outerView
        leftViewMode = .always
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-12
      • 2016-08-03
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      相关资源
      最近更新 更多