検索バーをクリアできません。背景色をクリアにしてクリアしようとしました。また、検索バーの下に1つの画像を配置しました。
検索バーの背景も明確にした
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]];
IOS7以降の場合、必要なことは次のとおりです。
[self.searchBarHome setBackgroundColor:[UIColor clearColor]];
[self.searchBarHome setBarTintColor:[UIColor clearColor]]; //this is what you want
[〜#〜] note [〜#〜]:これはiOS6では機能しません
IOS6 +の場合、iOS7でも次のように処理されます。
[self.searchBarHome setBackgroundColor:[UIColor clearColor]];
[self.searchBarHome setBackgroundImage:[UIImage new]];
[self.searchBarHome setTranslucent:YES];
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)
UISearchBarには、「UISearchBarBackground」と「UITextField」の2つのサブビューがあります。 IOS8では、 'UISearchBarBackground'を削除してクリアする必要があります。
for (UIView *subview in [[yourSearchBar.subviews lastObject] subviews]) {
if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
[subview removeFromSuperview];
break;
}
}
UISearchBarBackgroundを削除すると、特に要素をより高度な方法で使用し始めた場合に、不明な動作が発生する可能性があります。
Ruoziの答えは、UISearchBarBackground要素を取得するための推奨ソリューションでしたが、次のようにビューを削除するのではなく、アルファを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サブクラスにこのコードを含める方が設計上の決定が適切になる場合があります。
ハッキングされていない解決策を見つけようとしている人は、ストーリーボード/ Xibファイルで背景画像をnilに設定するだけです。文字通り、UISearchBarの背景画像フィールドにnil
と書くだけです。
BackgroundColorとbarTintColorを設定しても、iOS 9以降では機能せず、背景が黒のままでした。ただし、Ruoziソリューションは機能します。ここに同じコードのSwiftバージョンがあります。
for view in _searchBar.subviews.last!.subviews {
if view.isKindOfClass(NSClassFromString("UISearchBarBackground")!) {
view.removeFromSuperview()
}
}
私のソリューションはSwift 4.1に取り組んでいます| iOS 11.4UISearchBarの背景とテキストの色を変更します
重要なのは、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)
ここに来て、削除またはアルファソリューションを機能させることができない人のために、MINIMALISTにsearchBar SearchStyle [〜#〜] not [〜#〜]があることを確認してください。それをデフォルトに変更し、ここで提供されるコードのいずれかを使用します
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()
}
}
単にsearchBar.searchBarStyle = .minimal
は私のために働きます。
私はこのプロパティを偶然発見して魅力のように機能するまで、長い間多くの回避策を使用していました。
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を指定した場所ではなく、サブクラス化された検索バーを使用します
ちょっと、あなた!私はあらゆる場所で解決策を探し、複数のことを試みてきました。 @gmogamesは上記のように記述されているため、これらの回答のいずれかを使用できますが、検索バーのスタイルがデフォルトに設定されていることを確認してください。そうしないと機能しません。だから、解決策を明確にするために、これは私にとってうまくいったものです:
ストーリーボードまたはコード(UISearchBarを作成した場所)で検索バーのスタイルをデフォルトに設定します。次に、このコードをビューコントローラーに追加します。
mySearchBar.searchTextField.backgroundColor = .clear
IOS 12の場合Swift 4.xややこしすぎますが、デバッグビューの階層は_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デフォルトの色を受け入れるように依頼することを好みます。
searchBarStyle = .default
searchTextField.backgroundColor = .yourColor
この組み合わせを使用すると、searchTextFieldの灰色の背景を削除して、独自の背景を設定できます。