【问题标题】:How to add a 1 pixel gray border around a UISearchBar TextField如何在 UISearchBar TextField 周围添加 1 像素灰色边框
【发布时间】:2024-01-24 03:16:01
【问题描述】:

我正在尝试弄清楚如何在我的应用程序中向我的 UISearchBar 添加一个 1 像素的描边灰色边框。 Facebook Messenger 应用程序很好地完成了这一点。 (见下图)。

我知道 UISearchBar 有一个背景图像属性,但我认为这不是正确的使用方式,因为它会将图像拉伸并在整个搜索栏视图中重复。

非常感谢您提供正确方向的指示。

【问题讨论】:

    标签: ios objective-c uiview ios7 uisearchbar


    【解决方案1】:

    试试这个代码:

    //First add the following import and macro:
    #import <QuartzCore/QuartzCore.h>
    #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
    
    //Then change yourSearchBar border: 
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
    {
        for (id object in [[[yourSearchBar subviews] objectAtIndex:0] subviews])
        {
            if ([object isKindOfClass:[UITextField class]])
            {
                UITextField *textFieldObject = (UITextField *)object;
                textFieldObject.layer.borderColor = [[UIColor grayColor] CGColor];
                textFieldObject.layer.borderWidth = 1.0;
                break;
            }
        }
    }
    else
    {
        for (id object in [yourSearchBar subviews])
        {
            if ([object isKindOfClass:[UITextField class]])
            {
                UITextField *textFieldObject = (UITextField *)object;
                textFieldObject.layer.borderColor = [[UIColor grayColor] CGColor];
                textFieldObject.layer.borderWidth = 1.0;
                break;
            }
        }
    }
    

    【讨论】:

    • 您能提供 Swift 解决方案吗?提前致谢
    【解决方案2】:

    Swift 3 版本

    override func viewDidLoad() {
        super.viewDidLoad()
    
        for s in searchBar.subviews[0].subviews {
            if s is UITextField {
                s.layer.borderWidth = 1.0
                s.layer.borderColor = UIColor.gray.cgColor
            }
        }
    }
    

    为了使它圆你可以使用 textField.layer.cornerRadius 属性

    【讨论】:

      【解决方案3】:

      这项工作很好:

      UITextField *txtSearchField = [yourSearchBar valueForKey:@"_searchField"];
      [txtSearchField setBorderStyle:UITextBorderStyleRoundedRect];
      txtSearchField.layer.cornerRadius = 4;
      txtSearchField.layer.borderWidth = 1.0f;
      txtSearchField.layer.borderColor = [[UIColor colorWhatYouWant] CGColor]; 
      

      别忘了#import &lt;QuartzCore/QuartzCore.h&gt;

      【讨论】:

      • 所用密钥的值是私钥。拒绝理由
      【解决方案4】:

      试试这个

      self.poundsTxt.layer.borderColor = [[UIColor whiteColor]CGColor];
      self.poundsTxt.layer.borderWidth=2.0;
      

      将 Quartz Core Framework Reference 导入您的项目并添加 导入&lt;QuartzCore/QuartzCore.h&gt; 到您的 ViewController.m 以使用边框颜色和边框宽度。

      【讨论】:

      • 不起作用。这会将边框添加到整个视图边界:(除非我做错了。self.searchDisplayController.searchBar.layer.borderColor = [[UIColor colorWithRed:201.0/255.0 green:201.0/255.0 blue:201.0/255.0 alpha:1.0 ]CGColor];
      • 也许这个链接可以帮助你link
      【解决方案5】:

      斯威夫特 5

      简单的方法

          @IBOutlet private weak var searchBar:UISearchBar!{
              didSet{
                  if let searchTextfield = self.searchBar.value(forKey: "searchField") as? UITextField  {
                      searchTextfield.layer.borderColor = UIColor.lightGray.cgColor
                      searchTextfield.layer.borderWidth = 1
                      searchTextfield.layer.cornerRadius = 10
                  }
              }
          }
      
      

      【讨论】:

      • 效果很好!谢谢。
      【解决方案6】:

      我对@9​​87654321@ 投了赞成票,但它在 iOS 13 中被破坏了。这就是今天有效的方法:

          func changeSearchBarAppearance() {
              var searchTextField : UITextField?
              if #available(iOS 13, *) {
                  // brand new searchTextField is available as of iOS 13
                  searchTextField = searchBar.searchTextField
              } else {
                  // Yaroslav's answer still works in iOS versions less than 13
                  // here's a slightly different implementation:
                  if let matchingTextField = searchBar.subviews[0].subviews.compactMap ({ $0 as? UITextField }).first {
                      searchTextField = matchingTextField
                  }
              }
      
              guard let validTextField = searchTextField else {
                  return
              }
      
              validTextField.layer.cornerRadius = 16
              validTextField.layer.borderWidth = 1.0
              validTextField.layer.borderColor = UIColor.grey.cgColor
              validTextField.backgroundColor = .white
              validTextField.placeholder = "insert-some-placeholder-text"
          }
      

      【讨论】:

      • 很好的解决方案。仅供参考 .grey 对我来说是 .gray 。但我使用 .lightGray 是因为它在白色背景上看起来更干净一些。