UItextViewカスタムplaceholder


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も位置を調整する)を決め、色を設定してNSStringdrawInRect: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)rectselfの描画やサイズの位置が変化するときに呼び出され、私たちが入力文字は呼び出されません.selfsetNeedsDisplayを呼び出してselfの内容を再描画する.
- (void)textChanged:(NSNotification *)not
{
    [self setNeedsDisplay];
}

- (void)setText:(NSString *)text
{
    [super setText:text];
    [self setNeedsDisplay];
}

簡単なのは、placeholder付きのTextViewでできます.placeholderにフォントや他の属性を設定必要がある場合は、上記のように実現することができる.
最初の文章は実はとても水で、ゆっくりして、ますますよくなると信じています.あまり含金量はありませんが、2つのファイルをパッケージしてダウンロードしましょう.