今天有需求,做一个只能输入数字的textField,并且可以在后面追加单位,比如%号,或者个,或者其他什么的,另外还可以限制数字的最大范围,比如不能超过100,或者任意一个定义的数字。
#import <UIKit/UIKit.h>
@interface NumberTextField : UITextField {
UILabel *label;//显示尾部的label
}
@property(assign, nonatomic) BOOL showLabelFlg;//是否追加标记
@property(retain, nonatomic) NSString *labelText;//标记的文字内容
@property(retain, nonatomic) UIFont *labelTextFont;//标记的字体大小
@property double maxNumber;//设置要限制的数字的最大值,默认为0,不限制
//设置是否显示标签label
-(void) showlabelFlgSet:(BOOL) flg;
//设置label的字体,不设置时,默认使用textField的字体
-(void) labelTextFontSet:(UIFont *) font;
@end
#import "NumberTextField.h"
#define NUMBERS @"0123456789."
@implementation NumberTextField
//构造方法
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.keyboardType = UIKeyboardTypeNumberPad;
//设置注册事件
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange:) name:UITextFieldTextDidChangeNotification object:self];
}
return self;
}
//构造方法
- (id)init
{
self = [super init];
if (self) {
// Initialization code
self.keyboardType = UIKeyboardTypeNumberPad;
//设置注册事件
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange:) name:UITextFieldTextDidChangeNotification object:self];
}
return self;
}
//设置label的字体,不设置时,默认使用textField的字体
-(void) labelTextFontSet:(UIFont *) font {
self.labelTextFont = font;
[self setInitLabel];
}
//显示label
-(void) showlabelFlgSet:(BOOL) flg {
self.showLabelFlg = flg;
if(label == nil) {
[self setInitLabel];
}
if(flg) {
[self addSubview:label];
} else {
[label removeFromSuperview];
}
}
//初始化label
-(void) setInitLabel {
NSString *str = @"";
UIFont *font;
if (self.labelText != nil) {
str = self.labelText;
}
if(self.labelTextFont != nil) {
font = self.labelTextFont;
} else {
font = self.font;
}
label = [[UILabel alloc] init];
label.text = str;
label.font = font;
CGSize size = [str sizeWithFont:font constrainedToSize:self.frame.size lineBreakMode:NSLineBreakByWordWrapping];
// NSLog(@"self.frame.size.height: %f", self.frame.size.height);
// NSLog(@"size.height: %f", size.height);
float y = (self.frame.size.height - size.height)/2.2;
float height = size.height + 1.0;
label.frame = CGRectMake(2, y, size.width, height >= self.frame.size.height ? self.frame.size.height : height);
// label.layer.borderWidth = 1;
}
//重写注销方法
-(void) dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:self];
}
//文字变化调用的方法
-(void) textDidChange : (NSNotification *)notification {
NSString *string = self.text;
NSCharacterSet*cs;
cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS] invertedSet];
NSString*filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
BOOL basicTest = [string isEqualToString:filtered];
if(!basicTest) {
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"提示"
message:@"请输入数字"
delegate:nil
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
[alert show];
self.text = @"";
}
if(self.maxNumber != 0) {
double number = [self.text doubleValue];
while (number > self.maxNumber) {
self.text = [self.text substringToIndex:self.text.length - 1];
number = [self.text doubleValue];
}
}
CGSize size = [self.text sizeWithFont:self.font constrainedToSize:self.frame.size lineBreakMode:NSLineBreakByWordWrapping];
float x = size.width + 2.0;
float y = (self.frame.size.height - size.height)/2.2;
label.frame = CGRectMake(x, y, label.frame.size.width, label.frame.size.height);
}