一行代碼實現(xiàn)UITextView的placeHolder

讀書無用論的去死.jpg

前言

通過Category一行代碼實現(xiàn)UITextView的placeHolder。搭配使用一行代碼限制并統(tǒng)計UITextView輸入字?jǐn)?shù)效果更佳。

實現(xiàn)效果

ZWPlaceHolder+LimitCouner.gif

導(dǎo)入頭文件

#import "UITextView+ZWPlaceHolder.h"
  • storyboard(xib)一行調(diào)用代碼
self.firstTextView.zw_placeHolder = @"向廠家反饋同業(yè)相關(guān)活動、產(chǎn)品信息、用于市場分析。";
  • 代碼創(chuàng)建UITextView調(diào)用
    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 = @"向廠家反饋同業(yè)相關(guān)活動、產(chǎn)品信息、用于市場分析。";
    [self.view addSubview:textView];
  • 調(diào)整placeHolder的字體大小
    • placeholder的字體大小會跟隨UITextView字體大小而變化,可以通過調(diào)整UITextView的font來調(diào)整PlaceHolder字體大小
textView.font = [UIFont systemFontOfSize:14];
  • 調(diào)整placeHolder的字體顏色
textView.zw_placeHolderColor = [UIColor redColor];
調(diào)整placeHolder字體顏色.png

實現(xiàn)源碼解析

  • 在UITextView的category中通過runtime添加屬性zw_placeHolder,當(dāng)給zw_placeHolder賦值時,去創(chuàng)建一個UILabel添加到UITextView上,然后監(jiān)聽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被光標(biāo)遮擋。
    UITextView的光標(biāo)默認(rèn)邊距是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的位置需要加上這個邊距
  • 關(guān)于UITextView的textContainerInset導(dǎo)致文字偏移
  • UITextView可以通過設(shè)置textContainerInset來讓文字輸入?yún)^(qū)域偏移。
CGFloat x = lineFragmentPadding + textContainerInset.left + self.layer.borderWidth;

placeHolder的x坐標(biāo) = 光標(biāo)偏移量+text偏移量+border邊框?qū)挾取?br> 其他坐標(biāo)同理算得。

如何使用

  • cocoapods導(dǎo)入(搜索不到請更新本地倉庫)
pod   'ZWPlaceHolder'
  • 直接將文件拖入工程中,引入頭文件即可
#import "UITextView+ZWPlaceHolder.h"

搭配使用

源碼

  • 源碼放在GitHub上,歡迎指正,記得star哦!
cocoapod版本更新記錄
  • 0.0.2 ---2017-09-14
    • 修改當(dāng)設(shè)置placeHolder后給UITextView的Text賦值,導(dǎo)致文字覆蓋在placeHolder上的bug.
    • 添加和UITextField統(tǒng)一的placeholder屬性、為部分第三方鍵盤框架提供支持。例如:IQKeyboardManager會讀取placeholder屬性并創(chuàng)建UIToolbar.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,035評論 4 61
  • ¥開啟¥ 【iAPP實現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,295評論 0 17
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 14,090評論 1 92
  • 第一名 瀏陽 易維維 優(yōu)勢:瀏陽雖地處長沙東北,但古為吳楚咽喉,一夫當(dāng)關(guān)萬夫莫開,由我把控新人培訓(xùn)入司,從參訓(xùn)面談...
    糖豆DARKER閱讀 558評論 4 2
  • 衣服包裹的是肉身 棺材盛放的是尸體 島嶼放置的才是靈魂 【1】 無聊是溫水中等死的青蛙 激情是吸食可卡因的白鼠 失...
    楊安生姑娘閱讀 347評論 0 0

友情鏈接更多精彩內(nèi)容