引言:項(xiàng)目需求,類似實(shí)現(xiàn)微信輸入框效果晨横,用戶輸入文字時(shí)毙石,輸入框的高度自適應(yīng)。自己實(shí)現(xiàn)的過程中颓遏,遇到了一些問題徐矩,特此記錄一下。
使用UITextView來實(shí)現(xiàn)此需求叁幢,首先初始化UITextView的frame滤灯,然后實(shí)現(xiàn)UITextView的代理方法- (void)textViewDidChange:(UITextView *)textView;
,此方法當(dāng)UITextView有輸入就會(huì)調(diào)用,在此代理方法中重繪UITextView的frame,已達(dá)到高度自適應(yīng)的要求鳞骤,那么問題來了窒百。
問題1:
在UITextView的特定frame中,如何判斷什么時(shí)候換行豫尽?
解決1:使用計(jì)算字符串的方法篙梢,計(jì)算出其內(nèi)容在給定的UITextView的寬度的范圍內(nèi)的高度,然后利用計(jì)算出的內(nèi)容的高度加上適當(dāng)?shù)臄?shù)值作為UITextView的高度美旧。代碼如下:
- (void)textViewDidChange:(UITextView *)textView{
NSString *testString = [NSString stringWithFormat:@"測試測試測試測試測試"];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:[UIFont systemFontOfSize:16] forKey:NSFontAttributeName];
//此處的100 應(yīng)為你的UITextView的寬度
CGSize testStringSize = [testString boundingRectWithSize:CGSizeMake(100, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:dict
context:nil].size;
//重繪UITextView的frame
CGRect rect = _textView.frame;
rect.frame.size = testStringSize;
_textView.frame = rect;
}
此種方法可以解決問題但是又引出了新的問題渤滞,使用此種方法,會(huì)出現(xiàn)本應(yīng)該換行輸入時(shí)榴嗅,UITextView的高度并沒有改變妄呕,而是再輸入幾個(gè)字符才會(huì)改變高度,這個(gè)問題我沒有找到原因嗽测,搜索網(wǎng)絡(luò)上绪励,也有存在此問題的網(wǎng)友,如果您知道解決辦法唠粥,請?jiān)谙路搅粞允栉海嘀x!
解決2:
使用sizeThatFits或者sizeToFit方法解決此問題。
這兩種方法存在的區(qū)別在于(個(gè)人理解):
1晤愧、sizeThatFits方法會(huì)返回最適合內(nèi)容的當(dāng)前接收者的寬度和高度蠢护,但是不會(huì)改變當(dāng)前接收者的frame。
2养涮、sizeToFit方法會(huì)返回最適合內(nèi)容的當(dāng)前接收者的寬度和高度葵硕,會(huì)直接改變當(dāng)前接收者的frame;
注:
1贯吓、當(dāng)前接收者為需要自適應(yīng)高度的View懈凹,此處為UITextView。上述兩個(gè)方法為UIView的方法悄谐,所以繼承UIView的視圖都可以使用介评。
代碼如下:
- (void)textViewDidChange:(UITextView *)textView{
//1.計(jì)算textView文字高度
[_textView sizeToFit];
//CGSize size = [textView sizeThatFits:CGSizeZero];
//CGSize size = [textView sizeThatFits:CGSizeMake(80, 80)];
//2.重繪_textView寬度(因?yàn)檫@里使用的是sizeToFit方法,UITextView的實(shí)際frame已經(jīng)改變了爬舰,所以需要重繪寬度)
CGRect rect = _textView.frame;
//TEXTVIEW_WIDTH為UITextView的固定寬度值
rect.size.width = TEXTVIEW_WIDTH;
_textView.frame = rect;
}
上述代碼使用的方法為sizeToFit
需要重繪寬度们陆,使用sizeThatFits方法與上述使用方式類似,這里就不贅述了情屹。
但是需要注意的是:
1坪仇、當(dāng)使用CGSizeZero
時(shí),其返回的size為正常顯示的size垃你。
2椅文、當(dāng)你自定義某個(gè)size時(shí)喂很,例如:CGSizeMake(80, 80)
,當(dāng)計(jì)算的最合適的size比自定義的數(shù)值小時(shí),返回正常計(jì)算的size皆刺,當(dāng)計(jì)算的最合適的size比自定義的數(shù)值大時(shí)少辣,這時(shí)返回的將是在自定義size范圍內(nèi)的最合適的size。
3羡蛾、記得重繪視圖的size漓帅,因?yàn)榇朔椒ú⒉粫?huì)直接改變視圖的size!