使 UISearchBar 背景透明。

31

我无法清空搜索栏,尝试通过将其背景颜色设置为透明以及在搜索栏下方放置一张图像来清空它。

我还将搜索栏的背景设置为透明。

 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]];

你是否创建了搜索栏的子类? - ldindu
请帮我解决这个问题,谢谢。 - Vikram
@idindu 没有,我只是想要移除 UISearchBar 的浅灰色背景。 - Vikram
19个回答

44

对于 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];

非常感谢您发布这篇文章... 有没有iOS6的方法? - Vikram
@Vikram:是的,有一种方法(_间接的方法_)...请检查更新后的答案。 - staticVoidMan
10
我在 IOS9 上遇到了黑屏问题。 - Toydor
1
谢谢!将空UIImage设置为背景对我有帮助。 - A. Buksha
1
对于出现黑色背景的用户,请尝试将空UIImage设置为背景。就像上面提到的一样 - [self.searchBarHome setBackgroundColor:[UIColor clearColor]]; [self.searchBarHome setBackgroundImage:[UIImage new]]; [self.searchBarHome setTranslucent:YES]; - Purnima Naik
显示剩余6条评论

28

这是我对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)

1
这是一个非常酷的替代方案!尝试了很多方法,但只有这个解决了问题(iOS 11 Swift 4)。 - Anton Eregin
这绝对是在Xcode 9.3和Swift 4中的答案(或者至少我认为它是Swift 4,我还在适应这个技术栈)。 - Mike Perrenoud
4
searchBar.setBackgroundImage(UIImage(), for: .any, barMetrics: .default) 的意思是设置搜索栏的背景图片为空,适用于任何情况和默认的工具栏度量标准。 - Nico
备选方案在iOS 13中对UISearchBar无效。 - SevenDays

16

UISearchBar 包含两个子视图,它们分别是 'UISearchBarBackground' 和 'UITextField'。在iOS8中,您需要移除 'UISearchBarBackground' 来清除它。

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

我不得不结合这个和其他答案才能使它完全工作,但这是一个很好的起点。 - Juan Boero

13

如果您开始以更高级的方式使用该元素,移除UISearchBarBackground可能会导致未知行为。

Ruozi的答案是我首选的解决方案,用以下方法将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实现透明背景。

此外,将此代码包含在您的UISearchBar子类中可能是更好的设计决策,以避免混乱视图控制器。


11

对于任何试图寻找非hacky解决方案的人,只需在您的Storyboard/Xib文件中将背景图像设置为nil即可。简单地在UISearchBar的背景图像字段中写入 nil 即可。


4
大脑被彻底震撼了。 - John Scalo
2
那不是很hacky吗? - jshapy8
2
哈哈,@jshapy8 说得很对,也许我应该说“不那么”hacky? - Rog
实际上,这适用于任何你设置的不存在的图像名称。因此不仅仅是nil,你也可以写“asdfgh”,它仍然会使bar透明。 - andrei

9

如果你想将这个...

enter image description here

转换为这个...

enter image description here

请使用:

self.searchBar.searchTextField.backgroundColor = .clear

我想要的是第二张图像,浮动在另一个视图上,具有清晰的背景。你是如何实现的? - Nate Birkholz
3
仅限于 iOS 13 及其以上版本。 - Rikh

8

只需使用searchBar.searchBarStyle = .minimal即可。这对我很有效。

我曾经用过许多变通方法很长一段时间,直到我意外地发现了这个属性,它的效果非常好。


6

对于那些无法使用删除或 alpha 解决方案的人,请确保您的 searchBar SearchStyle不是 MINIMALIST。将其更改为默认设置,并使用此处提供的任何代码。


5

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

searchBar.searchTextField.backgroundColor = .clear

但是其他解决方案,如:

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

在搜索栏上创建一个背景,隐藏占位符并且不能与搜索栏进行交互。对于iOS 12及以下版本的解决方案是使用类似@Get Schwifty的方法。


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)

1
Swift 4+的最新和最佳答案! - aaannjjaa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接