Swift:“冻结”在scrollView

时间:2017-03-20 09:51:09

标签: swift uiscrollview

我正在尝试使用scrollViews。所以我的控制器上有一个ScrollView,启用了弹跳功能。所以现在我就像我想的那样滚动页面末尾的视图反弹。

但现在我要冻结我的弹跳。我试着多解释一下:

我在ScrollView中向上滚动。页面的末尾开始。所以现在弹跳开始并且滚动一点点。然后我解开滚动视图,视图反弹回来。但我希望scrollView保持在这个位置(因为我将视图推开,当我推动它时它看起来很奇怪。)

我尝试的事情:

1.将滚动视图上的框架设置为当前的弹跳位置。这只是编辑帧但仍然反弹scrollView。

v2.view.frame = CGRect(x: CGFloat(0), y: CGFloat(CURRENTBOUNCING), width: width, height: height)

2.关闭弹跳。这只会结束当前的弹跳,并且在你不能再弹跳之后。因此,如果我不希望它反弹,这不起作用。

scrollView.bounces = false

3.手动设置contentOffset。即使我在初始化后写了

,也不会改变任何内容
scrollView.contentOffset.y -= 100 // Or something like this

4.更改contentSize。由于约束

,这没有任何改变
scrollView.contentSize = CGSize(width: self.view.frame.width, height: self.view.frame.height - 200)

5.转动时始终垂直弹起。和2一样。

scrollView.alwaysBounceVertical = false

6.Paging。我试过这个,因为现在我手动页面。但后来我错过了在分页之前反弹的事情。通过分页,您可以在末尾滚动时看到下一页。但拖动后应加载下一页。

希望有人可以帮助我:)。

修改

7.拍摄当前滚动视图的图片,在滚动视图上显示在我的屏幕上。这会使图像延迟而不是在正确的时刻(因此反弹是在拍摄或已经拍摄的一半时。

let renderer = UIGraphicsImageRenderer(size: scrollView.bounds.size)
pufferImage.image = renderer.image { ctx in
        scrollView.drawHierarchy(in: scrollView.bounds, afterScreenUpdates: true) }

2 个答案:

答案 0 :(得分:0)

遇到同样的问题。解决方法是记录内容偏移并将滚动视图的垂直偏移更改为该值,同时关闭滚动。

private var dismissTriggerd = false
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if keyPath == "contentOffset" {

        if scrollView.contentOffset.y < -70 && dismissTriggerd == false {
            scrollViewTop.constant = scrollView.contentOffset.y * -1
            scrollView.isScrollEnabled = false
            dismissTriggerd = true
            dismiss(animated: true)
        }
    }
}


deinit {
    scrollView.removeObserver(self, forKeyPath: "contentOffset")
}

答案 1 :(得分:0)

我有一个类似的用例,关键是将contentOffset切换为contentInset,这消除了反弹的效果

可能不是100%完整的解决方案,但我将其留在此处以寻求启发

case UIGestureRecognizerStateEnded:
    self.interactor.hasStarted = NO;
    if (self.interactor.shouldFinish) {
        UIEdgeInsets ei = self.scrollView.contentInset;
        ei.top -= self.scrollView.contentOffset.y;
        self.scrollView.contentInset = ei;
        [self.interactor finishInteractiveTransition];
    } else {
        [self.interactor cancelInteractiveTransition];
    }
    break;
default: