我正在構建一個iOS計算器應用程序,它有一個歷史標籤,顯示所有以前的計算,這些計算都顯示在一行上(例如30 * 10 = 300 4 * 300 = 1200)。我把標籤放在UIScrollView裏面,這樣當標籤變得比屏幕更寬時,我可以水平滾動瀏覽歷史。我將標籤放置在水平和垂直內側,並將標籤限制在故事板的滾動視圖中。爲什麼我沒有得到UIScrollView的實際contentSize?
在我添加一個計算到歷史記錄後,我檢查一個屬性canVerticallyScroll,它表示我通過擴展名添加到UIScrollView。如果ScrollView內容的寬度比屏幕寬,則返回true。如果是這樣,我希望它通過使用setContentsOffset滾動到結尾。
下面是我的視圖控制器代碼:
func saveResultTohistory(var operands: Array<Double>) {
if operands.count == 2 { // Unary operation
historyLabel.text = historyLabel.text! + operation + "\(operands.removeFirst()) = \(displayValue) "
} else if operands.count == 3 { // Binary operation
historyLabel.text = historyLabel.text! + "\(operands.removeFirst()) " + operation + " \(operands.removeFirst()) = \(displayValue) "
}
updateScrollView() // Update the position in the historyScroller
}
func updateScrollView() {
if historyScroller.canVerticallyScroll {
let end = CGPointMake(historyScroller.frame.size.width, 0)
historyScroller.setContentOffset(end, animated: true)
}
}
這裏延伸:
extension UIScrollView {
var canVerticallyScroll: Bool {
get {
let widthOfScrollView = self.frame.size.width
let widthOfContent = self.contentSize.width
return widthOfContent > widthOfScrollView
}
}
}
這工作,但它是不準確的,因爲當第一個計算添加到標籤, ScrollView的contentSize是(0.0),它不可能是因爲標籤中有文本,所以應該說是(50,0)。在向標籤添加另一個計算後,contentSize更新爲(50,0),同時知道標籤比此寬,因爲它現在包含兩個計算。
所以基本上所有的工作除了當我嘗試閱讀contentSize我沒有得到一個準確的價值。爲什麼我沒有得到UIScrollView的實際contentSize?
非常感謝。卡住後,你的解釋幫助我解決了這個問題。對於和我一樣遇到同樣事情的人,這就是我解決它的方法:我將子類** UIScrollView **和內部 - ** layoutSubviews **我將邏輯檢查內容的寬度是否發生了變化,以及內容是否更大然後屏幕。如果兩者都爲真,則通過調用scrollRectToVisible()**滾動到scrollView的結尾。 –