发微博视图,提示文字背景:
// 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文件:
-(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);}
设置文字换行:
placeholderLabel.numberOfLines = 0; // 文字换行
从上图可以看出,label跑到光标上边去了,怎么调整呢?
设置placeholderLabel 的添加到父控制器的方式:
IWTextView.m文件:
// [self addSubview:placeholderLabel]; [self insertSubview:placeholderLabel atIndex:0];
然后在设置Placeholder的方法中,设置光标的位置:
-(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);}
我们可以看到,光标已经出现在第一行和提示文字同一行的位置,
下面来实现当输入文字时,提示文字消失,而当删除文字时,又出现提示
实现思路:需要监听textView文字输入,NSNotificationCenter消息通知,当有文字输入时隐藏placeholderLabel
具体实现代码:
// 2.******监听文字改变,是否隐藏placeholder****** [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange) name:UITextViewTextDidChangeNotification object:self];
IWTextView.h头文件
// IWTextView.h#import@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
效果: