UITextView的placeholderLabel

2017-10-12  本文已影响0人  LJMagicCoder

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];
上一篇下一篇

猜你喜欢

热点阅读