请关注,防止你用了,我改了,有问题连个商量的人都找不到...
自定义带占位符的TextView
设置占位符方式千奇百怪,可以添加Label,添加等属性TextView,把text属性当placeholder使用...
在此利用的是系统的_placeholdeLabel
DDYTextView.h
#import <UIKit/UIKit.h>
@interface DDYTextView : UITextView
@property (nonatomic, strong) NSString *placeholder;
@property (nonatomic, strong) UIColor *placeholderTextColor;
+ (instancetype)textView;
+ (instancetype)textViewPlaceholder:(NSString *)placeholder font:(UIFont *)font;
+ (instancetype)textViewPlaceholder:(NSString *)placeholder font:(UIFont *)font frame:(CGRect)frame;
@end
DDYTextView.m
#import "DDYTextView.h"
#import <objc/runtime.h>
#import <objc/message.h>
@interface DDYTextView ()
@property (nonatomic, strong) UILabel *placeHolderLabel;
@end
@implementation DDYTextView
@synthesize placeholder = _placeholder;
@synthesize placeholderTextColor = _placeholderTextColor;
+ (instancetype)textView
{
return [[self alloc] init];
}
+ (instancetype)textViewPlaceholder:(NSString *)placeholder font:(UIFont *)font
{
return [[self alloc] initWithPlaceholder:placeholder font:font frame:CGRectZero];
}
+ (instancetype)textViewPlaceholder:(NSString *)placeholder font:(UIFont *)font frame:(CGRect)frame
{
return [[self alloc] initWithPlaceholder:placeholder font:font frame:frame];
}
- (instancetype)initWithPlaceholder:(NSString *)placeholder font:(UIFont *)font frame:(CGRect)frame
{
if (self = [super initWithFrame:frame])
{
self.placeholder = placeholder;
self.font = font;
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame])
{
// layoutManager(NSLayoutManager)的是否非连续布局属性,默认YES,设置为NO就不会再自己重置滑动了。
self.layoutManager.allowsNonContiguousLayout = NO;
// 如果存在占位字符则默认浅灰色
self.placeholderTextColor = [UIColor lightGrayColor];
// 手拖拽退键盘(输入造成滚动不退键盘)
self.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
}
return self;
}
- (UILabel *)placeHolderLabel
{
if (!_placeHolderLabel)
{
_placeHolderLabel = [[UILabel alloc] init];
unsigned int count = 0;
Ivar *ivars = class_copyIvarList(NSClassFromString(@"UITextView"), &count);
for(int i =0; i < count; i ++)
{
NSString *ivarName = [NSString stringWithCString:ivar_getName(ivars[i]) encoding:NSUTF8StringEncoding];
if ([ivarName isEqualToString:@"_placeholderLabel"])
{
_placeHolderLabel.numberOfLines = 0;
_placeHolderLabel.font = self.font;
_placeHolderLabel.ddy_x = 5;
_placeHolderLabel.ddy_y = 8;
_placeHolderLabel.textAlignment = self.textAlignment;
[self addSubview:_placeHolderLabel];
[self setValue:_placeHolderLabel forKey:@"_placeholderLabel"];
}
}
}
return _placeHolderLabel;
}
- (void)setPlaceholder:(NSString *)placeholder
{
_placeholder = placeholder;
self.placeHolderLabel.text = placeholder;
[self setNeedsDisplay];
}
- (void)setPlaceholderTextColor:(UIColor *)placeholderTextColor
{
_placeholderTextColor = placeholderTextColor;
[self setNeedsDisplay];
}
- (void)setTextContainerInset:(UIEdgeInsets)textContainerInset
{
[super setTextContainerInset:textContainerInset];
[self setNeedsDisplay];
}
- (void)setFrame:(CGRect)frame
{
[super setFrame:frame];
[self setNeedsDisplay];
}
- (void)changePlaceholderLocation
{
if (!self.font) {
DDYInfoLog(@"请先设置DDYTextView对象的font");
self.font = DDYFont(12);
}
_placeHolderLabel.textColor = self.placeholderTextColor;
_placeHolderLabel.font = self.font;
_placeHolderLabel.ddy_x = self.textContainerInset.left;
_placeHolderLabel.ddy_w = self.ddy_w - self.textContainerInset.left - self.textContainerInset.right;
_placeHolderLabel.ddy_y = self.textContainerInset.top;
_placeHolderLabel.ddy_h = self.ddy_h - self.textContainerInset.top - self.textContainerInset.bottom;
[_placeHolderLabel sizeToFit];
}
- (void)drawRect:(CGRect)rect
{
[super drawRect:rect];
[self changePlaceholderLocation];
}
@end
使用
DDYTextView *textView2 = [DDYTextView textViewPlaceholder:@"我是占位的大哥" font:DDYFont(12) frame:CGRectMake(0, 120, DDYSCREENW, 100)];
textView2.backgroundColor = [UIColor whiteColor];
textView2.placeholderTextColor = [UIColor lightGrayColor];
[self.view addSubview:textView2];
设置字数限制
#import "TextViewTestVC.h"
#import "DDYTextView.h"
@interface TextViewTestVC ()<UITextViewDelegate>
@property (nonatomic, strong) DDYTextView *textView;
@property (nonatomic, strong) UILabel *tipLabel;
@end
@implementation TextViewTestVC
- (void)viewDidLoad
{
[super viewDidLoad];
[self prepare];
[self setupContentView];
}
- (void)prepare
{
// 64当起点布局
self.edgesForExtendedLayout = UIRectEdgeNone;
self.automaticallyAdjustsScrollViewInsets = NO;
self.extendedLayoutIncludesOpaqueBars = NO;
self.view.backgroundColor = [UIColor whiteColor];
self.view.backgroundColor = DDYColor(245, 245, 245, 1);
}
- (void)setupContentView
{
UIView *bgView = [[UIView alloc] initWithFrame:CGRectMake(0, 10, DDYSCREENW, 140)];
bgView.backgroundColor = [UIColor whiteColor];
[self.view addSubview:bgView];
_textView = [DDYTextView textView];
_textView.font = DDYFont(14);
_textView.placeholder = @"我是占位大哥";
_textView.frame = CGRectMake(0, 0, DDYSCREENW, 110);
_textView.textContainerInset = UIEdgeInsetsMake(10, 10, 10, 10);
_textView.delegate = self;
[bgView addSubview:_textView];
_tipLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, _textView.ddy_bottom + 10, DDYSCREENW-10, 20)];
_tipLabel.textAlignment = NSTextAlignmentRight;
_tipLabel.textColor = DDYColor(75, 222, 209, 1.0);
_tipLabel.font = DDYFont(11);
_tipLabel.text = @"0/250";
[bgView addSubview:_tipLabel];
}
#pragma mark - UITextViewDelegate
#pragma mark 可以用来控制占位字符显隐,剩余字数计算等
- (void)textViewDidChange:(UITextView *)textView
{
if (_textView.text.length > 250)
{
_textView.text = [_textView.text substringToIndex:250];
_tipLabel.textColor = [UIColor redColor];
}
else
{
_tipLabel.textColor = (_textView.text.length == 250)?[UIColor redColor]:DDYColor(75, 222, 209, 1.0);
}
_tipLabel.text = [NSString stringWithFormat:@"%lu%@",(unsigned long)_textView.text.length,@"/250"];
[_textView scrollRangeToVisible:NSMakeRange(_textView.text.length, 1)];
}
@end