iOS UITextView之高度变化与PlaceHolder

作者: GiantForJade | 来源:发表于2016-12-08 21:59 被阅读164次

    前言

    本文章主要针对UITextView的高度自增、以及增长高度上限设定,占位符设置等问题,利用Category添加相关属性和成员变量来解决相关问题。


    效果图:
    此处设置了最大自增高度到200

    textgy.gif

    PlaceHolder解决方案

    这里采用的是利用Runtime获取到UITextView的一个私有属性@"_placeholderLabel"
    还有多种多样的实现方式,大家可以参考作者VV木公子 史上最全的iOS之UITextView实现placeHolder占位文字的N种方法
    此处有部分问题:
    需要同时设置占位符的大小和UITextView的文字大小,尽量设置大小相同
    textView.placeholder_font = [UIFont systemFontOfSize:14]; textView.font = [UIFont systemFontOfSize:14];
    否则会造成光标与占位符位置有差异的现象如下图:

    Paste_Image.png
    当然,你也无需去设置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。

    相关文章

      网友评论

        本文标题:iOS UITextView之高度变化与PlaceHolder

        本文链接:https://www.haomeiwen.com/subject/qnsjmttx.html