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];