美文网首页
UITextView的placeholderLabel

UITextView的placeholderLabel

作者: LJMagicCoder | 来源:发表于2017-10-12 20:10 被阅读0次

    UITextView自己没有默认的占位符,如果有需求我们一般都会自己加一个,方法有很多,比如说自己建一个Label,监听UITextView的文字变化来修改Label的状态等等。

    这里我们用到一个UITextView私有属性_placeholderLabel,这个属性貌似是需要ios8.3之后的版本才能使用,而且以后会不会有也不知道。因为用到了系统私有变量,怕上架被拒。所以慎用。

    先在UITextView的分类里加个属性
    @property (nonatomic, strong ,readonly) UILabel *placeholderLabel;

    然后补上它的get和set方法。

    - (UILabel *)placeholderLabel {
        UILabel *placeholderLabel = objc_getAssociatedObject(self, _cmd);
        if (!placeholderLabel) {
            placeholderLabel = [[UILabel alloc] init];
            placeholderLabel.numberOfLines = 0;
            placeholderLabel.textColor = [UIColor lightGrayColor];
            placeholderLabel.font = self.font ? self.font : [UIFont systemFontOfSize:17];
            [placeholderLabel sizeToFit];
            [self addSubview:placeholderLabel];
            @try { [self setValue:placeholderLabel forKey:@"_placeholderLabel"]; } @catch (NSException *exception) {} @finally {}
            [self addObserver:self forKeyPath:@"font" options:NSKeyValueObservingOptionNew context:nil];
            self.placeholderLabel = placeholderLabel;
        }
        return placeholderLabel;
    }
        
    - (void)setPlaceholderLabel:(UILabel *)placeholderLabel {
        objc_setAssociatedObject(self, @selector(placeholderLabel), placeholderLabel, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    

    这里 placeholderLabel.font = self.font ? self.font : [UIFont systemFontOfSize:17];
    这句话一定要有,否则有可能会移位,原因是这时的UITextView的font可能为nil。

    这里 @try { [self setValue:placeholderLabel forKey:@"_placeholderLabel"]; } @catch (NSException *exception) {} @finally {} 防止老版本没有这个属性。

    再把监听font属性加上

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
        if ([keyPath isEqualToString:@"font"]) self.placeholderLabel.font = [change objectForKey:@"new"];
    }
    

    最后别忘了释放监听

    - (void)dealloc {
        if (objc_getAssociatedObject(self, @selector(placeholderLabel))) [self removeObserver:self forKeyPath:@"font"];
    }
    

    这样基本上就可以使用了。

    调用直接设置placeholderLabel的text

        UITextView *textView = [[UITextView alloc]initWithFrame:CGRectMake(100, 100, 200, 200)];
        [self.view addSubview:textView];
        textView.placeholderLabel.text = @"占位符测试";
        textView.font = [UIFont systemFontOfSize:26];

    相关文章

      网友评论

          本文标题:UITextView的placeholderLabel

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