68

UISearchBar検索フィールドの背景色を削除/変更する方法を知っています:

[[self.searchBar.subviews objectAtIndex:0] removeFromSuperview];
self.searchBar.backgroundColor = [UIColor grayColor];

UISearchBar のカスタマイズを実現

しかし、その中でこれを行う方法がわかりません:

必要な UISearchBar のカスタマイズ

これは、iOS 4.3 以降と互換性がある必要があります。

4

26 に答える 26

47

テキストフィールド自体をカスタマイズするだけです。

私は単にこれを行っており、私にとってはうまく機能します(iOS 7)。

UITextField *txfSearchField = [_searchBar valueForKey:@"_searchField"];
txfSearchField.backgroundColor = [UIColor redColor];

この方法では、画像を作成したり、サイズを変更したりする必要はありません...

于 2013-10-10T00:01:29.540 に答える
36

次のコードを使用して、searchBar のUITextFieldbackgroundImageを変更します。

UITextField *searchField;
NSUInteger numViews = [searchBar.subviews count];
for (int i = 0; i < numViews; i++) {
    if ([[searchBar.subviews objectAtIndex:i] isKindOfClass:[UITextField class]]) { //conform?
        searchField = [searchBar.subviews objectAtIndex:i];
    }
}
if (searchField) {
    searchField.textColor = [UIColor whiteColor];
    [searchField setBackground: [UIImage imageNamed:@"yourImage"]]; //set your gray background image here
    [searchField setBorderStyle:UITextBorderStyleNone];
}

以下のコードを使用して、を変更しUISearchBarIconます。

 UIImageView *searchIcon = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"yourSearchBarIconImage"]];
searchIcon.frame = CGRectMake(10, 10, 24, 24);
[searchBar addSubview:searchIcon];
[searchIcon release];

また、searchBar アイコンを変更するには、次の組み込みメソッドを使用できます ( iOS 5 以降UISearchBarで利用可能):

- (void)setImage:(UIImage *)iconImage forSearchBarIcon:(UISearchBarIcon)icon state:(UIControlState)state

UISearchBarIconここでは、次の 4 種類のieを設定できます。

  1. UISearchBarIconBookmark
  2. UISearchBarIconClear
  3. UISearchBarIconResultsList
  4. UISearchBarIconSearch

これがお役に立てば幸いです...

于 2012-12-11T10:08:55.140 に答える
24

UISearchBarのドキュメントによると:

この関数は iOS 5.0 以降で使用する必要があります。

- (void)setSearchFieldBackgroundImage:(UIImage *)backgroundImage forState:(UIControlState)state

使用例:

[mySearchBar setSearchFieldBackgroundImage:myImage forState:UIControlStateNormal];

残念ながら、iOS 4 ではあまり洗練されていない方法に戻す必要があります。他の回答を参照してください。

于 2012-12-11T10:33:18.800 に答える
14

iOS 13 以降でこれを行うには、

searchController.searchBar.searchTextField.backgroundColor = // your color here

searchTextField.borderStyleデフォルトでは が に設定されていることに注意してください。これにより、設定roundedRectする色の上にわずかに灰色のオーバーレイが適用されます。これが望ましくない場合は、

searchController.searchBar.searchTextField.borderStyle = .none

これにより、灰色のオーバーレイが取り除かれますが、丸みを帯びた角も取り除かれます。

于 2019-08-29T20:34:44.467 に答える
7

これは、Swift 2.2 および iOS 8+ でさまざまな検索バー属性の外観をカスタマイズする最良の方法であることがわかりました。UISearchBarStyle.Minimal

searchBar = UISearchBar(frame: CGRectZero)
searchBar.tintColor = UIColor.whiteColor() // color of bar button items
searchBar.barTintColor = UIColor.fadedBlueColor() // color of text field background
searchBar.backgroundColor = UIColor.clearColor() // color of box surrounding text field
searchBar.searchBarStyle = UISearchBarStyle.Minimal

// Edit search field properties
if let searchField = searchBar.valueForKey("_searchField") as? UITextField  {
  if searchField.respondsToSelector(Selector("setAttributedPlaceholder:")) {
    let placeholder = "Search"
    let attributedString = NSMutableAttributedString(string: placeholder)
    let range = NSRange(location: 0, length: placeholder.characters.count)
    let color = UIColor(white: 1.0, alpha: 0.7)
    attributedString.addAttribute(NSForegroundColorAttributeName, value: color, range: range)
    attributedString.addAttribute(NSFontAttributeName, value: UIFont(name: "AvenirNext-Medium", size: 15)!, range: range)
    searchField.attributedPlaceholder = attributedString

    searchField.clearButtonMode = UITextFieldViewMode.WhileEditing
    searchField.textColor = .whiteColor()
  }
}

// Set Search Icon
let searchIcon = UIImage(named: "search-bar-icon")
searchBar.setImage(searchIcon, forSearchBarIcon: .Search, state: .Normal)

// Set Clear Icon
let clearIcon = UIImage(named: "clear-icon")
searchBar.setImage(clearIcon, forSearchBarIcon: .Clear, state: .Normal)

// Add to nav bar
searchBar.sizeToFit()
navigationItem.titleView = searchBar

ここに画像の説明を入力

于 2016-05-16T18:31:55.083 に答える
6

プライベート API を使用しない場合:

for (UIView* subview in [[self.searchBar.subviews lastObject] subviews]) {
    if ([subview isKindOfClass:[UITextField class]]) {
        UITextField *textField = (UITextField*)subview;
        [textField setBackgroundColor:[UIColor redColor]];
    }
}
于 2013-11-07T12:39:41.770 に答える
5

色のみを変更する場合:

searchBar.tintColor = [UIColor redColor];

背景画像を適用する場合:

[self.searchBar setSearchFieldBackgroundImage:
                          [UIImage imageNamed:@"Searchbox.png"]
                                     forState:UIControlStateNormal];
于 2013-07-08T13:04:49.963 に答える
3
- (void)viewDidLoad
{
    [super viewDidLoad];
    [[self searchSubviewsForTextFieldIn:self.searchBar] setBackgroundColor:[UIColor redColor]];
}

- (UITextField*)searchSubviewsForTextFieldIn:(UIView*)view
{
    if ([view isKindOfClass:[UITextField class]]) {
        return (UITextField*)view;
    }
    UITextField *searchedTextField;
    for (UIView *subview in view.subviews) {
        searchedTextField = [self searchSubviewsForTextFieldIn:subview];
        if (searchedTextField) {
            break;
        }
    }
    return searchedTextField;
}
于 2014-10-09T09:55:47.610 に答える
1

Swift 3+ の場合、これを使用します。

for subView in searchController.searchBar.subviews {

    for subViewOne in subView.subviews {

        if let textField = subViewOne as? UITextField {

           subViewOne.backgroundColor = UIColor.red

           //use the code below if you want to change the color of placeholder
           let textFieldInsideUISearchBarLabel = textField.value(forKey: "placeholderLabel") as? UILabel
                textFieldInsideUISearchBarLabel?.textColor = UIColor.blue
        }
     }
}
于 2017-03-31T08:54:22.257 に答える
0

@EvGeniy Ilyin EvGeniy Ilyinのソリューションが最適です。このソリューションに基づいて 、Objective-Cバージョンを作成しました。

カテゴリを作成し、 UIImage+YourCategory.hUIImageで 2 つのクラス メソッドを宣伝します。

+ (UIImage *)imageWithColor:(UIColor *)color withSize:(CGRect)imageRect;
+ (UIImage *)roundImage:(UIImage *)image withRadius:(CGFloat)radius;

UIImage+YourCategory.mにメソッドを実装する

// create image with your color
+ (UIImage *)imageWithColor:(UIColor *)color withSize:(CGRect)imageRect
{
    UIGraphicsBeginImageContext(imageRect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, imageRect);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

// get a rounded-corner image from UIImage instance with your radius
+ (UIImage *)roundImage:(UIImage *)image withRadius:(CGFloat)radius
{
    CGRect rect = CGRectMake(0.0, 0.0, 0.0, 0.0);
    rect.size = image.size;
    UIGraphicsBeginImageContextWithOptions(image.size, NO, [UIScreen mainScreen].scale);
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect
                                                cornerRadius:radius];
    [path addClip];
    [image drawInRect:rect];

    image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

自分UISearchBarで作るViewController

CGRect rect = CGRectMake(0.0, 0.0, 44.0, 30.0);
UIImage *colorImage = [UIImage imageWithColor:[UIColor yourColor] withSize:rect];
UIImage *finalImage = [UIImage roundImage:colorImage withRadius:4.0];
[yourSearchBar setSearchFieldBackgroundImage:finalImage forState:UIControlStateNormal];
于 2017-10-12T01:26:57.733 に答える