使用自动布局 iOS 以编程方式滚动到特定 page/position
programmatically scroll to a specific page/position with autolayout iOS
我在滚动视图中使用自动版式。它工作得很好,但我需要能够以编程方式滚动到特定页面。具体来说,我需要在视图加载后滚动到最后一页。我该怎么做呢?我的滚动基本上具有如下所示的视觉格式,除了页数是动态的。
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)
}
你应该使用:
CGPoint desiredOffset = CGPointMake(0.0,desiredPageNumber * pageHeight);
[self.scrollView setContentOffset:desiredOffset animated:YES];
显然可以根据需要进行调整。我不相信你可以或应该通过动画约束来实现这一点,因为自动布局处理滚动视图的独特方式。
如果是水平滚动视图:
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;
}
我在滚动视图中使用自动版式。它工作得很好,但我需要能够以编程方式滚动到特定页面。具体来说,我需要在视图加载后滚动到最后一页。我该怎么做呢?我的滚动基本上具有如下所示的视觉格式,除了页数是动态的。
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)
}
你应该使用:
CGPoint desiredOffset = CGPointMake(0.0,desiredPageNumber * pageHeight);
[self.scrollView setContentOffset:desiredOffset animated:YES];
显然可以根据需要进行调整。我不相信你可以或应该通过动画约束来实现这一点,因为自动布局处理滚动视图的独特方式。
如果是水平滚动视图:
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;
}