使用自动布局iOS以编程方式滚动到特定页面/位置

Posted

技术标签:

【中文标题】使用自动布局iOS以编程方式滚动到特定页面/位置【英文标题】:programmatically scroll to a specific page/position with autolayout iOS 【发布时间】:2015-06-13 04:10:46 【问题描述】:

我正在使用带有滚动视图的自动布局。它工作得很好,但我需要能够以编程方式滚动到特定页面。具体来说,我需要在视图加载后滚动到最后一页。我该怎么做呢?我的滚动基本上具有如下所示的视觉格式,除了页数是动态的。

visual format for vertically scrolling (swap V and H for horizontally scrolling):

view hierarchy is scrollContainer(UIView) -> scrollView(UIScrollView) -> contentView(UIView) -> pages(UIView’s)

V:|scrollView|
H:|scrollView|

V:|contentView|
H:|contentView|

V:|[page1(==scrollContainer)][page2(==scrollContainer)][page3(==scrollContainer)]|
H:|[page1(==scrollContainer)]|
H:|[page2(==scrollContainer)]|
H:|[page3(==scrollContainer)]|

编辑:澄清我的问题

偏移滚动视图的代码如下。但是我什么时候可以使用自动布局获得想要滚动到的页面的原点?如果我把它放在 viewDidLayoutSubviews 中,它会在每次设备旋转时更新。我需要在加载视图时更新。是否有更合适的方法来覆盖?或者有没有办法用约束来设置原点?

    let lastPage = pages?.last
    if lastPage != nil 
        let origin = lastPage!.frame.origin
        self.scrollView.setContentOffset(origin, animated: false)
    

【问题讨论】:

【参考方案1】:

如果是水平滚动视图:

CGPoint lastPage = CGPointMake((numberOfPages - 1) * pageWidth, 0.0f);

如果是垂直的:

CGPoint lastPage = CGPointMake(0.0f, (numberOfPages - 1) * pageHeight);

那么就使用滚动视图的方法:

 [scrollView setContentOffset:lastPage animated:YES];

您可以将此代码留在viewDidLayoutSubviews,只需添加一个if语句来测试它是否是第一次:

if (!self.alreadyScrolled) 
    [self scrollToDesiredPage];
    self.alreadyScrolled = YES;

【讨论】:

谢谢,我忘记了 setContentOffset。我仍在寻找何时调用该方法。我需要在加载完所有内容并加载 pageWidth/pageHeight 后调用一次 I need to update just when the view is loaded. 你试过viewDidLoad 可能吗? viewDidLoad 获取帧为时尚早,但我已经弄清楚了。我会尽快发布。【参考方案2】:

你应该使用:

CGPoint desiredOffset = CGPointMake(0.0,desiredPageNumber * pageHeight);
[self.scrollView setContentOffset:desiredOffset animated:YES];

显然可以根据需要对其进行调整。我不相信你可以或不应该通过动画约束来实现这一点,因为自动布局处理滚动视图的独特方式。

【讨论】:

以上是关于使用自动布局iOS以编程方式滚动到特定页面/位置的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式布局 UIScrollView,并为其子视图添加了自动布局,但它不滚动

如何以编程方式使用自动布局添加自定义视图

ios - 如何使用ios swift中的自动布局以编程方式将两个标签并排放置在中心位置?

以编程方式滚动到 Android ListView 中的特定位置

即使启用了自动布局,我能否以编程方式设置特定视图的框架?

如何制作滚动视图,滚动iOS时在特定页面中滚动