使UISearchBar背景清晰

时间:2014-01-08 10:35:30

标签: ios objective-c uisearchbar

我无法清除搜索栏我试图通过设置其背景颜色来清楚显示它并且我还在搜索栏下放置了一个图像

我还明确了搜索栏的背景

 for (UIView *subview in self.searchBarHome.subviews) {
      if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
         [subview removeFromSuperview];//please help me to make clear background of uisearchbar
        break; 
    }
}
[self.searchBarHome setBackgroundColor:[UIColor clearColor]];

18 个答案:

答案 0 :(得分:31)

对于iOS7 +,您只需要:

[self.searchBarHome setBackgroundColor:[UIColor clearColor]];
[self.searchBarHome setBarTintColor:[UIColor clearColor]]; //this is what you want

注意:这不适用于iOS6


对于iOS6 +,即使在iOS7中,以下内容也会处理它:

[self.searchBarHome setBackgroundColor:[UIColor clearColor]];
[self.searchBarHome setBackgroundImage:[UIImage new]];
[self.searchBarHome setTranslucent:YES];

答案 1 :(得分:19)

这是我在Swift 3中的解决方案(Scarafone和Andrew2M答案的组合):

for view in searchBar.subviews.last!.subviews {
        if type(of: view) == NSClassFromString("UISearchBarBackground"){
            view.alpha = 0.0
        }
}

或者:

searchBar.barTintColor = UIColor.clear
searchBar.backgroundColor = UIColor.clear
searchBar.isTranslucent = true
searchBar.setBackgroundImage(UIImage(), for: .any, barMetrics: .default)

答案 2 :(得分:14)

UISearchBar包含两个子视图,它们是'UISearchBarBackground'和'UITextField'。在IOS8中,您需要删除“UISearchBarBackground”以清除它。

for (UIView *subview in [[yourSearchBar.subviews lastObject] subviews]) {        
    if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
        [subview removeFromSuperview];
        break;
    }
}

答案 3 :(得分:10)

删除UISearchBarBackground可能会导致未知行为,尤其是当您开始以更高级的方式使用该元素时。

Ruozi的答案是我抓住UISearchBarBackground元素的首选解决方案但是我建议将alpha设置为0而不是使用以下内容删除视图:

for (UIView *subview in [[self.searchBar.subviews lastObject] subviews]) {
    if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
        [subview setAlpha:0.0];
        break;
    }
}

将上述代码添加到包含IBOutlet * searchBar的UIViewController子类中。这段代码片段将为iOS8和iOS9带来透明背景。

此外,为了避免使viewController混乱,最好将设计决定包含在UISearchBar子类中。

答案 4 :(得分:8)

对于任何想要找到非hacky解决方案的人,只需在Storyboard / Xib文件中将背景图像设置为nil即可。从字面上看,只需在UISearchBar的背景图像字段中编写nil

答案 5 :(得分:7)

如果您想更改此内容...

enter image description here

对此...

enter image description here

使用:

self.searchBar.searchTextField.backgroundColor = .clear

答案 6 :(得分:4)

设置backgroundColor和barTintColor对iOS 9+没有用,给我留下黑色背景。但若若解决方案将起作用。这是相同代码的快速版本。

PS> cat .gitignore
bin
obj
artifacts
.vscode

答案 7 :(得分:4)

我的解决方案 Swift 4.1 | iOS 11.4 我更改了UISearchBar的背景和文本颜色

enter image description here

关键是找到UISearchBar的UITextField组件并更改其参数:

let searchTextField = searchBar.value(forKey: "searchField") as? UITextField
searchTextField?.textColor = UIColor.white
searchTextField?.backgroundColor = UIColor.red
searchTextField?.attributedPlaceholder =  NSAttributedString(string: "Your Placeholder", attributes: [NSAttributedStringKey.foregroundColor: UIColor.white.withAlphaComponent(0.5)])

然后我设置“搜索”和“清除”图像

//search image
searchBar.setImage(UIImage(named: "icon_search"), for: UISearchBarIcon.search, state: .normal)
//clear image
searchBar.setImage(UIImage(named: "icon_search_clear"), for: UISearchBarIcon.clear, state: .normal)

答案 8 :(得分:2)

对于来到此处且无法使删除或Alpha解决方案适合您的任何人,请确保您在MINIMALIST上拥有searchBar SearchStyle NOT 。将其更改为默认值并使用此处提供的任何代码

答案 9 :(得分:1)

extension UISearchBar {
    func changeSearchBarColor(fieldColor: UIColor, backColor: UIColor, borderColor: UIColor?) {
        UIGraphicsBeginImageContext(bounds.size)
        backColor.setFill()
        UIBezierPath(rect: bounds).fill()
        setBackgroundImage(UIGraphicsGetImageFromCurrentImageContext()!, for: UIBarPosition.any, barMetrics: .default)

        let newBounds = bounds.insetBy(dx: 0, dy: 8)
        fieldColor.setFill()
        let path = UIBezierPath(roundedRect: newBounds, cornerRadius: newBounds.height / 2)

        if let borderColor = borderColor {
            borderColor.setStroke()
            path.lineWidth = 1 / UIScreen.main.scale
            path.stroke()
        }

        path.fill()
        setSearchFieldBackgroundImage(UIGraphicsGetImageFromCurrentImageContext()!, for: UIControlState.normal)

        UIGraphicsEndImageContext()
    }
}

答案 10 :(得分:1)

对于iOS 13+,我们可以简单地使用:

searchBar.searchTextField.backgroundColor = .clear

,但其他解决方案如:

searchBar.setSearchFieldBackgroundImage(UIImage(), for: .normal)
searchBar.setBackgroundImage(UIImage(), for: .any, barMetrics: .default)

在searchBar上创建一个背景,该背景隐藏了占位符,并且不允许与searchBar进行交互。 iOS 12及更低版本的解决方案是使用类似于@Get Schwifty的方法。

答案 11 :(得分:1)

哦,天哪!我一直在寻找解决方案并尝试多种方法。由于@gmogames已在上述内容中提及,您可以使用以下任一答案,但请确保将“搜索栏样式”设置为默认值,否则将无法使用。因此,要弄清楚解决方案,这对我有用:

在故事板或代码中(无论创建UISearchBar的位置如何)将“搜索栏样式”设置为默认值。 然后将此代码添加到您的视图控制器:

mySearchBar.searchTextField.backgroundColor = .clear

答案 12 :(得分:1)

对uisearchbar进行子类化并覆盖initWithFrame和initWithCoder方法并将背景颜色设置为

// For searchbar created programmatically
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self configureSetup];
    }
    return self;
}

// For search bar created on xib
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self configureSetup];
    }
    return self;
}

- (void)configureSetup
{
    self.backgroundColor = [UIColor clearColor];
}

并使用子类搜索栏代替您指定UISearchBar的位置

答案 13 :(得分:0)

仅使用searchBar.searchBarStyle = .minimal对我有用。

很长一段时间以来,我一直使用许多变通办法,直到我偶然发现此属性,并像魅力一样工作。

答案 14 :(得分:0)

对于iOS 12,swift 4.x 有点古怪,但是Debug视图层次结构显示_UISearchBarSearchFieldBackgroundView对背景颜色负责。要实现它,...

for subview in searchBar.subviews.last!.subviews {
   if subview.isKind(of: NSClassFromString("UISearchBarTextField")!) {
       for v in subview.subviews {
          if v.isKind(of: NSClassFromString("_UISearchBarSearchFieldBackgroundView")!) {
                  v.removeFromSuperview()
                }
            }
        }
    }

这太骇人听闻了。我更喜欢要求设计师接受Apple默认颜色。

答案 15 :(得分:0)

searchBarStyle = .default
searchTextField.backgroundColor = .yourColor

通过这种组合,您可以删除searchTextField的灰色背景并进行设置!

答案 16 :(得分:0)

我尝试了@Johnson的答案,但是对我来说效果不佳。 ( iOS 13,swift 5

但是,解决方案背后的逻辑似乎很好。因此,尝试迭代searchBar的所有子视图,并且成功了!

我希望这会有所帮助:)


解决方案在 iOS 12.4 - swift 5

中也对我有用

删除背景方法

private func removeBackground(from searchBar: UISearchBar) {
    guard let BackgroundType = NSClassFromString("_UISearchBarSearchFieldBackgroundView") else { return }

    for v in searchBar.allSubViewsOf(type: UIView.self) where v.isKind(of: BackgroundType){
        v.removeFromSuperview()
    }
}

辅助方法-> UIViewExtension

extension UIView {

    public func allSubViewsOf<T : UIView>(type : T.Type) -> [T]{
        var all = [T]()
        func getSubview(view: UIView) {
            if let wrapped = view as? T, wrapped != self{
                all.append(wrapped)
            }
            guard view.subviews.count>0 else { return }
            view.subviews.forEach{ getSubview(view: $0) }
        }
        getSubview(view: self)
        return all
    }
}

答案 17 :(得分:0)

Swift 5.4,iOS 14.5。

这是默认的 UISearchBar,在白色背景之上: enter image description here

在灰色背景上进行相同的设置: enter image description here

要使搜索栏的背景清晰,请将搜索栏样式设置为最小。这将删除搜索栏的背景并使搜索字段半透明。
searchBar.searchBarStyle = .minimal

enter image description here

enter image description here

然后,将搜索文本字段的背景颜色设置为您想要的任何颜色。在这种情况下,我已将其设置为白色。 searchBar.searchTextField.backgroundColor = .white

你可以在这里看到这个结果: enter image description here

enter image description here

如果您设置 searchBar.searchTextField.backgroundColor = .redenter image description here