scrollViewDidScroll没有被调用

时间:2016-12-08 21:56:02

标签: ios swift xcode

我有一个自定义标签栏,下方有一个水平滚动视图。 标签栏包含5个按钮,每个按钮调用五个自定义键盘中的一个(它们放在滚动视图上)。您可以在滚动滚动视图或按下按钮的这些键盘之间切换。

问题:当我使用滚动视图在键盘之间切换时,如何更改按钮的状态(默认< - >选中)?

视觉:

enter image description here

2 个答案:

答案 0 :(得分:0)

UIScroll有一个名为scrollViewDidScroll的委托方法。每次用户滚动时都会调用此方法。 scrollView有一个名为contentOffset的属性。该属性告诉您滚动的确切程度。使用此方法和属性来分支逻辑。

答案 1 :(得分:0)

我下载了你的项目,你遇到了一些问题。您正在实施UIScrollViewDelegate但由于某种原因,您在应用中使用的方法对于scrollViewDidScroll(_:)是错误的。

该方法需要以这种方式声明:

func scrollViewDidScroll(_ scrollView: UIScrollView) {}

您不能更改该方法中的任何内容,并且在您的情况下,您将参数的名称更改为UIScrollView的名称,只是一个小的更改,但这意味着每次{{1}都不会通知您1}}滚动了。

让我们回到你的问题。为了达到你想要的目标,你需要计算你在UIScrollView里面的当前页面,或者在你的情况下计算按钮的数量,我们可以使用下面的公式来计算:

UIScrollView

之后您需要的是滚动完成滚动时更新您选择的按钮。 let pageWidth = scrollView.frame.size.width let page = Int(round((scrollView.contentOffset.x ) / (pageWidth))) 方法的问题是在滚动过程中多次调用此方法,因此我们需要一个仅在滚动完成时调用的方法,它是scrollViewDidScroll(_:)

因此,您需要在代码中添加以下代码:

scrollViewDidEndDecelerating(_:)

我测试了您应用中的行为并且运行正常。如果您有任何问题我修改了您的项目,但您唯一需要的是在func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { let pageWidth = scrollView.frame.size.width let page = Int(round((scrollView.contentOffset.x ) / (pageWidth))) let previousIndex = selectedIndex tabBarButtons[previousIndex].isSelected = false selectedIndex = page tabBarButtons[page].isSelected = true } 中添加上述方法,它应该可以正常工作

我希望这可以帮到你