ios - 没有调用scrollViewDidScroll

标签 ios swift xcode

我有一个自定义选项卡栏,其下方有一个水平 ScrollView 。 选项卡栏包含 5 个按钮,每个按钮都调用五个自定义键盘之一(它们放置在 ScrollView 上)。您可以通过滚动 ScrollView 或按按钮在这些键盘之间切换。

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

视觉:

enter image description here

最佳答案

我下载了您的项目,但您遇到了一些问题。您正在实现 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/

相关文章:

ios - 如何将自己的项目中的类导入到 Playground 中

ios - XCode 5.1 Assets 目录大小

objective-c - 验证包含括号的字符串

ios - 使用 Core Image 自定义滤镜在两个图像之间实现颜色传输

ios - UITextView 与 ActionSheetStringPicker 选择器 View 的问题

ios - JTCalendar 委托(delegate)参数类型与 swift 不匹配

xcode - 两个目标和两个 Localized.Strings(一个基础)

swift - 如何在 swift 3 Xcode 8.2.1 中播放视频

ios - 如何从自定义 CollectionViewController 的 didSelectItemAtIndexPath 实例化 ViewController,它是 tableViewCell 的一部分

android - 如何始终检查抖动中的互联网连接