【问题标题】:Change ScrollView Page When Scrolled Horizontally but not Vertically水平滚动但不垂直滚动时更改 ScrollView 页面
【发布时间】:2018-10-02 23:21:51
【问题描述】:

我有一个包含 2 个 UITableViews 的滚动视图。换句话说,第 0 页包含 UITableView 0,第 1 页包含 UITableView 1。在视图的顶部,我有一个分段控件。当用户在页面之间滑动时,突出显示的分段控件会发生变化。 IE。当用户在第 0 页并切换到第 1 页时,突出显示的分段控件也会从第 0 页更改为第 1 页。

我的问题是,当当前页面是“第 1 页”并且我垂直滚动 UITableView 时,我的函数将分段控件索引更改为 0。如果用户在第 1 页并且他们在 UITable 上垂直滚动,我不希望更改索引。我已经提供了我的函数来更改下面的分段控制索引。

我尝试在我的 if 语句中包含 && yOffset == 0,但它不起作用,因为我相信 Y == 0 会在短时间内出现。 非常感谢任何帮助。

谢谢。

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    var previousPage : NSInteger = 0
    let pageWidth : CGFloat = scrollView.frame.size.width
    let fractionalPage = Float(scrollView.contentOffset.x / pageWidth)
    let page = lroundf(fractionalPage)
    let yOffset = Float(scrollView.contentOffset.y / pageWidth)

    if previousPage != page {
        previousPage = page
        }

    segments.selectedSegmentIndex = previousPage
    segments(nil)
}

编辑 - 解决方案:

Dhaval D. 提供的解决方案完美运行。在执行页面更改之前,请检查滚动是否由 UITableView 执行。感谢您的帮助!

func scrollViewDidScroll(_ scrollView: UIScrollView) {

 // Check whether scrolling is performed by UITableView then ignore page counter related stuff 
 if scrollView != tableView0 && scrollView != tableView1 {
    var previousPage : NSInteger = 0
    let pageWidth : CGFloat = scrollView.frame.size.width
    let fractionalPage = Float(scrollView.contentOffset.x / pageWidth)
    let page = lroundf(fractionalPage)
    let yOffset = Float(scrollView.contentOffset.y / pageWidth)

    if previousPage != page {
        previousPage = page
        }

    segments.selectedSegmentIndex = previousPage
    segments(nil)
 }
}

【问题讨论】:

  • 您的表格视图只能垂直滚动。所以不要添加任何逻辑来改变scrollViewDidScroll中的分段控件。尝试向包含分段控件的视图控制器添加滑动手势。在该滑动手势中更改分段控件
  • 您好,感谢您的回复。我无法通过滑动手势进行识别。我认为这是由于 UIScrollView。有没有我应该尝试实施的特殊方法?我已经尝试过,但以编程方式并通过 IBAction
  • 我认为正确的做法是使用UIPageViewController 和分段控制
  • 大多数时候,我们可以使用 UIKit 中的标准选项。我认为只是浏览文档以了解可用的内容可能会有所帮助

标签: ios iphone swift uitableview uiscrollview


【解决方案1】:

您可以通过匹配scrollViewDidScroll 中的UITableView 对象来做到这一点,如下所示,或者您可以比较您想要计算PageNo 的UIScrollView 对象,或者您想要更改段控制以显示当前选择。

func scrollViewDidScroll(_ scrollView: UIScrollView) {

 // Check whether scrolling is performed by UITableView then ignore page counter related stuff 
 if scrollView != tableView0 && scrollView != tableView1 {
    var previousPage : NSInteger = 0
    let pageWidth : CGFloat = scrollView.frame.size.width
    let fractionalPage = Float(scrollView.contentOffset.x / pageWidth)
    let page = lroundf(fractionalPage)
    let yOffset = Float(scrollView.contentOffset.y / pageWidth)

    if previousPage != page {
        previousPage = page
        }

    segments.selectedSegmentIndex = previousPage
    segments(nil)
 }
}

【讨论】:

  • 效果很好。更新了问题以包括答案。感谢您的帮助!
猜你喜欢
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
相关资源
最近更新 更多