原生TextView无占位文字, 可通过drawRect:方法为其添加占位文字, 具体设置如下:
1. 获取当前占位文字属性:
// 文字属性 NSMutableDictionary *attrs = [NSMutableDictionary dictionary]; attrs[NSFontAttributeName] = self.font; // 获取当前PlaceholderTextView的文字属性 attrs[NSForegroundColorAttributeName] = self.placeholderColor ? self.placeholderColor : [UIColor lightGrayColor];
2. 设置绘制范围(包含文字边距):
// 绘制范围 CGFloat placeholderTopMargin = self.placeholderTopMargin ? self.placeholderTopMargin : kPlaceholderDefaultTopMargin; CGFloat placeholderLeftMargin = self.placeholderLeftMargin ? self.placeholderLeftMargin : kPlaceholderDefaultTopMargin; CGFloat placeholderX = placeholderTopMargin; CGFloat placeholderY = placeholderLeftMargin; CGFloat placeholderW = rect.size.width - 2 * placeholderLeftMargin; CGFloat placeholderH = rect.size.height - 2 * placeholderTopMargin; CGRect placeholderRect = CGRectMake(placeholderX, placeholderY, placeholderW, placeholderH); [self.placeholder drawInRect:placeholderRect withAttributes:attrs];
3. 通过通知或代理, 当TextView文字发生改变时, 重新绘制:
// 设置通知, 当TextView文字发生改变时, 向自己发送通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChanged) name:UITextViewTextDidChangeNotification object:self];
通知事件:
- (void)textDidChanged { // 重新绘制 [self setNeedsDisplay]; }
4. 重写TextView属性方法, 实时绘制:
- (void)setPlaceholder:(NSString *)placeholder { _placeholder = [placeholder copy]; // 会在下一个消息循环调用drawRect [self setNeedsDisplay]; }
- (void)setPlaceholderColor:(UIColor *)placeholderColor { _placeholderColor = placeholderColor; [self setNeedsDisplay]; }
- (void)setText:(NSString *)text { [super setText:text]; // 系统自带属性 [self setNeedsDisplay]; }
- (void)setAttributedText:(NSAttributedString *)attributedText { [super setAttributedText:attributedText]; [self setNeedsDisplay]; }
- (void)setFont:(UIFont *)font { [super setFont:font]; [self setNeedsDisplay]; }