为什么我没有获得UIScrollView的实际contentSize?

时间:2015-11-29 16:23:37

标签: ios iphone swift uiscrollview

我正在构建一个iOS计算器应用程序,它具有显示所有先前计算的历史记录标签,这些计算都显示在一行上(例如30 * 10 = 300 4 * 300 = 1200)。我将标签放在UIScrollView中,这样当标签比屏幕宽时我可以水平滚动历史记录。我将标签定位为在水平和垂直方向内适合滚动视图,并将标签限制在我的故事板中的滚动视图中。

在我为历史记录添加计算后的视图控制器中,我检查了一个属性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?

1 个答案:

答案 0 :(得分:0)

在代码运行后,运行循环会更新scrollView的contentSize

您正在更改historyText标签的文字,但不会立即更新其尺寸。由于它的大小尚未更改,因此访问它时容器的大小不会改变。