关键代码如下:
<span style="font-size:14px;">-(PlaceholderTextView *)holderTextView
{
if (!_holderTextView) {
_holderTextView=[[PlaceholderTextView alloc] initWithFrame:CGRectMake(10, 64, kDeviceWidth-20, 60)];
_holderTextView.delegate=self;
_holderTextView.font = kFontNormal_16;
_holderTextView.placeholderFont = kFontNormal_16;
_holderTextView.edgeInsets=UIEdgeInsetsMake(8, 10, 0, 0);
_holderTextView.placeholder = @"可自填,多项请用逗号分隔";
_holderTextView.layer.borderWidth=0.5;
_holderTextView.layer.borderColor=[UIColor whiteColor].CGColor;
_holderTextView.layoutManager.allowsNonContiguousLayout = YES;
//修复在有导航栏的情况下输入文本框上下偏移问题
self.automaticallyAdjustsScrollViewInsets = NO;
//KVO动态监听text的值变化
[self.holderTextView addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew context:nil];
}
return _holderTextView;
}</span>
#pragma mark - 实现KVO回调方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if([keyPath isEqualToString:@"text"])
{
NSString *text= [object valueForKey:@"text"];
if (text.length>0&&![text isEqualToString:@""]) {
//滚动到最后一行
[self.holderTextView scrollRangeToVisible:NSMakeRange(self.holderTextView.text.length, 1)];
}
}
}
在PlaceholderTextView控件(原作者:gitBurning)上进行改造
支持设置placeholder的TextView哦
<span style="font-size:14px;">#import <UIKit/UIKit.h>
/**
* 要是用非 arc。。。。。。// -fno-objc-arc
*/
@interface PlaceholderTextView : UITextView
@property(copy,nonatomic) NSString *placeholder;
@property(strong,nonatomic) UIColor *placeholderColor;
@property(strong,nonatomic) UIFont *placeholderFont;
@property(strong,nonatomic) UILabel *PlaceholderLabel;
//placeholder边距
@property(assign,nonatomic) UIEdgeInsets edgeInsets;
@end</span>
#import "PlaceholderTextView.h"
@interface PlaceholderTextView()
//<UITextViewDelegate>
@end
@implementation PlaceholderTextView
- (id) initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
[self awakeFromNib];
self.edgeInsets=UIEdgeInsetsMake(0, 0, 0, 0);//默认边距
}
return self;
}
- (void)awakeFromNib {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textDidChange:)
name:UITextViewTextDidChangeNotification object:self];
self.placeholderColor =[UIColor lightGrayColor];
self.PlaceholderLabel =[[UILabel alloc] init];
self.PlaceholderLabel.numberOfLines=0;
[self addSubview:self.PlaceholderLabel];
//KVO动态监听text的值变化
[self addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew context:nil];
}
//实现KVO回调方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if([keyPath isEqualToString:@"text"])
{
NSString *text= [object valueForKey:@"text"];
if (text.length>0&&![text isEqualToString:@""]) {
self.PlaceholderLabel.hidden=YES;
}else{
self.PlaceholderLabel.hidden=NO;
}
}
}
//监听文字的变化
-(void)textDidChange:(NSNotification*)notification
{
if (self.placeholder.length == 0 || [self.placeholder isEqualToString:@""]) {
self.PlaceholderLabel.hidden=YES;
}
if (self.text.length > 0) {
self.PlaceholderLabel.hidden=YES;
}else{
self.PlaceholderLabel.hidden=NO;
}
}
//
//-(void)setPlaceholder:(NSString *)placeholder{
// if (placeholder.length == 0 || [placeholder isEqualToString:@""]) {
// self.PlaceholderLabel.hidden=YES;
// }
//
// _placeholder=placeholder;
//}
-(void)layoutSubviews
{
[super layoutSubviews];
// NSLog(@"%s",__FUNCTION__);
self.PlaceholderLabel.font=self.placeholderFont?self.placeholderFont:self.font;
self.PlaceholderLabel.textColor=self.placeholderColor;
self.PlaceholderLabel.text=self.placeholder;
CGFloat placeholderW=self.frame.size.width-self.edgeInsets.left*2;
CGSize placeholderSize=
[NSString sizeWithText:self.placeholder font:self.PlaceholderLabel.font maxW:placeholderW];
self.PlaceholderLabel.frame=CGRectMake(self.edgeInsets.left, self.edgeInsets.top, placeholderSize.width, placeholderSize.height);
}
-(void)dealloc{
NSLog(@"销毁%s",__FUNCTION__);
[[NSNotificationCenter defaultCenter] removeObserver:self];
//注销KVO监听
[self removeObserver:self forKeyPath:@"text"];
[self.PlaceholderLabel removeFromSuperview];
}
@end