做了一个带标记的textField

今天有需求,做一个只能输入数字的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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值