今天做一個頁面,有大量的文字展示,需要用到UITextView豆励。因為文字過多癌刽,自然有一部分無法顯示崎坊,需要滑動后才能看到。不過當(dāng)我把頁面寫完后,出來的效果是這樣的。
默認(rèn)的效果是妇押,textview自動滑倒最底下。這肯定不符合我們的設(shè)想姓迅,我們希望的是一進來就從第一行顯示敲霍。第一個想到的方法是進入頁面后回滾會滾到首行。不過這個方法明顯多此一舉队贱,心想textview應(yīng)該有控制默認(rèn)滾動到屬性色冀,結(jié)果還真被我找到了,不過這個屬性藏的很深柱嫌。
textview.layoutManager.allowsNonContiguousLayout = false
默認(rèn)為true,正是這個屬性讓textview默認(rèn)滾到末尾屯换。
興高采烈的改完屬性编丘,重新運行与学,結(jié)果發(fā)現(xiàn)還是有問題。
竟然是從第二行開始顯示嘉抓?索守?!抑片!接著我嘗試加入滾動代碼
textview.scrollRangeToVisible(NSMakeRange(0, 1))
嘗試多次后發(fā)現(xiàn)卵佛,這段代碼只有放在viewDidAppear中才能起作用(此時用戶是能夠看到滾動過程的!)敞斋,我推測在viewDidLoad和viewWillAppear中textview還沒有拿到最終的frame(我是用storyboard來構(gòu)建頁面的)截汪,使得在這期間無論修改allowsNonContiguousLayout還是scrollRangeToVisible都沒有效果,因為此時的frame確實已經(jīng)滾動到了頂端植捎。只不過等viewDidAppear之后UI布局做了最重調(diào)整衙解,而此時滾動過程已經(jīng)結(jié)束。
大概猜到原因之后焰枢,解決方法自然加入layoutIfNeeded讓UI控件提前計算出最終的frame
override func viewDidLoad() {
super.viewDidLoad()
textview.layoutIfNeeded()
textview.layoutManager.allowsNonContiguousLayout = false
textview.scrollRangeToVisible(NSMakeRange(0, 1))
}
注意蚓峦,即便是使用layoutIfNeeded提前拿到textview的frame,也還需要加入scrollRangeToVisible才能最終達到想要的效果济锄。我推測這是蘋果AutoLayout的bug暑椰。說實話AutoLayout一開始出現(xiàn)的時候各種BUG,不過完全擁抱AutoLayout之后荐绝,布局這一塊確實減少了很多工作量干茉。希望iOS能夠更加完善吧。