UIScrollView 不会一直向上/向下滚动

Posted

技术标签:

【中文标题】UIScrollView 不会一直向上/向下滚动【英文标题】:UIScrollView Not Scrolling All The Way Up/Down 【发布时间】:2015-07-31 05:42:20 【问题描述】:

我目前正在使用SpriteKit + UIScrollView + SKCameraNode 来创建一个滚动游戏。我目前正在尝试在垂直方向上反转UIScrollView 的方向,因为滚动视图似乎从直观的角度向后移动。

对此我的解决方案是将contentOffset 从滚动视图的开头放置到最大高度,并将相机的位置设置为另一个方向的 y 位置。

但是,当滚动到 (0, 0) 时,滚动在 (0, 320) 处停止。

这是滚动视图的代码:

let contentSize = CGSize(width: 1575, height: 760) //adjust depending on level
self.height = contentSize.height
scrollView.contentSize = contentSize
scrollView.contentOffset = CGPointMake(0, contentSize.height / 2)

这是滚动视图滚动时的代码:

    let contentOffset = CGPointMake(scrollView.contentOffset.x, self.height - scrollView.contentOffset.y)
    self.gScene.setContentOffset(contentOffset)

这里是设置内容偏移的代码:

self.camera!.position = CGPointMake(ogPos.x + contentOffset.x, ogPos.y + contentOffset.y)

所以相机现在可以正常工作并朝正确的方向滚动;但是,滚动的内容偏移量无缘无故地停留在 (0, 320) 处,并且它拒绝进一步向下滚动。如果您有任何想法,我很想听听他们的意见!谢谢!

编辑:我也尝试将 UIScrollView 的 contentSize 设置为负高度,但它根本无法滚动。

我刚刚发现它因视图大小而停止。

【问题讨论】:

您是否有任何理由使用 UIScrollViewSpriteKit 而不是从场景控制器中制作所有内容? @aramusss 我正在使用UIScrollViewSpriteKit 中移动相机。另外,我刚刚注意到滚动视图卡在的位置会根据设备大小而变化......有没有更好的方法来滚动相机? 尽管SpriteKitUIKit 可以一起工作,但不建议将它们混合使用很多。您应该在SKScene 中使用update: 方法来更新背景和每隔一个SKNode,给人一种滚动的错觉。 @aramusss 我将如何跟踪玩家的触摸和滚动?我正在努力做到这一点,以便您可以用手指拖动,而不是无限滚动的背景/关卡。我只是想让相机根据滚动在场景中移动。 好的,现在我创建一个答案。 【参考方案1】:

UIKitSpriteKit 混用不是一个好主意,因为它们的工作方式不同(不同的位置、不同的单位等)。

如果你想拖动MainScene,你可以这样做:

在我们的MainScene 我们创建:

let background:SKSpriteNode = SKSpriteNode(imageNamed: "background")
var lastTouch : CGPoint?

我们将为我们的场景添加背景,并将每个SKNode 作为该背景的子节点(平台、播放器或您想要显示的任何内容)。

然后,在touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) 中,我们希望获得用户触摸并根据用户触摸移动移动此背景。一个基本的实现是:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) 
    /* Called when a touch begins */
    var touch : UITouch = touches.first as! UITouch
    lastTouch = touch .locationInNode(self)


override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) 
    /* Called when a touch moves */
    var touch : UITouch = touches.first as! UITouch
    var touchLocation : CGPoint = touch .locationInNode(self)

    //We uptade the background position
    background.position = CGPointMake(background.position.x + (touchLocation.x - lastTouch!.x), background.position.y + (touchLocation.y - lastTouch!.y))

    //We update the lastTouch
    lastTouch = touchLocation;

如果您想自动移动MainScene,您应该在update: 方法中移动background

【讨论】:

我使用精灵套件的事实不应该改变UIScrollView不会一直滚动到顶部的事实......我也使用滚动视图的目的缩放,而不仅仅是滚动。 这只是一种不好的做法,它不仅会带您解决这些问题,还会带您在未来解决更多问题。如果要放大,设置background.scale属性:D 是的,但我还必须使用某种手势识别器。我不确定你真正指的是什么问题...... 问题是UIKit 准备用于“普通”ios 应用程序,SpriteKit 准备用于游戏。 UIKit 更倾向于定制化,并且会导致代码更糟糕或难以维护。使用 SpriteKit,您将不得不编写更多代码,并且可能会重复 UIKit 功能,但是当您想要添加更多图形功能时,您将始终敞开大门,而无需使用丑陋的变通方法。 好吧,不管我仍然想知道UIScrollView滚动不够远的问题的解决方法......即使它不适用于这个SpriteKit项目,在未来我想知道为什么这不起作用,因为我会为非 SpriteKit 项目使用几乎相同的代码。【参考方案2】:

我发现它因视图框架的大小而停止。我通过简单地添加视图框架大小的插图解决了这个问题,因此它走得更远。

【讨论】:

以上是关于UIScrollView 不会一直向上/向下滚动的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollview 在向下滚动并推送新的视图控制器后向上移动内容

如何使用 uiscrollview 向上滚动?

UISwipeGestureRecognizer 和 UIScrollView

UIScrollView 不向下滚动

UIScrollView 应该只向下滚动

UIScrollView 像 pageControl 一样向上滚动显示