2015-11-29 55 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的结尾。 –

相关问题