发微博视图,提示文字背景:app
// IWTextView.m 文件 // // IWTextView.m // ItcastWeibo // // Created by apple on 14-5-19. // Copyright (c) 2014年 itcast. All rights reserved. // #import "IWTextView.h" @interface IWTextView() @property (nonatomic,weak) UILabel *placeholderLabel; @end @implementation IWTextView - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { UILabel *placeholderLabel = [[UILabel alloc] init]; placeholderLabel.textColor = [UIColor lightGrayColor]; placeholderLabel.hidden = YES; // 文本输入框,文字提示的label背景 placeholderLabel.backgroundColor = [UIColor orangeColor]; [self addSubview:placeholderLabel]; self.placeholderLabel = placeholderLabel; } return self; } -(void)setPlaceholder:(NSString *)placeholder { self.placeholderLabel.text = placeholder; if(placeholder.length) // 是否须要显示 { self.placeholderLabel.hidden = NO; self.placeholderLabel.frame = self.bounds; /* // 计算frame CGFloat maxH = self.frame.size.height; CGFloat maxW = self.frame.size.width; [placeholder sizeWithFont:self.placeholderLabel.font constrainedToSize:CGSizeMake(maxW, maxH)]; self.placeholderLabel.frame = CGRectMake(<#CGFloat x#>, <#CGFloat y#>, <#CGFloat width#>, <#CGFloat height#>); */ }else{ self.placeholderLabel.hidden = YES; } self.placeholderLabel.hidden = (placeholder.length == 0); } @end
文字提示“分享新鲜事”在label的中间,怎么让在第一行左边呢?字体
IWTextView.m文件:atom
-(void)setPlaceholder:(NSString *)placeholder { self.placeholderLabel.text = placeholder; if(placeholder.length) // 是否须要显示 { self.placeholderLabel.hidden = NO; self.placeholderLabel.frame = self.bounds; // 计算frame,设置文字提示“分享新鲜事...”的显示位置 CGFloat maxH = self.frame.size.height; CGFloat maxW = self.frame.size.width; CGSize placeholderSize = [placeholder sizeWithFont:self.placeholderLabel.font constrainedToSize:CGSizeMake(maxW, maxH)]; self.placeholderLabel.frame = CGRectMake(0, 0, placeholderSize.width, placeholderSize.height); }else{ self.placeholderLabel.hidden = YES; } self.placeholderLabel.hidden = (placeholder.length == 0); }
设置文字换行:
spa
placeholderLabel.numberOfLines = 0; // 文字换行
从上图能够看出,label跑到光标上边去了,怎么调整呢?code
设置placeholderLabel 的添加到父控制器的方式:server
IWTextView.m文件:rem
// [self addSubview:placeholderLabel]; [self insertSubview:placeholderLabel atIndex:0];
而后在设置Placeholder的方法中,设置光标的位置:it
-(void)setPlaceholder:(NSString *)placeholder { self.placeholderLabel.text = placeholder; if(placeholder.length) // 是否须要显示 { self.placeholderLabel.hidden = NO; self.placeholderLabel.frame = self.bounds; // 计算frame,设置文字提示“分享新鲜事...”的显示位置 CGFloat placeholderX = 5; // ******光标初始位置****** CGFloat placeholderY = 8; // ******光标初始位置****** CGFloat maxH = self.frame.size.height; CGFloat maxW = self.frame.size.width; CGSize placeholderSize = [placeholder sizeWithFont:self.placeholderLabel.font constrainedToSize:CGSizeMake(maxW, maxH)]; self.placeholderLabel.frame = CGRectMake(placeholderX, placeholderY, placeholderSize.width, placeholderSize.height); }else{ self.placeholderLabel.hidden = YES; } self.placeholderLabel.hidden = (placeholder.length == 0); }
咱们能够看到,光标已经出如今第一行和提示文字同一行的位置,io
下面来实现当输入文字时,提示文字消失,而当删除文字时,又出现提示微博
实现思路:须要监听textView文字输入,NSNotificationCenter消息通知,当有文字输入时隐藏placeholderLabel
具体实现代码:
// 2.******监听文字改变,是否隐藏placeholder****** [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange) name:UITextViewTextDidChangeNotification object:self];
IWTextView.h头文件
// IWTextView.h #import <UIKit/UIKit.h> @interface IWTextView : UITextView @property (nonatomic, copy)NSString *placeholder; @property (nonatomic, strong)UIColor *placeholderColor; @end
IWTextView.m文件
// // IWTextView.m // ItcastWeibo // // Created by apple on 14-5-19. // Copyright (c) 2014年 itcast. All rights reserved. // #import "IWTextView.h" @interface IWTextView() @property (nonatomic,weak) UILabel *placeholderLabel; @end @implementation IWTextView - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // 1.添加文字提示 UILabel *placeholderLabel = [[UILabel alloc] init]; placeholderLabel.textColor = [UIColor lightGrayColor]; placeholderLabel.hidden = YES; // 文本输入框,文字提示的label背景 // placeholderLabel.backgroundColor = [UIColor orangeColor]; placeholderLabel.numberOfLines = 0; // 文字换行 placeholderLabel.adjustsFontSizeToFitWidth = YES; [self insertSubview:placeholderLabel atIndex:0]; // [self addSubview:placeholderLabel]; self.placeholderLabel = placeholderLabel; // 2.******监听文字改变,是否隐藏placeholder****** [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange) name:UITextViewTextDidChangeNotification object:self]; } return self; } -(void)setPlaceholder:(NSString *)placeholder { _placeholder = [placeholder copy]; // 保存数据到模型 self.placeholderLabel.text = placeholder; if(placeholder.length) // 是否须要显示 { self.placeholderLabel.hidden = NO; self.placeholderLabel.frame = self.bounds; // 计算frame,设置文字提示“分享新鲜事...”的显示位置 CGFloat placeholderX = 5; // 光标初始位置 CGFloat placeholderY = 8; CGFloat maxH = self.frame.size.height; CGFloat maxW = self.frame.size.width; CGSize placeholderSize = [placeholder sizeWithFont:self.placeholderLabel.font constrainedToSize:CGSizeMake(maxW, maxH)]; self.placeholderLabel.frame = CGRectMake(placeholderX, placeholderY, placeholderSize.width, placeholderSize.height); }else{ self.placeholderLabel.hidden = YES; } self.placeholderLabel.hidden = (placeholder.length == 0); } // 设置文本框颜色 -(void)setPlaceholderColor:(UIColor *)placeholderColor { _placeholder = placeholderColor; self.placeholderLabel.textColor = placeholderColor; } // 设置字体 -(void)setFont:(UIFont *)font{ [super setFont:font]; // 调用系统的字体 self.placeholderLabel.font = font; self.placeholder = self.placeholder; } -(void)textDidChange { self.placeholderLabel.hidden = (self.text.length != 0); } -(void)dealloc { // [NSNotificationCenter removeObserve:self]; } @end
效果: