web-gelistirme-sc.com

İOS'ta UISearchBar bileşeninin arka plan renginin içindeki değişiklik

Arama alanı çevresinde UISearchBar arka plan rengini nasıl değiştireceğimi/değiştireceğimi biliyorum:

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

achieved UISearchBar customization

Ama bunun içinde nasıl yapılacağını bilmiyorum:

desired UISearchBar customization

Bunun iOS 4.3+ ile uyumlu olması gerekiyor.

55
Borut Tomazin

SearchBar UITextFieldbackgroundImage öğesini değiştirmek için bu kodu kullanın.

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öğesini değiştirmek için aşağıdaki kodu kullanın:

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

Ayrıca, searchBar simgesini değiştirmek için UISearchBar('de iOS 5 + adresinden erişilebilir) üzerinde aşağıdaki yerleşik yöntemi kullanabilirsiniz:

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

Burada 4 tip UISearchBarIconi.e .: ayarlayabilirsiniz.

  1. UISearchBarIconBookmarkname__
  2. UISearchBarIconClearname__
  3. UISearchBarIconResultsListname__
  4. UISearchBarIconSearchname__

Umarım bu sana yardımcı olur...

33
Paras Joshi

Sadece metin alanının kendisini özelleştirin.

Ben sadece bunu yapıyorum ve benim için iyi çalışıyor (iOS 7).

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

Bu sayede resim oluşturmanıza, boyutlandırmanıza vb. Gerek yoktur ...

48
AbuZubair

Özel API içermeyen çözüm! :)

Şu anda ( muhtemelen iOS 5'ten beri ) bunu, tek renk durumlarında, bu şekilde yapabilirsiniz:

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setBackgroundColor:[UIColor redColor]];

ancak görünümün temelinde değişimin uygulama için küresel olacağını unutmayın (çözümün bir avantajı veya dezavantajı olabilir).

Swift için kullanabilirsiniz (iOS 9 ve üzeri için çalışacaktır):

if #available(iOS 9.0, *) {
    UITextField.appearanceWhenContainedInInstancesOfClasses([UISearchBar.self]).backgroundColor = UIColor.darkGrayColor()
}

Projeniz iOS 9 ve daha yenisini destekliyorsa #available 'a ihtiyacınız yoktur.

İOS'un önceki sürümlerini desteklemeniz gerekiyorsa ve Swift'i kullanmak istiyorsanız, this question adresine bakın.

35
Julian Król

Swift 3, xcode 8.2.1

UISearchBar özelleştirme örneği

Tam örnek

UISearchBar uzantısı

extension UISearchBar {

    private func getViewElement<T>(type: T.Type) -> T? {

        let svs = subviews.flatMap { $0.subviews }
        guard let element = (svs.filter { $0 is T }).first as? T else { return nil }
        return element
    }

    func setTextFieldColor(color: UIColor) {

        if let textField = getViewElement(type: UITextField.self) {
            switch searchBarStyle {
                case .minimal:
                    textField.layer.backgroundColor = color.cgColor
                    textField.layer.cornerRadius = 6

                case .prominent, .default:
                    textField.backgroundColor = color
            }
        }
    }
}

Kullanım

let searchBar = UISearchBar(frame: CGRect(x: 0, y: 20, width: UIScreen.main.bounds.width, height: 44))
//searchBar.searchBarStyle = .prominent
view.addSubview(searchBar)
searchBar.placeholder = "placeholder"
searchBar.setTextFieldColor(color: UIColor.green.withAlphaComponent(0.3))

Sonuç 1

 searchBar.searchBarStyle = .prominent // or default

 enter image description here

Sonuç 2

 searchBar.searchBarStyle = .minimal

 enter image description here

26

UISearchBar belgelerine göre :

İOS 5.0+ için bu işlevi kullanmalısınız.

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

Kullanım örneği:

[mySearchBar setSearchFieldBackgroundImage:myImage forState:UIControlStateNormal];

Ne yazık ki, iOS 4'te daha az karmaşık yöntemlere geri dönmeniz gerekir. Diğer cevaplara bakınız.

23
Accatyyc

Accatyyc'in iOS5 + için dediği gibi setSearchFieldBackgroundImage kullanın, ancak bir grafik oluşturmanız veya şunu yapmanız gerekir:

CGSize size = CGSizeMake(30, 30);
// create context with transparent background
UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);

// Add a clip before drawing anything, in the shape of an rounded rect
[[UIBezierPath bezierPathWithRoundedRect:CGRectMake(0,0,30,30)
                            cornerRadius:5.0] addClip];
[[UIColor grayColor] setFill];

UIRectFill(CGRectMake(0, 0, size.width, size.height));
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

[self.searchBar setSearchFieldBackgroundImage:image forState:UIControlStateNormal];
18
Nick H247

peki ya Apple yolu?

UISearchBar.appearance().setSearchFieldBackgroundImage(myImage, for: .normal)

tasarımınızdaki herhangi bir görüntüyü ayarlayabilirsiniz!

Fakat tüm program materyallerini oluşturmak istiyorsanız, bunu yapabilirsiniz.


benim çözümüm Swift 3  

let searchFieldBackgroundImage = UIImage(color: .searchBarBackground, size: CGSize(width: 44, height: 30))?.withRoundCorners(4)
UISearchBar.appearance().setSearchFieldBackgroundImage(searchFieldBackgroundImage, for: .normal)

yardımcı uzantısını kullanıyorum

public extension UIImage {

    public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
        let rect = CGRect(Origin: .zero, size: size)
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
        color.setFill()
        UIRectFill(rect)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        guard let cgImage = image?.cgImage else { return nil }
        self.init(cgImage: cgImage)
    }

    public func withRoundCorners(_ cornerRadius: CGFloat) -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        let rect = CGRect(Origin: CGPoint.zero, size: size)
        let context = UIGraphicsGetCurrentContext()
        let path = UIBezierPath(roundedRect: rect, cornerRadius: cornerRadius)

        context?.beginPath()
        context?.addPath(path.cgPath)
        context?.closePath()
        context?.clip()

        draw(at: CGPoint.zero)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext();

        return image;
    }

}
13
EvGeniy Ilyin

Bunu, UISearchBarStyle.Minimal kullanarak Swift 2.2 ve iOS 8+ sürümlerinde çeşitli arama çubuğu özelliklerinin görünümünü özelleştirmenin en iyi yolu olarak buldum

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

 enter image description here

7
Alex Koshy

Özel API kullanmadan:

for (UIView* subview in [[self.searchBar.subviews lastObject] subviews]) {
    if ([subview isKindOfClass:[UITextField class]]) {
        UITextField *textField = (UITextField*)subview;
        [textField setBackgroundColor:[UIColor redColor]];
    }
}
6
Tomer Even

Daha iyi bir çözüm UITextField içindeki UISearchBar görünümünü ayarlamanız

[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setBackgroundColor:[UIColor grayColor]];
6
Mahmoud Adam

Sadece bir kategori yöntemini kullanarak tüm görünümlerde gezinin (iOS 7'de doğrulandı ve özel API kullanmıyor):

@implementation UISearchBar (MyAdditions)

- (void)changeDefaultBackgroundColor:(UIColor *)color {
  for (UIView *subview in self.subviews) {
    for (UIView *subSubview in subview.subviews) {
      if ([subSubview isKindOfClass:[UITextField class]]) {
        UITextField *searchField = (UITextField *)subSubview;
        searchField.backgroundColor = color;
        break;
      }
    }
  }
}

@end

Bu yüzden kategoriyi sınıfınıza aktardıktan sonra, şu şekilde kullanın:

[self.searchBar changeDefaultBackgroundColor:[UIColor grayColor]];

Bunu derhal [[UISearchBar alloc] init] satırından sonra koyarsanız, arama çubuğunun alt görünümleri hala oluşturulmakta olduğundan işe yaramaz. Arama çubuğunun geri kalan kısmını ayarladıktan sonra birkaç satır koyun.

5
iwasrobbed

Sadece rengini değiştirmek için: 

searchBar.tintColor = [UIColor redColor];

Arka Plan Resmini Uygulamak İçin:

[self.searchBar setSearchFieldBackgroundImage:
                          [UIImage imageNamed:@"Searchbox.png"]
                                     forState:UIControlStateNormal];
4
Pushkraj
- (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;
}
3
Meerschwein Bob

Bu Swift versiyonudur (Swift 2.1/IOS 9)

for view in searchBar.subviews {
    for subview in view.subviews {
        if subview .isKindOfClass(UITextField) {
            let textField: UITextField = subview as! UITextField
            textField.backgroundColor = UIColor.lightGrayColor()
        }
    }
}
3

İOS 9 için şunu kullanın:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.

// Remove lag on oppening the keyboard for the first time
UITextField *lagFreeField = [[UITextField alloc] init];
[self.window addSubview:lagFreeField];
[lagFreeField becomeFirstResponder];
[lagFreeField resignFirstResponder];
[lagFreeField removeFromSuperview];

//searchBar background color change
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setBackgroundColor:[UIColor greenColor]];
[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blackColor];

return YES;
}
1
Boris Nikolić

Hızlı 3

for subview in searchBar.subviews {
    for innerSubview in subview.subviews {
        if innerSubview is UITextField {
            innerSubview.backgroundColor = UIColor.YOUR_COLOR_HERE
        }
    }
}
1
Chris Chute

Swift 3+ için şunu kullanın:  

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
        }
     }
}
1
Alien

Bu benim için çalıştı.

- (void)setupSearchBar
{
    [self.searchBar setReturnKeyType:UIReturnKeySearch];
    [self.searchBar setEnablesReturnKeyAutomatically:NO];
    [self.searchBar setPlaceholder:FOLocalizedString(@"search", nil)];
    [self.searchBar setBackgroundImage:[UIImage new]];
    [self.searchBar setBackgroundColor:[UIColor myGreyBGColor]];
    [self.searchBar setBarTintColor:[UIColor myGreyBGColor]];
    [self.searchBar setTintColor:[UIColor blueColor]];
}
0
Varun Naharia

@EvGeniy ​​Ilyin EvGeniy ​​Ilyin'in çözümü en iyisidir .. __ Bu çözüme dayanan bir Objective-C sürümü yazdım. 

UIImage kategorisi oluşturun ve UIImage + YourCategory.h dizininde iki sınıf yönteminin reklamını yapın 

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

UIImage + YourCategory.m yöntemlerini uygulayın

// 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;
}

Kendi UISearchBar'ınızı ViewController adresinizde yapın

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

Bunu iOS 13+ üzerinde yapmak için,

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

Varsayılan olarak, searchTextField.borderStyle öğesinin belirleyeceğiniz rengin üstüne hafif bir gri kaplama uygulayan roundedRect olarak ayarlandığını unutmayın. Bu istenmeyen ise, yapın

searchController.searchBar.searchTextField.borderStyle = .none

Bu, gri kaplamadan kurtulacak, aynı zamanda yuvarlak köşelerden de kurtulacaktır.

0
Apoorv Khatreja

Swift 4 ile, yalnızca bunu yapmanız önerilir, ek kod gerekmez:

self.searchBar.searchBarStyle = .prominent
self.searchBar.barStyle = .black

Dış arka planın gri olmasını istemiyorsanız, .prominent değerini .minimal olarak da değiştirebilirsiniz.

0
Chris Herbst