为啥我没有得到 UIScrollView 的实际 contentSize?
Posted
技术标签:
【中文标题】为啥我没有得到 UIScrollView 的实际 contentSize?【英文标题】:Why am I not getting the actual contentSize of UIScrollView?为什么我没有得到 UIScrollView 的实际 contentSize? 【发布时间】:2015-11-29 16:23:36 【问题描述】:我正在构建一个 ios 计算器应用程序,它有一个 History 标签,显示所有以前的计算,这些计算都显示在一行上(例如 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
这个行得通,但是不准确,因为第一次计算加到label的时候,ScrollView的contentSize是(0.0),不能这样,因为label里面有文字,应该让说 (50, 0)。在我向标签添加另一个计算后,contentSize 更新为 (50, 0),同时知道标签比这更宽,因为它现在包含两个计算。
所以基本上一切正常,除了当我尝试读取 contentSize 时,我没有得到准确的值。为什么我没有得到 UIScrollView 的实际 contentSize?
【问题讨论】:
【参考方案1】:滚动视图的contentSize
在您的代码运行后由运行循环更新。
您正在更改historyText
标签的文本,但没有立即更新其大小。因为它的大小还没有改变,所以当你访问它时,它的容器的大小不会改变。
【讨论】:
非常感谢。被卡住后,您的解释帮助我解决了这个问题。对于遇到与我相同的事情的人,这就是我解决它的方法:我将 UIScrollView 子类化并在 -layoutSubviews 内部放置逻辑来检查内容的宽度是否发生了变化如果内容比屏幕大。如果两者都是真的,我通过调用 scrollRectToVisible() 滚动到 scrollView 的末尾。以上是关于为啥我没有得到 UIScrollView 的实际 contentSize?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 UIScrollView 的滚动会在 iOS 4.3 中触发 layoutSubViews 方法,而在 5.0 及以上版本中却没有?
为啥我在 UIScrollView 中的 UIView 不滚动?
当我删除 UIpanguesture 时,为啥我的 UIScrollView 不滚动?