TextView占位符诉位,隨著字符串長度自動增高

開發(fā)這個控件的緣由是因為目前做的App有一個對話框的功能,而蘋果提供的原生UITextField或者UITextView不符合對話框的需求(該控件可用于對話輸入框)菜枷。

限制
1苍糠,UITextFiled不能多行輸入
2,UITextView沒有占位符
3啤誊,2者都不能自動增高功能岳瞭。

重寫UITextView

1,為UITextView添加占位符

- (UITextView *)placeHolder {
    if (_placeHolder == nil) {
        UITextView *placeHolder = [[UITextView alloc] init];
        _placeHolder = placeHolder;
        placeHolder.userInteractionEnabled = NO;
        placeHolder.showsVerticalScrollIndicator = NO;
        placeHolder.showsHorizontalScrollIndicator = NO;
        placeHolder.scrollEnabled = NO;
        placeHolder.font = self.font;
        placeHolder.backgroundColor= [UIColor clearColor];
        placeHolder.textColor = [UIColor lightGrayColor];
        [self addSubview:placeHolder];
    }
    return _placeHolder;
}

監(jiān)聽文本變化顯示或隱藏占位符

- (instancetype)init {
    if (self = [super init]) {
        // 添加文本變化通知
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangeText:) name:UITextViewTextDidChangeNotification object:nil];
    }
    return self;
}

2蚊锹,處理文本變化
自定義方法 didChangeText瞳筏,比如顯示隱藏站位文本,根據(jù)字符串計算最新高度

- (void)didChangeText:(NSNotification *)notification{
    
    // 隱藏顯示占位符
    self.scrollEnabled = self.placeHolder.hidden = self.hasText;
    
    // 以防監(jiān)聽到非自己的文本變化
    TBTextView *textView = notification.object;
    if (textView == nil || textView != self || !self.tbDelegate || ![self.tbDelegate respondsToSelector:@selector(changeHeight:textString:textView:)]) return;

    // 計算寬高
    CGFloat height = [self.text boundingRectWithSize:CGSizeMake(self.frame.size.width - 10, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : self.font} context:nil].size.height + 0.5;// 加0.5以防顯示不全 -10是因為輸入框左右有邊距

    // 記錄初始化高度
    static BOOL firstTimeIn = YES;
    if (firstTimeIn) {
        firstTimeIn = NO;
        _initHeight = self.bounds.size.height;
    }
    
    // 為什么取整牡昆?  因為有晃動的情況出現(xiàn)
    NSInteger heigtInt = ceil(height);
    CGFloat curHeight = heigtInt + self.textContainerInset.top + self.textContainerInset.bottom;
    
    // 當(dāng)前高度比原始高度小
    if (_initHeight > curHeight) {
        curHeight = _initHeight;
    }
    
    // 不能超過最大高度
    if (_maxLine > 0 && curHeight > _maxHeight ) {
        curHeight = _maxHeight;
        self.scrollEnabled = YES;
    }else{
        self.scrollEnabled = NO;
    }
    
    // 執(zhí)行代理
    if ([self.tbDelegate respondsToSelector:@selector(changeHeight:textString:textView:)]) {
        [self.tbDelegate changeHeight:curHeight textString:textView.text textView:textView];
    }
}

3姚炕,代理返回新高度

    // 執(zhí)行代理
    if ([self.tbDelegate respondsToSelector:@selector(changeHeight:textString:textView:)]) {
        [self.tbDelegate changeHeight:curHeight textString:textView.text textView:textView];
    }

有些小細節(jié)需要注意下:
1,為什么用 UITextView 作占位符而不用UILabel丢烘,是因為UITextView可以與本身文字可以重疊一致
2柱宦,UITextView的上下有textContainerInset
3, 為什么取整播瞳? 因為有抖動的情況出現(xiàn)
NSInteger heigtInt = ceil(height);
CGFloat curHeight = heigtInt + self.textContainerInset.top + self.textContainerInset.bottom;


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掸刊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赢乓,更是在濱河造成了極大的恐慌痒给,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,332評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骏全,死亡現(xiàn)場離奇詭異苍柏,居然都是意外死亡,警方通過查閱死者的電腦和手機姜贡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評論 3 385
  • 文/潘曉璐 我一進店門试吁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人楼咳,你說我怎么就攤上這事熄捍。” “怎么了母怜?”我有些...
    開封第一講書人閱讀 157,812評論 0 348
  • 文/不壞的土叔 我叫張陵余耽,是天一觀的道長。 經(jīng)常有香客問我苹熏,道長碟贾,這世上最難降的妖魔是什么币喧? 我笑而不...
    開封第一講書人閱讀 56,607評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮袱耽,結(jié)果婚禮上杀餐,老公的妹妹穿的比我還像新娘。我一直安慰自己朱巨,他們只是感情好史翘,可當(dāng)我...
    茶點故事閱讀 65,728評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著冀续,像睡著了一般琼讽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洪唐,一...
    開封第一講書人閱讀 49,919評論 1 290
  • 那天钻蹬,我揣著相機與錄音,去河邊找鬼桐罕。 笑死脉让,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的功炮。 我是一名探鬼主播溅潜,決...
    沈念sama閱讀 39,071評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼薪伏!你這毒婦竟也來了滚澜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,802評論 0 268
  • 序言:老撾萬榮一對情侶失蹤嫁怀,失蹤者是張志新(化名)和其女友劉穎设捐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體塘淑,經(jīng)...
    沈念sama閱讀 44,256評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡萝招,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,576評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了存捺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片槐沼。...
    茶點故事閱讀 38,712評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖捌治,靈堂內(nèi)的尸體忽然破棺而出岗钩,到底是詐尸還是另有隱情,我是刑警寧澤肖油,帶...
    沈念sama閱讀 34,389評論 4 332
  • 正文 年R本政府宣布兼吓,位于F島的核電站,受9級特大地震影響森枪,放射性物質(zhì)發(fā)生泄漏视搏。R本人自食惡果不足惜审孽,卻給世界環(huán)境...
    茶點故事閱讀 40,032評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凶朗。 院中可真熱鬧瓷胧,春花似錦显拳、人聲如沸棚愤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宛畦。三九已至,卻和暖如春揍移,著一層夾襖步出監(jiān)牢的瞬間次和,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評論 1 266
  • 我被黑心中介騙來泰國打工那伐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留踏施,地道東北人。 一個月前我還...
    沈念sama閱讀 46,473評論 2 360
  • 正文 我出身青樓罕邀,卻偏偏與公主長得像畅形,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子诉探,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,606評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 占位文字1日熬、曾經(jīng)有個這么一個項目需求: 使用textField時,占位文字默認是黑色的,我們的需求是當(dāng)開始編輯時,...
    博行天下閱讀 884評論 2 1
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,837評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件肾胯、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62
  • 今天竖席,小么,給大家分享一個很真實的敬肚,發(fā)生在小么身上的事毕荐。 小么喜歡上了一個男孩子,他是轉(zhuǎn)學(xué)來的艳馒,小么覺得他很有趣憎亚,...
    夭小么閱讀 202評論 2 1
  • 暫時利益和長久利益只是時間長短不同虽填。如果讓你選擇你會選擇哪一個?很多人肯定說是長久利益曹动。但是正真讓你選擇的時候斋日,很...
    hsgz閱讀 703評論 0 0