UITextView自定义placeholder
博客专区 > UgCode 的博客 > 博客详情
UITextView自定义placeholder
UgCode 发表于4年前
UITextView自定义placeholder
  • 发表于 4年前
  • 阅读 391
  • 收藏 0
  • 点赞 0
  • 评论 0

UITextView自定义placeholder

>来自我独立博客 > 先来吐槽一下自己, 博客建起来差不多已经一个月了, 第一篇文章都一拖再拖, 实在对不起这优秀的typecho. 为了这博客不要还没写起来就荒废, 决定以后一个星期最少一个文章. 第一篇就以简单的开始吧.

使用UITextView经常会需要用到placeholder, 可惜UITextView没有提供这个功能, 那就开始动手写吧~

首先在创建一个CustomTextView来继承UITextView:

@interface CustomTextView : UITextView

@property (nonatomic, retain) NSString *placeholder;
@property (nonatomic, retain) UIColor  *placeholderColor;

@end

加入两个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的位置(ios7中文字的位置和之前不一样, 所以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里面的内容(placeholder).

- (void)textChanged:(NSNotification *)not
{
    [self setNeedsDisplay];
}

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

一个简单的,带placeholderTextView就搞定了.如果需要给placeholder设置字体或别的属性, 可以按照上面的思路实现.

第一个文章其实很水, 慢慢来, 相信会越来越好. 虽然没什么含金量, 不过还是把两个文件打包提供下载吧.

标签: iOS UIKit Objective-C
共有 人打赏支持
粉丝 3
博文 2
码字总数 1429
×
UgCode
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: