我有一个自定义标签栏,下方有一个水平滚动视图。 标签栏包含5个按钮,每个按钮调用五个自定义键盘中的一个(它们放在滚动视图上)。您可以在滚动滚动视图或按下按钮的这些键盘之间切换。
问题:当我使用滚动视图在键盘之间切换时,如何更改按钮的状态(默认< - >选中)?
视觉:
答案 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
}
中添加上述方法,它应该可以正常工作
我希望这可以帮到你