前言
本文章主要针对UITextView的高度自增、以及增长高度上限设定,占位符设置等问题,利用Category添加相关属性和成员变量来解决相关问题。
效果图:
此处设置了最大自增高度到200
PlaceHolder解决方案
这里采用的是利用Runtime获取到UITextView的一个私有属性@"_placeholderLabel"
还有多种多样的实现方式,大家可以参考作者VV木公子 史上最全的iOS之UITextView实现placeHolder占位文字的N种方法
此处有部分问题:
需要同时设置占位符的大小和UITextView的文字大小,尽量设置大小相同
textView.placeholder_font = [UIFont systemFontOfSize:14]; textView.font = [UIFont systemFontOfSize:14];
否则会造成光标与占位符位置有差异的现象如下图:
当然,你也无需去设置placeholder_font,本分类会自动为您添加placeholder_font的大小与UITextView的大小相同。
为了让placeholder大小与textView的起始位置对齐,在这里多处重新设置了placeholder_font和sizeFit属性,否则会导致占位符位置有差异。当然,如果你的项目需求是占位符和textView的字体大小不同,此时就需要你微调此属性
placeHolderLabel.frame=CGRectMake(5,self.textContainerInset.top, self.frame.size.width - 10,self.frame.size.height);
UITextView高度
1.属性设置
此处只是暴露了一些属性设置placeholder的相关文字大小.
@property (copy,nonatomic) NSString *placeholder;//占位符 @property (nonatomic,strong) UIColor *placeholder_color;//占位符字体颜色
2.为分类添加成员变量
@property (nonatomic,strong) UIFont *placeholder_font;//占位符大小 @property (nonatomic,assign) BOOL isAutoHeight;// 自动增长 @property (nonatomic,assign) CGFloat maxAutoHeight;// 最高增长高度 @property (nonatomic,assign) CGFloat minAutoHeight;// 最小收缩高度(默认初始化textView的高度,略显鸡肋)
因为类别只能"添加"属性,并不能直接添加成员变量,但是Objective-C是运行时,动态语言,可以在其提供的runtime函数中找到一个class_addIvar()函数用于给类别添加成员变量.
在set方法中使用了
objc_setAssociatedObject(self,GYplaceholder_font,placeholder_font,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
get方法中:
objc_getAssociatedObject(self, GYplaceholder_font)
//利用静态变量地址唯一不变的特性 static const void *GYplaceholder_font = &GYplaceholder_font;
苹果官方文档:
Sets an associated value for a given object using a given key and association policy.
func objc_setAssociatedObject(Any!, UnsafeRawPointer!, Any!, objc_AssociationPolicy)
Returns the value associated with a given object for a given key.
func objc_getAssociatedObject(Any!, UnsafeRawPointer!)
3.最后高度变化设置
//0.1 防止换行 时高度变化导致顶部文字位置移动 self.frame=CGRectMake(self.frame.origin.x,self.frame.origin.y, self.frame.size.width, height + 0.1);
minAutoHeight的设置:
如果不设置则默认minAutoHeight与textView的初始化高度相同,一般此minAutoHeight大小设置应大与初始化高度、如果设置小于首次初始化高度会产生部分差异.
最后,奉上源码,请多多给出建议,谢谢,下载项目时,请记得切换Target到GYUIText-OC。