iOS UISearchBar 修改背景样式,修改cancel按
2016-12-07 本文已影响259人
iOS_ZG
Paste_Image.png
Paste_Image.png
最近公司要求开发一个新项目,使用到了UISearchBar进行地址搜索。
要求如下:
Paste_Image.png
原生的UISearchBar样式不能满足UI设计需求,网上找了大量资料才解决了这个问题。
Paste_Image.png新建JGSearchTextField 继承 UISearchBar
.h文件
#import <UIKit/UIKit.h>
@interface JGSearchTextField : UISearchBar
@property (nonatomic, assign, setter = setHasCentredPlaceholder:) BOOL hasCentredPlaceholder;
@end
.m文件
#import "JGSearchTextField.h"
@implementation JGSearchTextField
// ------------------------------------------------------------------------------------------
#pragma mark - Initializers
// ------------------------------------------------------------------------------------------
- (instancetype)initWithFrame:(CGRect)frame
{
if ((self = [super initWithFrame:frame]))
{
self.hasCentredPlaceholder = NO;
}
return self;
}
// ------------------------------------------------------------------------------------------
#pragma mark - Methods
// ------------------------------------------------------------------------------------------
- (void)setHasCentredPlaceholder:(BOOL)hasCentredPlaceholder
{
_hasCentredPlaceholder = hasCentredPlaceholder;
SEL centerSelector = NSSelectorFromString([NSString stringWithFormat:@"%@%@", @"setCenter", @"Placeholder:"]);
if ([self respondsToSelector:centerSelector])
{
NSMethodSignature *signature = [[UISearchBar class] instanceMethodSignatureForSelector:centerSelector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setTarget:self];
[invocation setSelector:centerSelector];
[invocation setArgument:&_hasCentredPlaceholder atIndex:2];
[invocation invoke];
}
}
@end
在控制器中使用JGSearchTextField
//语音搜索按钮
UIButton *voiceBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[voiceBtn setBackgroundImage:[UIImage imageNamed:@"search_ico_voice"] forState:UIControlStateNormal];
[self.navigationBar addSubview:voiceBtn];
self.searchBar = [[JGSearchTextField alloc] init];
self.searchBar.barStyle = UIBarStyleBlackOpaque;
self.searchBar.translucent = YES;
self.searchBar.delegate = self;
self.searchBar.placeholder = @"请输入地址或地区";
self.searchBar.keyboardType = UIKeyboardTypeDefault;
UIImage* searchBarBg = [self GetImageWithColor:[UIColor clearColor] andHeight:30.0f];
//设置背景图片
[_searchBar setBackgroundImage:searchBarBg];
//设置背景色
[_searchBar setBackgroundColor:[UIColor clearColor]];
//设置文本框背景
[_searchBar setSearchFieldBackgroundImage:searchBarBg forState:UIControlStateNormal];
[_searchBar setContentMode:UIViewContentModeLeft];
UITextField *searchField = [_searchBar valueForKey:@"_searchField"];
UIImage *image = [UIImage imageNamed:@"search_ico_search"];
UIImageView *iconView = [[UIImageView alloc] initWithImage:image];
iconView.frame = CGRectMake(0, 0, image.size.width , image.size.height);
searchField.leftView = iconView;
searchField.textAlignment = NSTextAlignmentLeft;
[self.navigationBar addSubview:self.searchBar];
[voiceBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.searchBar.mas_right).offset(5);
make.size.mas_equalTo(CGSizeMake(15, 15));
make.centerY.equalTo(self.searchBar);
}];
[self.searchBar mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.navigationBar).offset(35);
make.bottom.equalTo(self.navigationBar).offset(-10);
make.width.mas_equalTo(SCREEN_WIDTH*0.7);
make.height.mas_equalTo(30);
}];
//设置搜索框取消按钮颜色
NSMutableDictionary* dic = [NSMutableDictionary dictionary];
dic[NSForegroundColorAttributeName] = HexRGB(0x0aa676);
[[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil]setTitleTextAttributes:dic forState:UIControlStateNormal];
UIView *bottomLine = [[UIView alloc]init];
bottomLine.backgroundColor = HexRGB(0x0aa676);
[self.navigationBar addSubview:bottomLine];
[bottomLine mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.searchBar).offset(15);
make.right.equalTo(voiceBtn);
make.bottom.equalTo(self.navigationBar).offset(-5);
make.height.mas_equalTo(1);
}];
self.navigationBar.rightNormalImage=[UIImage imageNamed:@"search_ico_cbb"];
self.navigationBar.rightClickBlock=^{
};
/**
* 生成图片
*
* @param color 图片颜色
* @param height 图片高度
*
* @return 生成的图片
*/
- (UIImage*) GetImageWithColor:(UIColor*)color andHeight:(CGFloat)height
{
CGRect r= CGRectMake(0.0f, 0.0f, 1.0f, height);
UIGraphicsBeginImageContext(r.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, r);
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
最后初始化 UISearchDisplayController,遵循代理完成了地址搜索功能
- (void)initSearchDisplay
{
self.displayController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];
self.displayController.delegate = self;
self.displayController.searchResultsDataSource = self;
self.displayController.searchResultsDelegate = self;
[self setExtraCellLineHidden:self.displayController.searchResultsTableView];
}