斯威夫特:“冻结”在滚动视图中弹跳

Posted

技术标签:

【中文标题】斯威夫特:“冻结”在滚动视图中弹跳【英文标题】:Swift: "Freeze" bouncing in a scrollView 【发布时间】:2017-03-20 09:51:09 【问题描述】:

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

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

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

我尝试过的事情:

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

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.更改内容大小。由于限制,这不会改变我的想法

scrollView.contentSize = CGSize(width: self.view.frame.width, height: self.view.frame.height - 200)

5.关闭始终垂直弹跳。和 2 一样。

scrollView.alwaysBounceVertical = false

6.分页。我试过这个,因为现在我手动分页。但后来我错过了分页前的弹跳。通过分页,您可以在滚动到末尾时看到下一页。但是拖拽后应该会加载下一页。

希望有人可以帮助我:)

编辑

7. 为我当前的滚动视图拍照以将其显示在滚动视图上方的屏幕上。这会延迟而不是在正确的时刻拍摄图像(因此反弹是在一半然后捕获或已经完成。

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

【问题讨论】:

【参考方案1】:

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

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")

【讨论】:

【参考方案2】:

我有一个类似的用例,关键是将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:

【讨论】:

以上是关于斯威夫特:“冻结”在滚动视图中弹跳的主要内容,如果未能解决你的问题,请参考以下文章

由于弹跳而无法获得正确的滚动视图方向

滚动视图问题斯威夫特

调整keyboardWillBeShown/keyboardWillBeHidden的内容时如何防止滚动视图弹跳

在kivy中禁用弹跳滚动效果

斯威夫特:明确表视图是可滚动的

设置行数后集合视图水平滚动? ios 斯威夫特