123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- //
- // PlaceholderTextView.m
- // SaleHelper
- //
- // Created by gitBurning on 14/12/8.
- // Copyright (c) 2014年 Burning_git. All rights reserved.
- //
- #import "BRPlaceholderTextView.h"
- #define kTopY 14.0
- #define kLeftX 13.0
- @interface BRPlaceholderTextView()<UITextViewDelegate>
- @property(strong,nonatomic) UIColor *placeholder_color;
- @property(strong,nonatomic) UIFont * placeholder_font;
- /**
- * 显示 Placeholder
- */
- @property(strong,nonatomic,readonly) UILabel *PlaceholderLabel;
- @property(assign,nonatomic) float placeholdeWidth;
- @property(copy,nonatomic) id eventBlock;
- @property(copy,nonatomic) id BeginBlock;
- @property(copy,nonatomic) id EndBlock;
- @end
- @implementation BRPlaceholderTextView
- // Only override drawRect: if you perform custom drawing.
- // An empty implementation adversely affects performance during animation.
- #pragma mark - life cycle
- - (id) initWithFrame:(CGRect)frame {
- if ((self = [super initWithFrame:frame])) {
- [self awakeFromNib];
- }
- return self;
- }
- - (void)awakeFromNib {
- [super awakeFromNib];
-
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(DidChange:) name:UITextViewTextDidChangeNotification object:self];
-
- //UITextViewTextDidBeginEditingNotification
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewBeginNoti:) name:UITextViewTextDidBeginEditingNotification object:self];
-
- //UITextViewTextDidEndEditingNotification
-
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewEndNoti:) name:UITextViewTextDidEndEditingNotification object:self];
-
- float left=kLeftX,top=kTopY,hegiht=30;
-
- self.placeholdeWidth=CGRectGetWidth(self.frame)-2*left;
-
- _PlaceholderLabel=[[UILabel alloc] initWithFrame:CGRectMake(left, top
- , _placeholdeWidth, hegiht)];
-
- _PlaceholderLabel.numberOfLines=0;
- _PlaceholderLabel.lineBreakMode=NSLineBreakByCharWrapping|NSLineBreakByWordWrapping;
- [self addSubview:_PlaceholderLabel];
-
-
- [self defaultConfig];
-
- }
- -(void)layoutSubviews
- {
- float left=kLeftX,top=kTopY,hegiht=self.bounds.size.height;
- self.placeholdeWidth=CGRectGetWidth(self.frame)-2*left;
- CGRect frame=_PlaceholderLabel.frame;
- frame.origin.x=left;
- frame.origin.y=top;
- frame.size.height=hegiht;
- frame.size.width=self.placeholdeWidth;
- _PlaceholderLabel.frame=frame;
-
- [_PlaceholderLabel sizeToFit];
-
- }
- -(void)dealloc{
-
- [_PlaceholderLabel removeFromSuperview];
-
- [[NSNotificationCenter defaultCenter] removeObserver:self];
-
- }
- #pragma mark - System Delegate
- #pragma mark - custom Delegate
- #pragma mark - Event response
- -(void)defaultConfig
- {
- self.placeholder_color = [UIColor lightGrayColor];
- self.placeholder_font = [UIFont systemFontOfSize:14];
- self.maxTextLength=1000;
- self.layoutManager.allowsNonContiguousLayout=NO;
- }
- -(void)addMaxTextLengthWithMaxLength:(NSInteger)maxLength andEvent:(void (^)(BRPlaceholderTextView *text))limit
- {
- if (maxLength>0) {
-
- _maxTextLength=maxLength;
- }
-
- if (limit) {
- _eventBlock=limit;
-
- }
- }
- -(void)addTextViewBeginEvent:(void (^)(BRPlaceholderTextView *))begin{
-
- _BeginBlock=begin;
- }
- -(void)addTextViewEndEvent:(void (^)(BRPlaceholderTextView *))End{
- _EndBlock=End;
- }
- -(void)setUpdateHeight:(float)updateHeight{
-
- CGRect frame=self.frame;
- frame.size.height=updateHeight;
- self.frame=frame;
- _updateHeight=updateHeight;
- }
- //供外部使用的 api
- -(void)setPlaceholderFont:(UIFont *)font
- {
- self.placeholder_font=font;
- }
- -(void)setPlaceholderColor:(UIColor *)color
- {
- self.placeholder_color=color;
- }
- -(void)setPlaceholderOpacity:(float)opacity
- {
- if (opacity<0) {
- opacity=1;
- }
- self.PlaceholderLabel.layer.opacity=opacity;
- }
- #pragma mark - Noti Event
- -(void)textViewBeginNoti:(NSNotification*)noti{
-
- if (_BeginBlock) {
- void(^begin)(BRPlaceholderTextView*text)=_BeginBlock;
- begin(self);
- }
- }
- -(void)textViewEndNoti:(NSNotification*)noti{
-
- if (_EndBlock) {
- void(^end)(BRPlaceholderTextView*text)=_EndBlock;
- end(self);
- }
- }
- -(void)DidChange:(NSNotification*)noti{
-
- if (self.placeholder.length == 0 || [self.placeholder isEqualToString:@""]) {
- _PlaceholderLabel.hidden=YES;
- }
-
- if (self.text.length > 0) {
- _PlaceholderLabel.hidden=YES;
- }
- else{
- _PlaceholderLabel.hidden=NO;
- }
-
- NSString *lang = [[self.nextResponder textInputMode] primaryLanguage]; // 键盘输入模式
-
- if ([lang isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写
- UITextRange *selectedRange = [self markedTextRange];
- //获取高亮部分
- UITextPosition *position = [self positionFromPosition:selectedRange.start offset:0];
- // 没有高亮选择的字,则对已输入的文字进行字数统计和限制
- if (!position) {
- if (self.text.length > self.maxTextLength) {
- self.text = [self.text substringToIndex:self.maxTextLength];
- }
- }
- // 有高亮选择的字符串,则暂不对文字进行统计和限制
- else{
-
- }
- }
- // 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
- else{
- if (self.text.length > self.maxTextLength) {
- self.text = [ self.text substringToIndex:self.maxTextLength];
- }
- }
-
-
- if (_eventBlock && self.text.length > self.maxTextLength) {
-
- void (^limint)(BRPlaceholderTextView*text) =_eventBlock;
-
- limint(self);
- }
-
- }
- #pragma mark - private method
- +(float)boundingRectWithSize:(CGSize)size withLabel:(NSString *)label withFont:(UIFont *)font{
- NSDictionary *attribute = @{NSFontAttributeName:font};
-
- // CGSize retSize;
- CGSize retSize = [label boundingRectWithSize:size
- options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading
- attributes:attribute
- context:nil].size;
-
- return retSize.height;
-
- }
- #pragma mark - getters and Setters
- -(void)setText:(NSString *)tex{
- if (tex.length>0) {
- _PlaceholderLabel.hidden=YES;
- }
- [super setText:tex];
- }
- -(void)setPlaceholder:(NSString *)placeholder{
- if (placeholder.length == 0 || [placeholder isEqualToString:@""]) {
- _PlaceholderLabel.hidden=YES;
- }
- else
- {
- _PlaceholderLabel.text=placeholder;
- _placeholder=placeholder;
-
- // float height= [BRPlaceholderTextView boundingRectWithSize:CGSizeMake(_placeholdeWidth, MAXFLOAT) withLabel:_placeholder withFont:_PlaceholderLabel.font];
- // if (height>CGRectGetHeight(_PlaceholderLabel.frame) && height< CGRectGetHeight(self.frame)) {
- //
- // CGRect frame=_PlaceholderLabel.frame;
- // frame.size.height=height;
- // _PlaceholderLabel.frame=frame;
- //
- // }
- }
-
- }
- -(void)setPlaceholder_font:(UIFont *)placeholder_font
- {
- _placeholder_font=placeholder_font;
- _PlaceholderLabel.font=placeholder_font;
- }
- -(void)setPlaceholder_color:(UIColor *)placeholder_color
- {
- _placeholder_color=placeholder_color;
- _PlaceholderLabel.textColor=placeholder_color;
- }
- @end
|