iOS UITableViewCell中嵌套UITextView自適應(yīng)的解決方案

需求

現(xiàn)在App中,一個頁面當(dāng)中有時需要輸入各種很多不同功能的文本蛛蒙,并且還是多行的银亲,這樣基本只能使用UITableViewCell中嵌套UITextView最為簡便

問題

Cell中嵌套UITextView后眼滤,UITableView的機制決定了UITextView如果要根據(jù)內(nèi)容的多少來變大的話需要刷新UITableView寺渗,返回當(dāng)前Cell的高度庭敦,不然UITableViewCell不可能自動變大疼进,按照我們一貫的簡單方法就是[tableView reloadData],如果這樣會帶來一個bug秧廉,Cell中的UITextView會失去焦點伞广,然后鍵盤會收起,基本是不可接受的問題疼电。

解決方案

UITableViewCell的子類TextTableViewCell創(chuàng)建一個委托嚼锄,然后將UITextViewdelegate指向TextTableViewCell

TextTableViewCell.h

@protocol TextTableViewCellDelegate <NSObject>
//當(dāng)高度改變時調(diào)用該方法刷新整個tableView
- (void)setupCell:(id)cell needChangeToHeight:(CGFloat)height;
//文字變換時調(diào)用改方法
- (void)setupTextChange:(id)cell;
@end

@interface TextTableViewCell : UITableViewCell <UITextViewDelegate>
@property (strong, nonatomic) NSIndexPath *indexPath;
@property (weak, nonatomic) IBOutlet UILabel *numberLabel;
@property (weak, nonatomic) IBOutlet UITextView *textView;
@property (assign, nonatomic) id<TextTableViewCellDelegate>delegate;
@end

TextTableViewCell.m

@implementation TextTableViewCell

- (void)awakeFromNib {
    [super awakeFromNib];
    // Initialization code
    self.textView.delegate = self;
}

- (void)textViewDidChange:(UITextView *)textView
{
    CGRect bounds = textView.bounds;
    // 計算 text view 的高度
    CGSize maxSize = CGSizeMake(bounds.size.width, CGFLOAT_MAX);
    CGSize newSize = [textView sizeThatFits:maxSize];
    if (newSize.height < 44) {
        newSize.height = 44;
    }
    
    if (bounds.size.height != newSize.height) {
        if (_delegate && [_delegate respondsToSelector:@selector(setupCell:needChangeToHeight:)]) {
            [_delegate setupCell:self needChangeToHeight:newSize.height];
        }
    }
    if (_delegate && [_delegate respondsToSelector:@selector(setupTextChange:)]) {
        [_delegate setupTextChange:self];
    }
}

這樣當(dāng)文字發(fā)生變換時會調(diào)用對應(yīng)的方法蔽豺,注意在textViewDidChange:中我們做了判斷区丑,只有高度發(fā)生變化時才調(diào)用委托方法
接下來的事情就要在ViewController中做了

#pragma mark - TextTableViewCellDelegate
- (void)setupTextChange:(TextTableViewCell *)cell {
    textArray[cell.indexPath.row + cell.indexPath.section * heightArray.count/2] = cell.textView.text;
}

- (void)setupCell:(TextTableViewCell *)cell needChangeToHeight:(CGFloat)height {
    //第一種方式直接刷新tableview
//    heightArray[cell.indexPath.row + cell.indexPath.section * heightArray.count/2] = [NSNumber numberWithFloat:height + 1];
//    [self.tableView beginUpdates];
//    [self.tableView endUpdates];
    
    //第二種方式單獨刷新所選cell的后面的cell
    heightArray[cell.indexPath.row + cell.indexPath.section * heightArray.count/2] = [NSNumber numberWithFloat:height + 1];
    CGRect frame = cell.frame;
    CGRect left = CGRectMake(0.0f, frame.origin.y + frame.size.height, self.tableView.frame.size.width, self.tableView.contentSize.height - frame.origin.y - frame.size.height);
    NSArray *indexPaths = [self.tableView indexPathsForRowsInRect:left];
    if (indexPaths.count > 0) {
        [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
    }
    frame.size.height = height + 1;
    cell.frame = frame;
}

textArrayheightArray分別記錄輸入文本和Cell的高度。
有兩種方案刷新整個UITableView
1.方案一

 [self.tableView beginUpdates];
 [self.tableView endUpdates];

直接采用Updates,這樣就是代碼簡單沧侥,調(diào)用之前必須把高度放入指定的數(shù)據(jù)中
2.方案二
原理是:刷新當(dāng)前Cell以下的所有Cell可霎,因為上面的Cell不會因為當(dāng)前的Cell發(fā)生變化而變化,所以只用刷新當(dāng)前Cell以下的所有Cell

粗略的測試了一下發(fā)現(xiàn)基本沒什么問題宴杀,如果有人遇到了問題啥纸,可以留言,大家一起探討

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末婴氮,一起剝皮案震驚了整個濱河市斯棒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌主经,老刑警劉巖荣暮,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異罩驻,居然都是意外死亡穗酥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門惠遏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砾跃,“玉大人,你說我怎么就攤上這事节吮〕楦撸” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵透绩,是天一觀的道長翘骂。 經(jīng)常有香客問我,道長帚豪,這世上最難降的妖魔是什么碳竟? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮狸臣,結(jié)果婚禮上莹桅,老公的妹妹穿的比我還像新娘。我一直安慰自己烛亦,他們只是感情好诈泼,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著此洲,像睡著了一般厂汗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呜师,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天娶桦,我揣著相機與錄音,去河邊找鬼。 笑死衷畦,一個胖子當(dāng)著我的面吹牛栗涂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播祈争,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼斤程,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了菩混?” 一聲冷哼從身側(cè)響起忿墅,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沮峡,沒想到半個月后疚脐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡邢疙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年炮障,在試婚紗的時候發(fā)現(xiàn)自己被綠了佣蓉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片握侧。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡莱睁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出颁虐,到底是詐尸還是另有隱情蛮原,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布聪廉,位于F島的核電站瞬痘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏板熊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一察绷、第九天 我趴在偏房一處隱蔽的房頂上張望干签。 院中可真熱鬧,春花似錦拆撼、人聲如沸容劳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽竭贩。三九已至,卻和暖如春莺禁,著一層夾襖步出監(jiān)牢的瞬間留量,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留楼熄,地道東北人忆绰。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像可岂,于是被迫代替她去往敵國和親错敢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

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

  • 在我們?nèi)粘5臉I(yè)務(wù)中缕粹,常常伴隨大量的UITableView稚茅,然而動態(tài)地計算Cell的高度常常困擾著我。自從使用了這個...
    Mz楓閱讀 1,890評論 4 1
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫平斩、插件峰锁、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,117評論 4 61
  • 在Android常用編程中,Handler在進行異步操作并處理返回結(jié)果時經(jīng)常被使用双戳。通常我們的代碼會這樣實現(xiàn)虹蒋。 1...
    Ten_Minutes閱讀 356評論 0 0
  • 小可第一次看見向源時,是在迎新入學(xué)的那天飒货,小可很單薄的拖著一個比她看著還大的箱子魄衅,身上背著跟她一樣大的包包。突然就...
    小黑瓶閱讀 225評論 0 0
  • 又有一個朋友要去帝都北漂塘辅! 看到這個消息第一反應(yīng)是傻了晃虫,愣了好久,心里直接爆出一個念頭:這也太帥了吧扣墩! 我出身在南...
    鯨魚兒閱讀 371評論 0 1