新浪微博客户端(36)-自定义带placeholder的TextView
iOS 上自带的UITextView竟然不能设置placeholder,但是UITextView却可以,我也真是醉了。没办法了,自己写一个
DJTextView.h
#import <UIKit/UIKit.h> @interface DJTextView : UITextView @property (nonatomic,copy) NSString *placeholder;
@property (nonatomic,strong) UIColor *placeholderColor; @end
DJTextView.m
#import "DJTextView.h" @implementation DJTextView - (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// 在通知中心为TextView注册一个当文本改变的通知,当文本发生变化时,TextView会发一个通知
// 类似于android里面的BroadcastReceiver
// iOS 注册接收通知的方式为:addObserver name:
// android 注册接收通知的方式为:intent.addAction();
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textHasChange) name:UITextViewTextDidChangeNotification object:self];
}
return self;
} // 当文字改变时会调用此方法
- (void)textHasChange { // setNeedsDisplay 类似于android里面的postInvalidate()方法,都是向操作系统发出请求重绘的消息
// 操作系统会在未来的时间内调用drawRect(iOS),onDraw(android);
// 注意:系统不允许我们自己调用drawRect或onDraw方法
[self setNeedsDisplay]; } - (void)drawRect:(CGRect)rect { if ([self hasText]) return; // 如果检测到当前TextView中有文本,就不再绘制 CGFloat placeholderRectX = ;
CGFloat placeholderRectY = ;
CGFloat placeholderRectW = rect.size.width - * placeholderRectX;
CGFloat placeholderRectH = rect.size.height - * placeholderRectY; // 将文本绘制在一个指定的矩形框内
NSMutableDictionary *attrs = [NSMutableDictionary dictionary];
attrs[NSFontAttributeName] = self.font;
// 若用户没有设置placeholder的颜色,则给placeholder设置一个默认颜色
attrs[NSForegroundColorAttributeName] = self.placeholderColor ? self.placeholderColor : [UIColor grayColor];
[self.placeholder drawInRect:CGRectMake(placeholderRectX, placeholderRectY, placeholderRectW, placeholderRectH) withAttributes:attrs]; } #pragma mark - 当用户手动更新当前字体属性时,就自动触发重绘
- (void)setText:(NSString *)text{ [super setText:text];
[self setNeedsDisplay]; } - (void)setFont:(UIFont *)font { [super setFont:font];
[self setNeedsDisplay]; } - (void)setPlaceholder:(NSString *)placeholder { _placeholder = placeholder;
[self setNeedsDisplay]; } - (void)setPlaceholderColor:(UIColor *)placeholderColor { _placeholderColor = placeholderColor;
[self setNeedsDisplay]; } - (void)dealloc { // 类似于android,通知中心在使用完毕后需要销毁
// iOS: [NSNotificationCenter defaultCenter] removeObserver:self]
// android: unRegister(mBroadcastReceiver);
[[NSNotificationCenter defaultCenter] removeObserver:self]; } @end
最终效果:

新浪微博客户端(36)-自定义带placeholder的TextView的更多相关文章
- 李洪强iOS开发之带placeHolder的Textview
李洪强iOS开发之带placeHolder的Textview 01 - 创建工过程,定义全局属性,遵守textview的代理协议 02 - 添加一个textview和一个label 03 - 实现 ...
- 新浪微博客户端(5)-自定义UISearchBar
iOS自带的UISearchBar有很多限制,我们可以使用UITextField做出一个类似于SearchBar的效果. //===================================== ...
- 新浪微博客户端(2)-自定义导航控制器,统一NavigationItem
继承系统提供的UINavigationViewController,拦截并重写其push方法. #import "DJNavigationController.h" @impl ...
- 新浪微博客户端(11)-自定义checkBox
在最后一个欢迎界面上添加一个CheckBox. // 2.添加4个UIImageView ; i < NEW_FEATURE_NUMS; i++) { UIImageView *imageVie ...
- Android自定义控件 -- 带边框的TextView
使用xml实现边框 原来使用带边框的TextView时一般都是用XML定义来完成,在drawable目录中定义如下所示的xml文件: <?xml version="1.0" ...
- android开发新浪微博客户端 完整攻略 [新手必读]
开始接触学习android已经有3个礼拜了,一直都是对着android的sdk文档写Tutorials从Hello World到Notepad Tutorial算是初步入门了吧,刚好最近对微博感兴趣就 ...
- Android实现自定义带文字和图片的Button
Android实现自定义带文字和图片的Button 在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法. 一.用系统自带的Button实现 最简单的一种办法就 ...
- 自定义带图片和文字的ImageTextButton
今天我们来讲一下有关自定义控件的问题,今天讲的这篇是从布局自定义开始的,难度不大,一看就明白,估计有的同学或者开发者看了说,这种方式多此一举,但是小编我不这么认为,多一种解决方式,就多一种举一反三的学 ...
- Android应用--新浪微博客户端新特性滚动视图和启动界面实现
新浪微博客户端新特性滚动视图和启动界面实现 2013年8月20日新浪微博客户端开发之启动界面实现 前言: 使用过新浪微博客户端的童鞋都清楚,客户端每一次升级之后第一次启动界面就会有新特性的介绍,用户通 ...
随机推荐
- Linux下安装与使用本地的perl模块
转自 http://www.cnblogs.com/xianghang123/archive/2012/08/23/2652806.html Linux下安装与使用本地的perl模块 在使用Linux ...
- js-JavaScript高级程序设计学习笔记5
第七章 函数表达式 1.函数声明的一个重要特征就是函数声明提升,意思是在执行代码之前会先读取函数声明,因此可以把函数声明放在调用它的语句后面. 2.使用函数表达式创建的函数叫做匿名函数(拉姆达函数), ...
- springMVC-配置Bean
配置Bean - 配置形式:基于xml文件方式,基于注解的方式- bean的配置方式:通过全类名(反射),通过工厂方法(静态工厂方法和实例工厂方法),FactoryBean依赖注入的方方式,属性注入和 ...
- 【poj1741】 Tree
http://poj.org/problem?id=1741 (题目链接) 题意 给出一个n个节点的带权树,求树上距离不超过K的所有点对的个数. solution 点分治裸题.所谓的点分治,就是对于 ...
- Windows网络驱动、NDIS驱动(微端口驱动、中间层驱动、协议驱动)、TDI驱动(网络传输层过滤)、WFP(Windows Filtering Platform)
catalog . 引言 . Windows 2000网络结构和OSI模型 . NDIS驱动 . NDIS微端口驱动编程实例 . NDIS中间层驱动编程实例 . NDIS协议层驱动编程实例 . TDI ...
- Linux Command Line Basics
Most of this note comes from the Beginning the Linux Command Line, Second Edition by Sander van Vugt ...
- VS2012使用NUGet自动下载(还原)项目中使用的包
一: 当签出完整项目后,在解决方案名称上点右键,选择"启用NuGet程序包还原". 二: 出现询问,当然要点是,当完成后,会发现在解决方案中,多出".nuget" ...
- ECMAScript严格模式简介
写在前面 大家都知道使用"use strict"表示使用ECMAScript进行严格模式,使用"use strict"有两种方式 在文件头部写上它(使得整个脚本 ...
- photoshop工具使用的简单介绍
photoshop工具使用的简单介绍 我所用PhotoShop版本号是cs6,这里对其主要功能做一个简单介绍. 第一部分: 首先,ps的界面主要分为了6部分: 一.最上面的一行的菜单栏,菜单中有:文件 ...
- 【原】flux学习笔记
最近React(web/native)依旧如火如荼,相信大家都跃跃欲试,入职新公司,现在的团队也开始在React领域有所尝试. 2016年应该是React 逐渐走向成熟的一年.之前在原来公司搞不懂的问 ...