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 设置为负高度,但它根本无法滚动。
我刚刚发现它因视图大小而停止。
【问题讨论】:
您是否有任何理由使用UIScrollView
和 SpriteKit
而不是从场景控制器中制作所有内容?
@aramusss 我正在使用UIScrollView
在SpriteKit
中移动相机。另外,我刚刚注意到滚动视图卡在的位置会根据设备大小而变化......有没有更好的方法来滚动相机?
尽管SpriteKit
和UIKit
可以一起工作,但不建议将它们混合使用很多。您应该在SKScene
中使用update:
方法来更新背景和每隔一个SKNode
,给人一种滚动的错觉。
@aramusss 我将如何跟踪玩家的触摸和滚动?我正在努力做到这一点,以便您可以用手指拖动,而不是无限滚动的背景/关卡。我只是想让相机根据滚动在场景中移动。
好的,现在我创建一个答案。
【参考方案1】:
将UIKit
和SpriteKit
混用不是一个好主意,因为它们的工作方式不同(不同的位置、不同的单位等)。
如果你想拖动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 在向下滚动并推送新的视图控制器后向上移动内容