我有一个自定义选项卡栏,其下方有一个水平 ScrollView 。 选项卡栏包含 5 个按钮,每个按钮都调用五个自定义键盘之一(它们放置在 ScrollView 上)。您可以通过滚动 ScrollView 或按按钮在这些键盘之间切换。
问题:当我使用 ScrollView 在键盘之间切换时,如何更改按钮的状态(默认 <-> 选择)?
视觉:
最佳答案
我下载了您的项目,但您遇到了一些问题。您正在实现 UIScrollViewDelegate
,但由于某种原因,您应用中的方法对于 scrollViewDidScroll(_:)
来说是错误的。
该方法需要这样声明:
func scrollViewDidScroll(_ scrollView: UIScrollView) {}
您无法更改该方法中的任何内容,并且在您的情况下,您将参数名称更改为 UIScrollView
的名称,这只是一个微小的更改,但这意味着您不会每次都收到通知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
}
我测试了您的应用程序中的行为并且工作正常。如果您遇到任何问题,我会修改您的项目,但您唯一需要的就是在 UIViewController
中添加上述方法,它应该可以正常工作
希望对你有帮助
关于ios - 没有调用scrollViewDidScroll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41049530/