在调整滚动视图大小时滚动到滚动视图页面

Scroll to scrollview page while scrollview is being resized

我有一个禁用分页的滚动视图。它有许多子视图。它们中的每一个都有宽度约束,并且相互约束以及滚动视图,因此当子视图增长时,滚动视图内容区域也会增长。

点击子视图时,我 运行 以下代码:

var page = subView.tag

for scrollViewSubViewWidthConstraint in scrollViewSubViewWidthConstraints {
    //this results in the subview being larger than it previously was
    scrollViewSubViewWidthConstraint.constant = self.view.frame.width
}

UIView.animateWithDuration(0.35) {
    self.view.layoutIfNeeded()
}

scrollView.pagingEnabled = false
scrollView.setContentOffset(CGPoint(x: self.view.frame.width * CGFloat(page), y: 0), animated: true)

此代码旨在:

  1. 调整子视图的大小,使其达到 'page'
  2. 的宽度
  3. 在滚动视图上启用分页
  4. 顺利滚动到正确的页面

不幸的是,它不仅没有滚动到正确的页面,似乎是因为它在更新约束时试图计算要滚动的量,但它是以一种没有吸引力的时尚动画方式实现的。

如果我将我的代码更改为这个(删除动画)它仍然不起作用:

self.view.layoutIfNeeded()

scrollView.pagingEnabled = true
scrollView.setContentOffset(CGPoint(x: self.view.frame.width * CGFloat(page), y: 0), animated: false)

这有效,但不是动画,而且有延迟 - 两者都不行。

self.view.layoutIfNeeded()

UIHelper.delay(0.1, closure: { () -> () in //helper function that executes code after a given delay...
    self.scrollView.pagingEnabled = true
    scrollView.setContentOffset(CGPoint(x: self.view.frame.width * CGFloat(page), y: 0), animated: true)
})

也许解决方法是将 contentOffset 设置到动画块中

    UIView.animateWithDuration(0.35) {
        self.view.layoutIfNeeded()
        scrollView.setContentOffset(CGPoint(x: self.view.frame.width * CGFloat(page), y: 0), animated: false)
    }