iOS UISearchBar 修改背景样式,修改cancel按钮颜色 placehold左对齐

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];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,275评论 25 707
  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,237评论 7 249
  • 奶奶没上过学 不识字 看电视的时候爷爷总会把电视上的内容重复说一遍 我从小到大爷爷一直都这样做 我有时候不耐烦了 ...
    SMILEMORE阅读 157评论 0 1
  • 每个人的心里,都会有那么一个拿得起却又放不下的存在。会想起,会挂念,只是却再也不会提起。 而在她的记忆里,L便是那...
    贰姑娘2阅读 391评论 0 1