UItextViewカスタムplaceholder
3054 ワード
UItextViewカスタムplaceholder
私の独立したブログからまず自分にツッコミを入れて、ブログが建てられてからもう一ヶ月も経っていないので、最初の文章はすべて引きずって、本当にこの優秀なtypecho
に申し訳ありません.このブログはまだ书かないうちに荒廃しないように、あと一周间で少なくとも1つの文章を决める.第1篇は简単なスタートを切りましょう.UITextView
を使うにはよくplaceholder
が必要ですが、残念ながらUITextView
はこの機能を提供していません.では、手で書きましょう.
まず、CustomTextView
を作成してUITextView
を継承します.@interface CustomTextView : UITextView
@property (nonatomic, retain) NSString *placeholder;
@property (nonatomic, retain) UIColor *placeholderColor;
@end
2つのproperty
を追加します.@property (nonatomic, retain) NSString *placeholder; //
@property (nonatomic, retain) UIColor *placeholderColor; //
次のステップは具体的に実現することである.mファイルはUITextViewTextDidChangeNotification
に登録する、文字内容の変更を傍受し、いくつかの変数を初期化する.- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:)
name:UITextViewTextDidChangeNotification
object:nil];
self.autoresizesSubviews = NO;
self.placeholder = @"";
self.placeholderColor = [UIColor lightGrayColor];
}
return self;
}
そして最もコアな部分は、- (void)drawRect:(CGRect)rect
を書き換えるplaceholder
の位置(ios 7では文字の位置が以前と異なるのでplaceholderも位置を調整する)を決め、色を設定してNSString
のdrawInRect:
でTextView
に描画する.- (void)drawRect:(CGRect)rect
{
// placeholder
if ([self.text isEqualToString:@""]) {
CGRect placeholderRect;
placeholderRect.origin.y = 8;
placeholderRect.size.height = CGRectGetHeight(self.frame)-8;
if (IOS_VERSION >= 7) {
placeholderRect.origin.x = 5;
placeholderRect.size.width = CGRectGetWidth(self.frame)-5;
} else {
placeholderRect.origin.x = 10;
placeholderRect.size.width = CGRectGetWidth(self.frame)-10;
}
[self.placeholderColor set];
[self.placeholder drawInRect:placeholderRect
withFont:self.font
lineBreakMode:NSLineBreakByWordWrapping
alignment:NSTextAlignmentLeft];
}
}
しかし、- (void)drawRect:(CGRect)rect
はself
の描画やサイズの位置が変化するときに呼び出され、私たちが入力文字は呼び出されません.self
のsetNeedsDisplay
を呼び出してself
の内容を再描画する.- (void)textChanged:(NSNotification *)not
{
[self setNeedsDisplay];
}
- (void)setText:(NSString *)text
{
[super setText:text];
[self setNeedsDisplay];
}
簡単なのは、placeholder
付きのTextView
でできます.placeholder
にフォントや他の属性を設定必要がある場合は、上記のように実現することができる.
最初の文章は実はとても水で、ゆっくりして、ますますよくなると信じています.あまり含金量はありませんが、2つのファイルをパッケージしてダウンロードしましょう.
@interface CustomTextView : UITextView
@property (nonatomic, retain) NSString *placeholder;
@property (nonatomic, retain) UIColor *placeholderColor;
@end
@property (nonatomic, retain) NSString *placeholder; //
@property (nonatomic, retain) UIColor *placeholderColor; //
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:)
name:UITextViewTextDidChangeNotification
object:nil];
self.autoresizesSubviews = NO;
self.placeholder = @"";
self.placeholderColor = [UIColor lightGrayColor];
}
return self;
}
- (void)drawRect:(CGRect)rect
{
// placeholder
if ([self.text isEqualToString:@""]) {
CGRect placeholderRect;
placeholderRect.origin.y = 8;
placeholderRect.size.height = CGRectGetHeight(self.frame)-8;
if (IOS_VERSION >= 7) {
placeholderRect.origin.x = 5;
placeholderRect.size.width = CGRectGetWidth(self.frame)-5;
} else {
placeholderRect.origin.x = 10;
placeholderRect.size.width = CGRectGetWidth(self.frame)-10;
}
[self.placeholderColor set];
[self.placeholder drawInRect:placeholderRect
withFont:self.font
lineBreakMode:NSLineBreakByWordWrapping
alignment:NSTextAlignmentLeft];
}
}
- (void)textChanged:(NSNotification *)not
{
[self setNeedsDisplay];
}
- (void)setText:(NSString *)text
{
[super setText:text];
[self setNeedsDisplay];
}