LGLSearchBar

平时我们都是用UITextFeild 来写搜索框, 最近有时间就自己重新封装了UISearchBar, 他可以自行修改里面的属性来达到我们使用的要求。

源代码下载地址:https://github.com/liguoliangiOS/LGLSearchBar.git  欢迎各位下载使用,有问题可以qq联系我 185226139 如果觉得好用请给我点赞,谢谢!

这个使用简单:

#import "LGLSearchBar.h"

LGLSearchBar * searchBar = [[LGLSearchBar alloc] initWithFrame:CGRectMake(10, 200, SCREENWIDTH - 20, 40) searchBarStyle:LGLSearchBarStyleDefault];

    [searchBar searchBarTextSearchTextBlock:^(NSString *searchText) {

        NSLog(@"%@", searchText);

    }];

下面上具体的代码

LGLSearchBar.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

typedef void(^SearchTextBlock)(NSString * searchText);

typedef NS_ENUM(NSUInteger, LGLSearchBarStyle) {
    
    LGLSearchBarStyleDefault,
    LGLSearchBarStyleProminent,
    LGLSearchBarStyleMinimal  
};

typedef NS_ENUM(NSInteger, LGLTextBorderStyle) {
    
    LGLTextBorderStyleNone,
    LGLTextBorderStyleLine,
    LGLTextBorderStyleBezel,
    LGLTextBorderStyleRoundedRect
};

@interface LGLSearchBar : UIView

- (instancetype)initWithFrame:(CGRect)frame searchBarStyle:(LGLSearchBarStyle)style;



/** 提示文字 */
@property (nonatomic, copy)   NSString * placeholder;

/** 提示文字的颜色 */
@property (nonatomic, strong) UIColor  * placeholderColor;

/** 搜索框(输入框除外)的背景颜色 */
@property (nonatomic, strong) UIColor  * barBackgroudColor;

/** 输入框的背景颜色 */
@property (nonatomic, strong) UIColor  * textBackgroudColor;

/** 输入文字的颜色文字的颜色 */
@property (nonatomic, strong) UIColor  * textColor;

/** “搜索“文字的颜色 */
@property (nonatomic, strong) UIColor  * tintColor;

/** 提示文字的大小 */
@property (nonatomic, assign) CGFloat    placeholderFontSize;

/** 输入文字的大小 */
@property (nonatomic, assign) CGFloat    textFontSize;


/** 输入框的风格 */
@property (nonatomic, assign) LGLTextBorderStyle textBordStyle;

@property (nonatomic, copy) SearchTextBlock block;

/** 获得搜索的Text */
- (void)searchBarTextSearchTextBlock:(SearchTextBlock)block;

/** 改变里面输入框的 边框宽度 颜色 圆角  */
- (void)setSearchBarBordeWidth:(CGFloat)Width bordColor:(UIColor *)bordColor bordRadius:(CGFloat)bordcornerRadius;

/**
 * 修改放大镜的图片
 * @pramas imageName 图片名称
 * @pramas scale 改变图片的大小
 *
 */
- (void)setSearchBarImage:(NSString *)imageName scale:(CGFloat)scale;


@end

 LGLSearchBar.m

#import "LGLSearchBar.h"

@interface LGLSearchBar ()<UISearchBarDelegate>

{
    UISearchBar * _searchBar;
}


@end

@implementation LGLSearchBar

/*
     还需要添加 修改放大镜的图片
 
 
 */

- (instancetype)initWithFrame:(CGRect)frame  searchBarStyle:(LGLSearchBarStyle)style {
    self = [super initWithFrame:frame];
    if (self) {
        _searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
        _searchBar.barStyle =  (style == LGLSearchBarStyleDefault) ? UISearchBarStyleDefault : ((style == LGLSearchBarStyleProminent) ? UISearchBarStyleProminent : UISearchBarStyleMinimal);
        _searchBar.placeholder = @"请输入搜索内容";
        
        /*
         UITextAutocapitalizationTypeNone,             除非自己点击大写,否则永不大写
         UITextAutocapitalizationTypeWords,            以单词来区分,每个单词首字母大写
         UITextAutocapitalizationTypeSentences,        以句子来区分
         UITextAutocapitalizationTypeAllCharacters,    所有字母全部大写
         */
        _searchBar.autocapitalizationType = UITextAutocapitalizationTypeNone;
        //这个是透视属性
        //_searchBar.translucent = YES;
        _searchBar.delegate = self;
        [self addSubview:_searchBar];
    }
    return self;
}

#pragma mark ====  UITextFeildDElegate =======
// return NO to not resign first responder
- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar {
    return YES;
}

// called when keyboard search button pressed
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    self.block(searchBar.text);
    searchBar.text = nil;
    [searchBar resignFirstResponder];
}

 // called when cancel button pressed
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    self.block(searchBar.text);
    searchBar.text = nil;
    [searchBar resignFirstResponder];
}

// 重新设置 searchbar cancel按钮 为搜索
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
    searchBar.showsCancelButton = YES;
    for(UIView *view in  [[[searchBar subviews] objectAtIndex:0] subviews]) {
        if([view isKindOfClass:[NSClassFromString(@"UINavigationButton") class]]) {
            UIButton * cancel =(UIButton *)view;
            [cancel setTitle:@"搜索" forState:UIControlStateNormal];
            cancel.titleLabel.font = [UIFont systemFontOfSize:14];
        }
    }
}


#pragma mark ==== 重写set方法 ===============

- (void)setPlaceholderFontSize:(CGFloat )placeholderFontSize {
    _placeholderFontSize = placeholderFontSize;
     [[self searchBarTextFeild] setValue:[UIFont systemFontOfSize:placeholderFontSize] forKeyPath:@"_placeholderLabel.font"];
}

- (void)setTextFontSize:(CGFloat)textFontSize {
    _textFontSize = textFontSize;
    [self searchBarTextFeild].font = [UIFont systemFontOfSize:textFontSize];
}

- (void)setPlaceholder:(NSString *)placeholder {
    _placeholder = placeholder;
    _searchBar.placeholder = placeholder;
}

- (void)setTintColor:(UIColor *)tintColor {
    _tintColor = tintColor;
    _searchBar.tintColor = tintColor;
}

- (void)setBarBackgroudColor:(UIColor *)barBackgroudColor {
    _barBackgroudColor = barBackgroudColor;
     _searchBar.barTintColor = barBackgroudColor;
}

- (void)setTextBackgroudColor:(UIColor *)textBackgroudColor {
    _textBackgroudColor = textBackgroudColor;
    [[[_searchBar.subviews firstObject]subviews]lastObject].backgroundColor = textBackgroudColor;
}

- (void)setPlaceholderColor:(UIColor *)placeholderColor {
    _placeholderColor = placeholderColor;
    [[self searchBarTextFeild] setValue:placeholderColor forKeyPath:@"_placeholderLabel.textColor"];
}

- (void)setTextColor:(UIColor *)textColor {
    _textColor = textColor;
    [self searchBarTextFeild].textColor = textColor;
}

- (void)setSearchBarImage:(NSString *)imageName scale:(CGFloat)scale {
    UIImageView * leftView = [[UIImageView alloc] initWithImage:[self changeImageSize:imageName scale:scale]];
    [self searchBarTextFeild].leftView = leftView;
}

- (void)setTextBordStyle:(LGLTextBorderStyle)textBordStyle {
    _textBordStyle = textBordStyle;
    UITextBorderStyle bordStyle = (textBordStyle == LGLTextBorderStyleNone) ? UITextBorderStyleNone : ((textBordStyle == LGLTextBorderStyleLine) ? UITextBorderStyleLine : ((textBordStyle == LGLTextBorderStyleBezel) ? UITextBorderStyleBezel : UITextBorderStyleRoundedRect));
    [self searchBarTextFeild].borderStyle = bordStyle;
}

- (void)setSearchBarBordeWidth:(CGFloat)Width bordColor:(UIColor *)bordColor bordRadius:(CGFloat)bordcornerRadius {
    UITextField * texFeiled = [self searchBarTextFeild];
    texFeiled.layer.borderWidth = Width;
    texFeiled.layer.borderColor = bordColor.CGColor;
    texFeiled.layer.masksToBounds = YES;
    texFeiled.layer.cornerRadius = bordcornerRadius;

}

- (void)searchBarTextSearchTextBlock:(SearchTextBlock)block {
    self.block = block;
}

// 修改图片的大小
-  (UIImage *)changeImageSize:(NSString *)imageName scale:(CGFloat)scale
{
    NSData *imgData = UIImagePNGRepresentation([UIImage imageNamed:imageName]);
    UIImage * image = [UIImage imageWithData:imgData scale:scale];
    //声明使用自定义的图片
    image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    return image;
}
//获取输入框
- (UITextField *)searchBarTextFeild {
    UITextField * texFeild = nil;
    for (UIView* subview in [[_searchBar.subviews lastObject] subviews]) {
        
        if ([subview isKindOfClass:[UITextField class]]) {
            texFeild = (UITextField*)subview;
            
        } else if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")])
        {
            [subview removeFromSuperview];
        }
    }
    return texFeild;
}
@end

 感谢大家的支持!

有兴趣的可以加入QQ群:457236811
原文地址:https://www.cnblogs.com/ljmaque/p/LGLSearchBar.html