我正在使用a UIPageViewController,我需要在用户滑动时获取ViewController的滚动位置,这样我可以在视图转换到下一个视图时部分淡化某些资源UIViewController.
委托和数据源方法UIPageViewController似乎没有提供对此的任何访问,并在内部我假设UIPageViewController必须在某处使用滚动视图,但它似乎没有直接子类化它所以我不能呼叫
func scrollViewDidScroll(scrollView: UIScrollView) {
}
我已经看到一些其他帖子建议获取引用pageViewController!.view.subviews然后第一个索引是一个scrollView,但这似乎非常 hacky.我想知道是否有更标准的方法来处理这个问题.
Chr*_*örz 38
您可以在自己的内部搜索UIScrollView UIPageViewController.要做到这一点,你必须实现UIScrollViewDelegate.
之后你可以得到你的scrollView:
for v in pageViewController.view.subviews{
    if v.isKindOfClass(UIScrollView){
        (v as UIScrollView).delegate = self
    }
}
之后,您可以使用所有UIScrollViewDelegate方法,因此您可以覆盖scrollViewDidScroll可以获取scrollPosition的方法:
func scrollViewDidScroll(scrollView: UIScrollView) {
   //your Code
}
或者如果你想要一个单行:
let scrollView = view.subviews.filter { $0 is UIScrollView }.first as! UIScrollView
scrollView.delegate = self
类似于Christian的答案,但有点像Swift一样(并且没有不必要地继续遍历view.subviews):
for view in self.view.subviews {
    if let view = view as? UIScrollView {
        view.delegate = self
        break
    }
}
UIPageViewController滚动不能像普通的scrollview一样工作,并且您不能像其他scrollViews一样获得scrollView.contentOffset。
因此,这里有个技巧,可让用户了解滚动时发生的情况:
首先,您必须找到scrollview并将委托设置为当前的viewController,就像其他答案所说的那样。
class YourViewController : UIPageViewController {
    var startOffset = CGFloat(0) //define this
    override func viewDidLoad() {
         super.viewDidLoad()
         //from other answers   
         for v in view.subviews{
             if v is UIScrollView {
                 (v as! UIScrollView).delegate = self
             }
         }
     }
    .
    .
    .
}
extension YourViewController : UIScrollViewDelegate{
    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        startOffset = scrollView.contentOffset.x
    }
    public func scrollViewDidScroll(_ scrollView: UIScrollView) {
        var direction = 0 //scroll stopped
        if startOffset < scrollView.contentOffset.x {
            direction = 1 //going right
        }else if startOffset > scrollView.contentOffset.x {
            direction = -1 //going left
        }
        let positionFromStartOfCurrentPage = abs(startOffset - scrollView.contentOffset.x)
        let percent = positionFromStartOfCurrentPage /  self.view.frame.width
        //you can decide what to do with scroll
    }
}
| 归档时间: | 
 | 
| 查看次数: | 13611 次 | 
| 最近记录: |