一行代码实现UITextView的placeHolder

读书无用论的去死.jpg

前言

通过Category一行代码实现UITextView的placeHolder。搭配使用一行代码限制并统计UITextView输入字数效果更佳。

实现效果

ZWPlaceHolder+LimitCouner.gif

导入头文件

#import "UITextView+ZWPlaceHolder.h"
  • storyboard(xib)一行调用代码
self.firstTextView.zw_placeHolder = @"向厂家反馈同业相关活动、产品信息、用于市场分析。";
  • 代码创建UITextView调用
    CGRect rect = CGRectMake(5, 230, [UIScreen mainScreen].bounds.size.width-10, 80);
    UITextView *textView = [[UITextView alloc] initWithFrame:rect];
    textView.layer.borderWidth = 1;
    textView.font = [UIFont systemFontOfSize:14];
    textView.layer.borderColor = [UIColor lightGrayColor].CGColor;
    textView.zw_placeHolder = @"向厂家反馈同业相关活动、产品信息、用于市场分析。";
    [self.view addSubview:textView];
  • 调整placeHolder的字体大小
    • placeholder的字体大小会跟随UITextView字体大小而变化,可以通过调整UITextView的font来调整PlaceHolder字体大小
textView.font = [UIFont systemFontOfSize:14];
  • 调整placeHolder的字体颜色
textView.zw_placeHolderColor = [UIColor redColor];
调整placeHolder字体颜色.png

实现源码解析

  • 在UITextView的category中通过runtime添加属性zw_placeHolder,当给zw_placeHolder赋值时,去创建一个UILabel添加到UITextView上,然后监听UITextView中text的改变来选择是否显示placeHolder。
  • 核心代码
#pragma mark - update
- (void)updatePlaceHolder{
    if (self.text.length) {
        [self.zw_placeHolderLabel removeFromSuperview];
        return;
    }
    self.zw_placeHolderLabel.font = self.font?self.font:self.cacutDefaultFont;
    self.zw_placeHolderLabel.textAlignment = self.textAlignment;
    self.zw_placeHolderLabel.text = self.zw_placeHolder;
    [self insertSubview:self.zw_placeHolderLabel atIndex:0];
}
#pragma mark - lazzing
-(UILabel *)zw_placeHolderLabel{
    UILabel *placeHolderLab = objc_getAssociatedObject(self, @selector(zw_placeHolderLabel));
    if (!placeHolderLab) {
        placeHolderLab = [[UILabel alloc] init];
        placeHolderLab.numberOfLines = 0;
        placeHolderLab.textColor = [UIColor lightGrayColor];
        objc_setAssociatedObject(self, @selector(zw_placeHolderLabel), placeHolderLab, OBJC_ASSOCIATION_RETAIN);
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updatePlaceHolder) name:UITextViewTextDidChangeNotification object:self];
    }
    return placeHolderLab;
}
  • 如何避免placeHolder被光标遮挡。
    UITextView的光标默认边距是5.0。
// Default value: 5.0  The layout padding at the beginning and end of the line fragment rects insetting the layout width available for the contents.  This value is utilized by NSLayoutManager for determining the layout width.
@property(NS_NONATOMIC_IOSONLY) CGFloat lineFragmentPadding;
  • 所以计算自定义placeHolder的位置需要加上这个边距
  • 关于UITextView的textContainerInset导致文字偏移
  • UITextView可以通过设置textContainerInset来让文字输入区域偏移。
CGFloat x = lineFragmentPadding + textContainerInset.left + self.layer.borderWidth;

placeHolder的x坐标 = 光标偏移量+text偏移量+border边框宽度。
其他坐标同理算得。

如何使用

  • cocoapods导入(搜索不到请更新本地仓库)
pod   'ZWPlaceHolder'
  • 直接将文件拖入工程中,引入头文件即可
#import "UITextView+ZWPlaceHolder.h"

搭配使用

源码

  • 源码放在GitHub上,欢迎指正,记得star哦!
cocoapod版本更新记录
  • 0.0.2 ---2017-09-14
    • 修改当设置placeHolder后给UITextView的Text赋值,导致文字覆盖在placeHolder上的bug.
    • 添加和UITextField统一的placeholder属性、为部分第三方键盘框架提供支持。例如:IQKeyboardManager会读取placeholder属性并创建UIToolbar.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,665评论 4 61
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,872评论 0 17
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 14,693评论 1 92
  • 第一名 浏阳 易维维 优势:浏阳虽地处长沙东北,但古为吴楚咽喉,一夫当关万夫莫开,由我把控新人培训入司,从参训面谈...
    糖豆DARKER阅读 3,468评论 4 2
  • 衣服包裹的是肉身 棺材盛放的是尸体 岛屿放置的才是灵魂 【1】 无聊是温水中等死的青蛙 激情是吸食可卡因的白鼠 失...
    杨安生姑娘阅读 2,540评论 0 0

友情链接更多精彩内容