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

Posted

技术标签:

【中文标题】在调整滚动视图大小时滚动到滚动视图页面【英文标题】:Scroll to scrollview page while scrollview is being resized 【发布时间】:2015-06-03 00:55:34 【问题描述】:

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

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

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)

此代码旨在:

    调整子视图的大小,使其与“页面”的宽度相同 在滚动视图上启用分页 平滑滚动到正确的页面

不幸的是,它不仅没有滚动到正确的页面,似乎是因为它试图在更新约束时计算滚动量,而且它以一种不吸引人的时尚动画方式这样做。

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

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)
)

【问题讨论】:

【参考方案1】:

也许解决方法可以将 contentOffset 设置为动画块

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

【讨论】:

以上是关于在调整滚动视图大小时滚动到滚动视图页面的主要内容,如果未能解决你的问题,请参考以下文章

调整滚动视图框架的大小时,UIScrollView 子视图的大小调整不正确

在 UIScrollView 中调整视图大小后,滚动视图不知道它改变了

我如何在我的滚动视图中调整我的图像视图的大小,因为它在这个图像中完成?

SwiftUI:滚动视图中的顶部锚定可调整大小视图

QTextEdit 在调整大小时不显示水平滚动条

我需要8个视图:窗口大小调整时没有水平滚动条