Swift 斯威夫特:“我的名字叫什么?”;冻结“;在滚动视图中反弹

Swift 斯威夫特:“我的名字叫什么?”;冻结“;在滚动视图中反弹,swift,uiscrollview,Swift,Uiscrollview,我正在尝试使用ScrollView。因此,我的控制器上有一个启用了弹跳的滚动视图。所以现在我滚动视图,在页面的末尾反弹,就像我想的那样 但现在我想冻结我的弹跳。我试着再解释一下: 我在滚动视图中向上滚动。这一页的结尾开始了。所以现在弹跳开始了,它向上滚动了一点。然后我解开卷轴视图,视图会反弹回来。但我希望scrollView保持在这个位置(因为我将视图推开,当它在我推动时反弹时,它看起来很奇怪) 我尝试过的事情: 1.将滚动视图上的帧设置为当前弹跳位置。这只是编辑帧,但仍会反弹滚动视图 v2.v

我正在尝试使用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.拍摄当前scrollview的照片,并将其显示在scrollview的屏幕上。这会延迟拍摄图像,而不是在正确的时刻拍摄(因此反弹在一半,然后拍摄或已经拍摄)

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

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

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")
}
private var dismissTriggerd=false
重写func observeValue(forKeyPath keyPath:String?,对象的类别:Any?,更改:[NSKeyValueChangeKey:Any]?,上下文:UnasFemeutableRawPointer?){
如果keyPath==“contentOffset”{
如果scrollView.contentOffset.y<-70&&dismissTriggerd==false{
scrollViewTop.constant=scrollView.contentOffset.y*-1
scrollView.IsCrollenabled=false
dismissTriggerd=true
驳回(动画:真)
}
}
}
脱硝{
scrollView.removeObserver(self,forKeyPath:“contentOffset”)
}

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