关于UITextField的封装

来源:互联网 发布:淘宝买iphone4s 编辑:程序博客网 时间:2024/06/02 02:00

直接上代码:

.H文件:

////  KPTextField.h////  如果有占位字符,请先设置占位字符内容,再设置相关属性////  Created by 刘鲲鹏 on 2017/5/16.//  Copyright © 2017年 刘鲲鹏. All rights reserved.//#import <UIKit/UIKit.h>#define KPTextFieldPaddingWidth  (10.0f)#define KPTextFieldPaddingHeight (5.0f)typedef void(^KP_textFieldLengthOverLimitBlock)(NSInteger maxLengthOfText);@interface KPTextField : UITextField/** 占位文字普通颜色 */@property (nonatomic, strong) UIColor *placeHolderNormalColor;/** 成为第一响应者时占位文字的文字颜色 */@property (nonatomic, strong) UIColor *placeHolderHighlightedColor;/** 占位文字字体大小 */@property (nonatomic, assign) CGFloat placeHolderFontSize;/** 左右缩进 默认为10 */@property (nonatomic, assign) CGFloat paddingWith;/** 上下缩进 默认为5 */@property (nonatomic, assign) CGFloat paddingHeight;/** 左侧内边距(不推荐使用,建议使用paddingWith) */@property (nonatomic, assign) CGFloat leftMargin;/** 右侧内边距(不推荐使用,建议使用paddingWith) */@property (nonatomic, assign) CGFloat rightMargin;/** clearButton普通状态图片 */@property (nonatomic, copy) NSString *clearButtonNormalImageName;/** clearButton高亮状态图片 */@property (nonatomic, copy) NSString *clearButtonHighlightedImageName;/** 设置边框宽度,默认没有边框 */@property (nonatomic, assign) NSUInteger borderWidth;/** 设置边框颜色,默认为亮灰色 */@property (nonatomic, strong) UIColor *borderColor;/** 设置圆角,默认没有圆角 */@property (nonatomic, assign) NSUInteger cornerRadius;/** 光标宽度,默认为2 */@property (nonatomic, assign) NSUInteger cursorWidth;/** 光标高度,默认为 self.font.lineHeight + 4 */@property (nonatomic, assign) NSUInteger cursorHeight;/** textField可以输入的最大字数,默认没有字数限制 */@property (nonatomic, assign) NSUInteger maxLengthOfText;/** *  文字字数超出设定值会自动调用 *  block参数(maxLengthOfText) → 文字长度最大值 */@property (nonatomic, strong) KP_textFieldLengthOverLimitBlock textOverLimitBlock;/** 禁止粘贴,默认为NO */@property (nonatomic, assign) BOOL forbidPaste;/** 设置为密码输入样式 */@property (nonatomic, assign) BOOL PasswordMode;@end

.M文件:

////  KPTextField.m//  TextField////  Created by 刘鲲鹏 on 2017/5/16.//  Copyright © 2017年 刘鲲鹏. All rights reserved.//#import "KPTextField.h"@implementation KPTextField- (instancetype)initWithFrame:(CGRect)frame {    if (self = [super initWithFrame:frame]) {        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didBeginEditing) name:UITextFieldTextDidBeginEditingNotification object:self];        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didEndEditing) name:UITextFieldTextDidEndEditingNotification object:self];        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange) name:UITextViewTextDidChangeNotification object:self];    }    return self;}- (void)textDidChange{    NSInteger wordCount = self.text.length;    NSLog(@"%ld",(long)wordCount);    if (_maxLengthOfText && wordCount >= _maxLengthOfText) {        self.text = [self.text substringToIndex:_maxLengthOfText];        if (_textOverLimitBlock) {            _textOverLimitBlock(_maxLengthOfText);        }    }}- (void)setPlaceHolderNormalColor:(UIColor *)placeHolderNormalColor {    _placeHolderNormalColor = placeHolderNormalColor;    if (self.placeholder) {        self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.placeholder attributes:@{NSForegroundColorAttributeName:_placeHolderNormalColor}];    }}- (void)didBeginEditing {    if (self.placeholder) {        self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.placeholder attributes:@{NSForegroundColorAttributeName:_placeHolderHighlightedColor}];    }}- (void)didEndEditing {    if (self.placeholder) {        self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.placeholder attributes:@{NSForegroundColorAttributeName:_placeHolderNormalColor}];    }}- (void)setPlaceHolderFontSize:(CGFloat)placeHolderFontSize {    _placeHolderFontSize = placeHolderFontSize;    if (self.placeholder) {        self.attributedPlaceholder = [[NSAttributedString alloc] initWithString:self.placeholder attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:_placeHolderFontSize]}];    }}//控制 placeHolder 的位置,左右缩进- (CGRect)textRectForBounds:(CGRect)bounds {    return CGRectInset(bounds,                       self.paddingWith == 0.0f ? KPTextFieldPaddingWidth : self.paddingWith,                       self.paddingHeight == 0.0f ? KPTextFieldPaddingHeight : self.paddingHeight);}// 控制文本的位置,左右缩进- (CGRect)editingRectForBounds:(CGRect)bounds {    return CGRectInset(bounds,                       self.paddingWith == 0.0f ? KPTextFieldPaddingWidth : self.paddingWith,                       self.paddingHeight == 0.0f ? KPTextFieldPaddingHeight : self.paddingHeight);}- (void)setPaddingWith:(CGFloat)paddingWith {    _paddingWith = paddingWith;    [self setNeedsDisplay];}- (void)setPaddingHeight:(CGFloat)paddingHeight {    _paddingHeight = paddingHeight;    [self setNeedsDisplay];}- (void)setLeftMargin:(CGFloat)leftMargin {    _leftMargin = leftMargin;    [self setValue:[NSNumber numberWithFloat:leftMargin] forKey:@"paddingLeft"];}- (void)setRightMargin:(CGFloat)rightMargin {    _rightMargin = rightMargin;    [self setValue:[NSNumber numberWithFloat:rightMargin] forKey:@"paddingRight"];}- (void)setClearButtonNormalImageName:(NSString *)clearButtonNormalImageName {    _clearButtonNormalImageName = clearButtonNormalImageName;    UIButton *clearButton = [self valueForKey:@"_clearButton"];    [clearButton setImage:[UIImage imageNamed:clearButtonNormalImageName] forState:UIControlStateNormal];}- (void)setClearButtonHighlightedImageName:(NSString *)clearButtonHighlightedImageName {    _clearButtonHighlightedImageName = clearButtonHighlightedImageName;    UIButton *clearButton = [self valueForKey:@"_clearButton"];    [clearButton setImage:[UIImage imageNamed:clearButtonHighlightedImageName] forState:UIControlStateHighlighted];}- (void)setBorderWidth:(NSUInteger)borderWidth {    _borderWidth = borderWidth;    self.layer.borderWidth = _borderWidth;}- (void)setBorderColor:(UIColor *)borderColor {    _borderColor = borderColor;    self.layer.borderColor = _borderColor.CGColor;}- (void)setCornerRadius:(NSUInteger)cornerRadius {    _cornerRadius = cornerRadius;    self.layer.cornerRadius = cornerRadius;}- (CGRect)caretRectForPosition:(UITextPosition *)position{    CGRect originalRect = [super caretRectForPosition:position];    if (_cursorHeight) {        originalRect.size.height = _cursorHeight;    }else {        originalRect.size.height = self.font.lineHeight + 4;    }    if (_cursorWidth) {        originalRect.size.width = _cursorWidth;    }else {        originalRect.size.width = 2;    }    return originalRect;}- (void)textLengthOverLimit:(KP_textFieldLengthOverLimitBlock)block {    _textOverLimitBlock = block;}- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{    if (action == @selector(paste:))//禁止粘贴        return !_forbidPaste;    if (action == @selector(select:))// 禁止选择        return NO;    if (action == @selector(selectAll:))// 禁止全选        return NO;    return [super canPerformAction:action withSender:sender];}- (void)setPasswordMode:(BOOL)PasswordMode {    _PasswordMode = PasswordMode;    if (_PasswordMode) {        self.placeholder = @"请输入密码";        self.secureTextEntry = YES;        self.clearButtonMode = UITextFieldViewModeNever;        UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.height, self.frame.size.height)];        imageView.image = [UIImage imageNamed:@"4321"];        self.rightView = imageView;        self.rightViewMode = UITextFieldViewModeAlways;        imageView.userInteractionEnabled = YES;        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(changPasswordMode:)];        [imageView addGestureRecognizer:tap];    }}- (void)changPasswordMode:(UITapGestureRecognizer *)tapGesture {    UIImageView *imageView = (UIImageView *)tapGesture.view;    _PasswordMode = !_PasswordMode;    if (!_PasswordMode) {        self.secureTextEntry = NO;        imageView.image = [UIImage imageNamed:@"1234"];    }else if (_PasswordMode) {        self.secureTextEntry = YES;        imageView.image = [UIImage imageNamed:@"4321"];    }}- (void)dealloc {    [[NSNotificationCenter defaultCenter] removeObserver:self];}@end