使用动画完成处理程序的 UIScrollView 分页

UIScrollView Paging with Animation Completion Handler

我有一个带有按钮的 UIScrollview,我用它来左右翻页:

@IBAction func leftPressed(sender: AnyObject) {

    self.scrollView!.setContentOffset(CGPointMake(0, 0), animated: true)
} 

我想在滚动视图完成分页动画后执行一个动作。类似于:

@IBAction func leftPressed(sender: AnyObject) {

    self.scrollView!.setContentOffset(CGPointMake(0, 0), animated: true)

    secondFunction()
}

上面的代码不起作用,因为第二个函数在滚动视图完成动画偏移量之前运行。我最初的反应是使用完成处理程序,但我不确定如何将完成处理程序应用于 setContentOffset 函数。我试过:

func animatePaging(completion: () -> Void) {

    self.mainScrollView!.setContentOffset(CGPointMake(0, 0), animated: true)

    completion()
}

随叫随到

animatePaging(completion: self.secondFunction())

但我收到错误消息“无法使用类型为‘(completion())’的参数列表调用 'animatePaging'。有什么想法吗?

问题是您需要滚动动画本身的完成处理程序。但是 setContentOffset(_:animated:) 没有完成处理程序。

一个解决方案是您自己使用 UIView 的静态函数 animateWithDuration(_:animations:completion:) 为滚动设置动画。该函数有一个完成处理程序,您可以使用:

UIView.animateWithDuration(0.5, animations: { () -> Void in
        self.scrollView.contentOffset = CGPointMake(0, 0)
    }) { (finished) -> Void in
        self.secondFunction()
    }

从乔恩的回答更新 - Swift 4.2

UIView.animate(withDuration: 0.5, animations: { [unowned self] in
   self.scrollView.contentOffset = .zero
}) { [unowned self] _ in
   self.secondFunction()
}