IOS UITextView自適應高度

2021-06-18 17:15:28 字數 1340 閱讀 5259

在uitextview的textchanged事件響應**裡計算輸入內容的高度,然後如果高度與文字變化前比起來有變化,則修改uitextview的高度為這個新的高度。

這看起來很簡單。

新增內容變化的通知響應事件:

[[nsnotificationcenter defaultcenter] addobserver:self selector:@selector(textchanged:) name: uitextviewtextdidchangenotification object:nil];

計算內容高度有兩種方式:

計算輸入文字在指定字型、指定容器和指定換行方式下的size.

cgsize newsize = [textview.text

sizewithfont:[uifont fontwithname:@"helvetica" size:14]

constrainedtosize:cgsizemake(222,9999)

linebreakmode:uilinebreakmodewordwrap];

2.  textview繼承自uiscrollview,直接從contentsize屬性獲取

textview.contentsize.height

第一種方式拿出來的高度需要再加上

padding

的值才是最終的值

(即每行的空白區域)

,並且需要指定constrainedtosize,不太靈活。第二種方法簡單直接準確,我選擇了它。

在ios 5.0及以上,以上實現已經足夠完美了。在ios4.3中發現了bug,當文字框變成多行,然後清空文字框再輸入文字時,發現內容和游標跑到了uitextview上方並且不可見。google關鍵字"one line uitextview"可以發現類似的bug提問。經過查證資料和跟蹤**,根本原因應該uitextview的insets.bottom在文字輸入的過程中被不斷地自動設定造成的。這是uitextview的預設實現行為,但這肯定是ios4.3的bug,而ios5.0修復了它。解決辦法就是試圖阻止uitextview設定contentinset,我們可以繼承uitextview並且覆蓋setcontentinset:方法來達到目的,在setcontentinset:裡只需要設定乙個固定的contentinset.bottom即可。

還有乙個地方需要注意,當你清空輸入框時(_textview.text=@"";),不會自動觸發textchanged:,你需要重寫settext:方法來呼叫textchanged:。並且你清空textview後,你拿到的contentsize也不準確,所以還需要根據text是否為空來設定乙個最小的高度。

Android ImageView高度自適應

最近有個需求,是往乙個linearlayout中去新增imageview,imageview是動態生成的,然後設定imageview的屬性,但是不管怎麼設定scaletype,都達不到自己喜歡的狀態,顯示原圖大小的話會在imageview的上下有留白,如圖 初步猜想是由於原始 比較大,然後縮放後im...

flutter TextField換行自適應

先明確這種輸入文字框有哪些功能點?能夠自定義各種間距.主要是控制項外邊距 margin 內間距 padding 能夠自定義樣式.輸入框邊框 圓角 radius 描邊 border 顏色 字樣 大小,顏色 提示字樣 hint 自適應.字型大小變大控制項高度也變高同時保持指定的內外邊距.最重要的功能 多...

UILabel和UITextView自適應高度

uilabel自動換行,自適應高度 uilabel label uilabel alloc initwithframe cgrectzero label setbackgroundcolor uicolor clearcolor label setfont uifont systemfontofsi...