ScrollViewDelegate 不调用 scrollViewDidScroll 或 scrollViewWillBeginDragging

Posted

技术标签:

【中文标题】ScrollViewDelegate 不调用 scrollViewDidScroll 或 scrollViewWillBeginDragging【英文标题】:ScrollViewDelegate not calling scrollViewDidScroll or scrollViewWillBeginDragging 【发布时间】:2018-01-31 17:54:34 【问题描述】:

我从ios tableview how can I check if it is scrolling up or down 那里得到了解决方案,回答了如何测试用户是向上还是向下滚动并在我的代码中实现。在第一个带有 UITableView 的 viewcontroller 中,这段代码工作得很好,但对于另一个有类似 UITableView 的 viewcontroller,这不起作用。我已经检查了我可能犯的任何错误,例如在不同的函数中意外引用了这些错误,或者在定义我的类时没有引用 UIScrollViewDelegate,但根据解决方案,这不是必要的,因为“UITableViewDelegate已经是 UIScrollViewDelegate 的子类。”

这是我应该调用的代码,但它没有(我计划根据用户向上或向下移动来为视图控制器上的某些组件设置动画):

var lastContentOffset: CGFloat = 0

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) 
    self.lastContentOffset = scrollView.contentOffset.y


func scrollViewDidScroll(_ scrollView: UIScrollView) 
    if (self.lastContentOffset < scrollView.contentOffset.y) 
        UIView.animate(withDuration: 0.2, animations:  () -> Void in
            self.listTableView.frame = CGRect(x:0 ,y: 36,width: self.view.bounds.width,height: self.view.bounds.height - 36)
        )



     else if (self.lastContentOffset > scrollView.contentOffset.y) 
        UIView.animate(withDuration: 0.2, animations:  () -> Void in
            self.listTableView.frame = CGRect(x:0 ,y: 131,width: self.view.bounds.width,height: self.view.bounds.height - 131)               
        )

     else 

    

到目前为止,我已经尝试打印文本只是为了查看它是否可能只是我的动画错误,但没有任何反应。以下是有关我的其余代码的更多背景信息:

    我确实为 viewController 中的另一个功能实现了两个 UISwipeGesture 和一个 UITapGesture

    我在这段代码之前定义并设置了 tableView,但这应该没什么区别

    我的 tableView 收集的信息是通过几个 web 请求,这不需要很长时间但仍然需要一些时间 - 我已经为它编写了一个函数

    有时,blurViewController 和 ContainerViewController 会完全覆盖 tableView,但我开发了一个代码,可根据要求将它们设置为后台,以免影响 tableView 的功能

    这不是 UITableViewController 而是部分覆盖 UIViewController 的 UITableView

【问题讨论】:

【参考方案1】:

您是否将 scrollView 委托设置为 self ?


override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    self.scrollView.delegate = self


【讨论】:

非常感谢。最终起作用的是'self.listTableView.delete = self'。然而,奇怪的是我没有在我的其他代码中这样做,这也有效。一个问题:为什么我需要这样做?在我看来这是多余的,但我似乎错了。 @CyprianZander 通过做 delegate = self 您确认了 scrollView 委托方法的协议。换句话说,您是在告诉您的控制器您希望接收与此协议关联的函数的回调。 非常感谢,让这一步更清晰了!【参考方案2】:
To use delegate method of the UIScrollView, you have to set the delegate for it

You can set the delegate method in two ways:-

1) By Storyboard - Select UIScrollView and Drag and drop to File Owner of the View Controller the delegate method will set for it.

2) By Code - In ViewDidLoad() method you can use the following code:-

- (void) viewDidLoad

  [super viewDidLoad];
  // Do any additional setup after loading the view.
  self.scrollview.delegate = self;


In this way your ScrollView delegate method will be called. 

【讨论】:

以上是关于ScrollViewDelegate 不调用 scrollViewDidScroll 或 scrollViewWillBeginDragging的主要内容,如果未能解决你的问题,请参考以下文章

调用 sc.parallelize() 时出现 WindowsError

RPC 服务器不可用。调用 ManagementScope.Connect 时

ThinkPHP跨控制器调用方法

关于Scanner调用 sc.nextInt() 异常try后不能二次输入导致死循环问题

JQuery让框架Iframe包含的页面能够全部显示,但是一旦跳转,框架自适应的代码就不管用了,怎么做

TP框架 MODEL类和命名空间