UISearchBarsearch图标在iOS7中不是左alignment的

在iOS7中,search图标和占位符文本总是出现在中间。我尝试将search栏中的文本字段的文本alignment方式更改为左侧,但不起作用。 有什么办法让search栏search图标左alignment在iOS7中

我尝试了以下几行,但没有奏效:

UITextField *txfSearchField = [_searchBar valueForKey:@"_searchField"]; txfSearchField.textAlignment = NSTextAlignmentLeft; [_searchArticle setImage:image forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal]; UIimageView *im = [UIImageView alloc]init]; im.image = image; txfSearchField.leftView =im; 

没有办法改变search栏的占位符文本的alignment方式,我尝试了很多“所以”的答案,但没有人工作。 最后我结束了这个解决方法

在占位符文本的右边给出一些空格

  if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) { // Load resources for iOS 6.1 or earlier self.searchBar.placeholder = @"hello"; } else { // Load resources for iOS 7 or later self.searchBar.placeholder = @"hello "; } 

请享用 !!

在Swift-3中: –

放大图标可以通过在searchBar上添加子视图来左alignment,并使默认的放大图标无效。

 let width = 20 let height = 20 func changeSearchBarIcon() { let topView: UIView = searchBar.subviews[0] as UIView var searchField:UITextField! for subView in topView.subviews { if subView is UITextField { searchField = subView as! UITextField break } } if ((searchField) != nil) { let leftview = searchField.leftView as! UIImageView let magnifyimage = leftview.image let imageView = UIImageView(frame: CGRect(x: searchBar.frame.origin.x , y: 10, width: width, height: height ) ) imageView.image = magnifyimage searchField.leftView = UIView(frame: CGRect(x: 0 , y: 0, width: width, height: height) ) searchField.leftViewMode = .always searchField.superview?.addSubview(imageView) } } 

在这里输入图像说明

这不是一个好的解决scheme,但它的工作原理。 (在iOS 9上testing)

 import UIKit class MySearchBar: UISearchBar { override func layoutSubviews() { super.layoutSubviews() if let l = getTextFieldLabel() { l.addObserver(self, forKeyPath: "frame", options: .New, context: nil) } if let i = getIcon() { i.addObserver(self, forKeyPath: "frame", options: .New, context: nil) } } override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { if let l = object as? UILabel { l.removeObserver(self, forKeyPath: "frame") l.frame = CGRect(x: 29, y: 1, width: 323, height: 25) l.addObserver(self, forKeyPath: "frame", options: .New, context: nil) } if let i = object as? UIImageView { i.removeObserver(self, forKeyPath: "frame") i.frame = CGRect(x: 8, y: 7.5, width: 13, height: 13) i.addObserver(self, forKeyPath: "frame", options: .New, context: nil) } } func getTextFieldLabel() -> UILabel? { for v in self.allSubViews(self) { if NSStringFromClass(v.dynamicType) == "UISearchBarTextFieldLabel" { return v as? UILabel } } return nil } func getIcon() -> UIImageView? { for v in self.allSubViews(self) { if NSStringFromClass(v.dynamicType) == "UIImageView" { return v as? UIImageView } } return nil } func allSubViews( v : UIView!) -> [UIView] { var views : [UIView] = [] views += v.subviews for s in v.subviews { views += allSubViews(s) } return views } } 

1个子类uitextField

2在initWithFrame中

  [self setBackgroundColor:[UIColor clearColor]]; [self setTextAlignment:NSTextAlignmentLeft]; [self setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter]; [self setAutocorrectionType:UITextAutocorrectionTypeNo]; [self setAutocapitalizationType:UITextAutocapitalizationTypeNone]; [self setPlaceholder:@"Search"]; [self setLeftView:[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"search-icon"]]]; [self setLeftViewMode:UITextFieldViewModeAlways]; 

主类中的3包括UItextfieldDelegate并实现下面的委托方法

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSString* searchString = [textField.text stringByReplacingCharactersInRange:range withString:string]; searchYourFriendsArray = [[NSMutableArray alloc] init]; if(searchString.length > 0 ) { NSMutableArray *searchArray = [NSMutableArray arrayWithArray:yourFriendsArray]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"FirstName beginswith[C] %@ OR LastName beginswith[C] %@",searchString,searchString]; searchYourFriendsArray = [NSMutableArray arrayWithArray:[searchArray filteredArrayUsingPredicate:predicate]]; } return YES; } 

iOS 9的解决方法:

 extension ViewController: UISearchBarDelegate { func searchBarShouldBeginEditing(searchBar: UISearchBar) -> Bool { if let searchTextField = searchBar.valueForKey("_searchField") as? UITextField { if let placeholderLabel = searchTextField.valueForKey("_placeholderLabel") as? UILabel { if searchTextField.textColor == placeholderLabel.textColor { searchTextField.text = "" searchTextField.textColor = UIColor.blackColor() searchTextField.clearButtonMode = .Always } } } return true } func searchBarSearchButtonClicked(searchBar: UISearchBar) { if searchBar.text == "" { if let searchTextField = searchBar.valueForKey("_searchField") as? UITextField { if let placeholderLabel = searchTextField.valueForKey("_placeholderLabel") as? UILabel { searchBar.text = "Placeholder" searchTextField.textColor = placeholderLabel.textColor searchTextField.clearButtonMode = .Never } } } searchBar.resignFirstResponder() } } 

你可以调用这个方法,它看起来像屏幕截图: 在这里输入图像说明

 +(void)customizeDisplayForSeachbar:(UISearchBar *)searchBar { searchBar.barTintColor = [UIColor whiteColor]; searchBar.layer.borderWidth = 0.0; searchBar.layer.borderColor = [UIColor clearColor].CGColor; UITextField *txfSearchField = [searchBar valueForKey:@"_searchField"]; UIImage *imageIcon=[UIImage imageNamed:@"search_icon.png"]; float iconWidth=14; UIImageView *imgView=[[UIImageView alloc] initWithFrame:CGRectMake(15, (txfSearchField.superview.frame.size.height-iconWidth)/2-1, iconWidth, iconWidth)]; imgView.contentMode=UIViewContentModeScaleAspectFit; imgView.image=imageIcon; txfSearchField.leftView=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 40)]; txfSearchField.leftViewMode=UITextFieldViewModeAlways; [txfSearchField.superview addSubview:imgView]; }