2015-11-29 53 views
0

我正在構建一個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?

回答

0

在代碼運行後,scrollView的contentSize由運行循環更新。

您正在更改historyText標籤的文本,但不會立即更新其大小。由於其大小尚未更改,訪問它時容器的大小不會改變。

+0

非常感謝。卡住後,你的解釋幫助我解決了這個問題。對於和我一樣遇到同樣事情的人,這就是我解決它的方法:我將子類** UIScrollView **和內部 - ** layoutSubviews **我將邏輯檢查內容的寬度是否發生了變化,以及內容是否更大然後屏幕。如果兩者都爲真,則通過調用scrollRectToVisible()**滾動到scrollView的結尾。 –

相關問題