如何禁用水平滚动,使用UIScrollView点击分页时页面会发生变化?

Vis*_*l16 13 objective-c uisegmentedcontrol uiscrollview swift uistackview

我有一个UIScrollViewpagingEnabled.添加5 UIStackView到子视图,UIScrollView也有一个UISegmentedControl.我想显示当前选定的段,并且还想禁用水平滚动,但视图将能够垂直滚动.

举一个例子:

  • 让选择的页面索引= 0
  • 用户无法水平滚动或拖动以导航到下一页.
  • 用户可以垂直滚动
  • 现在用户选择的页面索引= 1英寸 UISegmentedControl
  • 第2页将可见
  • 现在用户无法滚动或拖动到0和2索引

我如何使用它来实现此功能 UIScrollView

尝试过的逻辑:

- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];

CGFloat xOff = self.scrollView.frame.size.width * self.currentPage;
[self.scrollView setContentSize:CGSizeMake(xOff, self.scrollView.contentSize.height)];
//[self.scrollView setContentOffset:CGPointMake(xOff, 0) animated:true];

}
Run Code Online (Sandbox Code Playgroud)

但在更改页面后使用此UIScrollView当我再次滚动时转到0页面.

Dal*_*eet 8

您可以在启用分页的情况下使用UICollectionView,在内部可以使用垂直滚动启用实现UIScrollView.禁用UICollectionView滚动并使用以下代码更改单击时的索引集合单元格:

接受新的,已编辑的答案:

在viewDidLayoutSubviews中添加它

迅速

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let indexPath = IndexPath(item: 12, section: 0)
    self.collectionView.scrollToItem(at: indexPath, at: [ .centeredHorizontally], animated: true)
}
Run Code Online (Sandbox Code Playgroud)

通常,.centerVertically就是这种情况

Objective-C的

-(void)viewDidLayoutSubviews {
   [super viewDidLayoutSubviews];
    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:12 inSection:0];
   [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];
}
Run Code Online (Sandbox Code Playgroud)