美文网首页IOS技术解决方案程序员iOS Developer
UITextField中Placeholder的问题(附:常用属

UITextField中Placeholder的问题(附:常用属

作者: 明月钓无痕 | 来源:发表于2016-02-11 17:00 被阅读9969次

    其实对于UITextField,本来没有什么好说的地方。但是在应用时,有一些细节要注意一下。就是关于Placeholder的问题。
    对于普通的需求,我们只是设置一下textField.placeholder=@"xxx"这个属性就好了。但是要对Placeholder设置一些属性的话。那么就得看另一个属性attributedPlaceholder了。
    下面是部分代码片段(ps:其中有些使用了分类或宏定义十分简单,很容易看懂是做什么,代码就没贴)

      // 自定义的类
       DZCustomTextField *accountField = [[DZCustomTextField alloc] init];
        accountField.frame = CGRectMake(10, 10, self.view.width - 20, 50);
        // 为了给textField添加一个图片,创建一个imageView
        UIImageView *accLeftView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"xxx"]];
        accLeftView.contentMode = UIViewContentModeCenter;
        accLeftView.width = 55;
        // 添加到左侧视图中
        accountField.leftView = accLeftView;
        accountField.leftViewMode = UITextFieldViewModeAlways; // 这句一定要加,否则不显示
        [self setupCornerRadiusOfView:accountField];
        // 这个方法是自定义的一个方法
        [accountField customWithPlaceholder:@"账户" color: DZCOLOR(169, 104, 28) font:[UIFont systemFontOfSize:12]];
    

    由于对边框进行自定义,这里对layer进行操作,当然最好是让美工出张图

    - (void)setupCornerRadiusOfView:(UIView *)view {
        view.layer.cornerRadius = 14;
        view.layer.borderColor = DZCOLOR(169, 104, 28).CGColor;
        view.layer.borderWidth = 1.0;
    }
    

    下面是自定义类的内容

    #import "DZCustomTextField.h"
    
    @implementation DZCustomTextField
    // 设置Placeholder
    - (void)customWithPlaceholder: (NSString *)placeholder color: (UIColor *)color font: (UIFont *)font {
    
      // 方法一:修改attributedPlaceholder;
        self.attributedPlaceholder = [NSAttributedString attributedStringWithString:placeholder color:color font:font];
    
    // 方法二:使用KVC,最为简单
    //    self.placeholder = placeholder;
    //    [self setValue:color forKeyPath:@"_placeholderLabel.color"];
    //    [self setValue:font forKeyPath:@"_placeholderLabel.font"];
    }
    
    // 重写这个方法是为了使Placeholder居中,如果不写会出现类似于下图中的效果,文字稍微偏上了一些
    - (void)drawPlaceholderInRect:(CGRect)rect {
        [super drawPlaceholderInRect:CGRectMake(0, self.height * 0.5 - 1, 0, 0)];
    }
    
    @end
    

    上面的方法一,我写了一个分类

    #import "NSAttributedString+Extension.h"
    
    @implementation NSAttributedString (Extension)
    
    + (NSAttributedString *)attributedStringWithString:(NSString *)string color:(UIColor *)color font:(UIFont *)font {
        NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
        attrs[NSForegroundColorAttributeName] = color;
        attrs[NSFontAttributeName] = font;
        NSAttributedString *attributedStr = [[NSAttributedString alloc] initWithString:string attributes:attrs];
        return attributedStr;
    }
    

    使用runtime获取属性和成员变量

    刚才提到使用KVC来修改Placeholder。但是如何知道内部属性呢。这里就用到了runtime了。 这里是尝试使用swift代码写的,大家见谅。

    class DZTextField: UITextField {
    
    override class func initialize () {
            getIvars()
        }
        
        /**
         runtime
         */
        class func getPropertyList() {
            var count: UInt32 = 0
            // 获取属性列表
            let pros = class_copyPropertyList(UITextField.classForCoder(), &count) // 这里不能使用self
            for i in 0..<count {
                let pro = pros[Int(i)]
                let name = property_getName(pro)
                if let proName = String.fromCString(name) {
                    let proType = String.fromCString(property_getAttributes(pro))
                    debugPrint("\(proName)====\((proType!))")
                }
            }
        }
    
        class func getIvars() {
            var count: UInt32 = 0
            // 获取成员变量列表
            let ivars = class_copyIvarList(UITextField.classForCoder(), &count)
            for i in 0..<count {
                let ivar = ivars[Int(i)]
                
                let name = ivar_getName(ivar)
                
                if let ivarName = String.fromCString(name) {
                    let ivarType = String.fromCString(ivar_getTypeEncoding(ivar))
                    debugPrint("\(ivarName)===\(ivarType!)")
                }
            }
        }
    }
    
    

    补充: 常用的属性

    // 弹出键盘(成为第一响应者)
    [textField becomeFirstResponder];
    
    //收键盘(取消第一响应者)
    [textField resignFirstResponder];
    
    
    
    // 设置边框,如果是纯代码创建,不写则会看不到。
    textField.borderStyle =UITextBorderStyleRoundedRect; 
    可选属性:
          UITextBorderStyleNone,  无边框
          UITextBorderStyleLine,  有边框
          UITextBorderStyleBezel,  有边框和阴影
          UITextBorderStyleRoundedRect  圆角
    
    // 密文输入
    textField.secureTextEntry = YES; 
    
    // 键盘类型
    textField.keyboardType = UIKeyboardTypeNumberPad; 
      UIKeyboardTypeDefault,                   当前键盘(默认)
      UIKeyboardTypeASCIICapable,          字母输入键
      UIKeyboardTypeNumbersAndPunctuation,  数字和符号
      UIKeyboardTypeURL,                       URL键盘
      UIKeyboardTypeNumberPad,             数字键盘
      UIKeyboardTypePhonePad,               电话号码输入键盘   
      UIKeyboardTypeEmailAddress,          邮件地址输入键盘
    
    
    // 设置自定义键盘
    UIView *customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 300)];
      //位置和宽由系统决定。
      textField.inputView = customView ;
        inputAccessoryView 设置系统键盘或自定义键盘上的视图     
    
    // 对齐方式
      // 垂直对齐:
    textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter 
    可选属性:
          UIControlContentVerticalAlignmentCenter  居中对齐
          UIControlContentVerticalAlignmentTop    顶部对齐,默认是顶部对齐
          UIControlContentVerticalAlignmentBottom 底部对齐
          UIControlContentVerticalAlignmentFill    完全填充
    // 水平对齐:
    textField.textAlignment = UITextAlignmentCenter;
    可选属性:
          UITextAlignmentLeft,左对齐,默认是左对齐
          UITextAlignmentCenter,
          UITextAlignmentRight,右对齐      
    
    
    // 设置输入自动纠正模式
    textField.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;
    可选属性:
        UITextAutocapitalizationTypeNone, 不自动纠正
        UITextAutocapitalizationTypeWords,  单词首字母大写
        UITextAutocapitalizationTypeSentences,  句子的首字母大写
        UITextAutocapitalizationTypeAllCharacters, 所有字母都大写
    
    
    // 文本编辑框代理
    // 1、是否进入编辑模式
    - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    // 默认返回YES,进入编辑模式。NO不进入编辑模式
    }
    // 2、进入编辑模式
    - (void)textFieldDidBeginEditing:(UITextField *)textField {
    
    }
     
    // 3、是否退出编辑模式
    - (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
     // 默认返回YES,退出编辑模式。NO不退出编辑模式
    }
    
    // 4、退出编辑模式
    - (void)textFieldDidEndEditing:(UITextField *)textField {
    
    }
     
    // 5、点击清除按钮是否清除
    - (BOOL)textFieldShouldClear:(UITextField *)textField {
    // 默认返回YES,返回NO不清除
    }
    
    // 6、点击键盘上Return按钮时候调用
    - (BOOL)textFieldShouldReturn:(UITextField *)textField {
    
    }
     
    7、当输入任何字符时,代理调用该方法
    -(BOOL)textField:(UITextField *)field shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    // 当输入字符时,代理调用该方法
    // 返回YES则这次输入可以成功
    // 返回NO,不能输入成功
    // range表示光标位置
    // string表示这次输入的字符串。
    }
    
    
    // 自定义时重写方法 可以自定义各种边界
     - (CGRect)borderRectForBounds:(CGRect)bounds;      指定矩形边界
     - (CGRect)textRectForBounds:(CGRect)bounds;        指定显示文本的边界
     - (CGRect)placeholderRectForBounds:(CGRect)bounds; 指定占位符的边界
     - (CGRect)editingRectForBounds:(CGRect)bounds;     指定编辑中文本的边界
     - (CGRect)clearButtonRectForBounds:(CGRect)bounds; 指定显示清除按钮的边界
     - (CGRect)leftViewRectForBounds:(CGRect)bounds;    指定显示左附着视图的边界
     - (CGRect)rightViewRectForBounds:(CGRect)bounds;   指定显示右附着视图的边界
    

    相关文章

      网友评论

        本文标题:UITextField中Placeholder的问题(附:常用属

        本文链接:https://www.haomeiwen.com/subject/qghukttx.html