文档章节

UITextView自定义placeholder

UgCode
 UgCode
发布于 2014/04/29 01:35
字数 503
阅读 395
收藏 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设置字体或别的属性, 可以按照上面的思路实现.

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

© 著作权归作者所有

共有 人打赏支持
UgCode
粉丝 2
博文 3
码字总数 1429
作品 0
海淀
程序员
用UITextView撸一个顺畅的评论输入框

对比UITextField 继承关系: UITextField继承自UIControl,UITextView继承自UIScrollView; 输入行数 UITextView支持多行输入,可以滑屏垂直滚动,UITextField仅支持单行输入 Placeholder UI...

STzen
05/10
0
0
UITextView控件的详细讲解

1.创建并初始化 创建UITextView的文件,并在.h文件中写入如下代码: [csharp]view plaincopy #import <UIKit/UIKit.h> @interface TextViewController : UIViewController <UITextViewDeleg......

meilidashijie
2013/01/07
0
0
自定义带输入框类型AlertView

由于系统自带AlertView带输入框样式不太美观,决定自定义类似系统带有输入框样式AlertView,可根据需求自行修改样式,使用极其方便,同时已经做好了键盘事件处理。 代码直接拷贝可用: #imp...

远航Yang
2017/10/25
0
0
UIImageView与UIButton

应用场合 UIImageView主要用在只显示图片,没有点击事件的情况并且处理图片更加专业,动画例子: NSMutableArray *images = [NSMutableArray array]; for (int i=0; i<sum; i++) { NSBundle ...

天边那束阳光
2014/10/01
0
0
【转载】NGUI UILabel 文字破碎

项目使用NGUI,最近碰到 Loading界面的提示文字破碎的Bug。 参考了以下文章 转自http://blog.csdn.net/huutu http://www.liveslives.com 下面先来了解一下为什么会出现这种问题。 需要了解的...

linda012518
05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

RobotFramework之Process

Process Library version: 3.0.4 Library scope: global Named arguments: supported Introduction Robot Framework test library for running processes. This library utilizes Python's s......

海盐宝宝
2分钟前
0
0
easyui的textbox赋值问题,不能用$('#text').val('text');赋值

下面来看看easyui的各种验证框赋值的方式: <input name="text" id="text" class="easyui-numberbox" > <input name="text" id="text" class="easyui-textbox" > <input name="text" id="tex......

无小农
5分钟前
0
0
弹性工作制的魔咒

简评:你找到了一份完美的工作 —— 可以提前离开公司,还可以在晚上从家里回复邮件。既然如此,你为什么还会有那么强的负罪感呢? 或许是弹性工作制魔咒在作祟。 很多享受弹性工作制的人会始...

极光推送
12分钟前
0
0
KAFKA介绍(分布式架构)

Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语: Kafka将消息以...

明理萝
18分钟前
0
1
os::NodeHandle::subscribe回调函数绑定对象

void Foo::callback(const std_msgs::Empty::ConstPtr& message){}Foo foo_object;ros::Subscriber sub = handle.subscribe("my_topic", 1, &Foo::callback, &foo_object); 参考: ht......

itfanr
19分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部