Swift 2.0,SpriteKit - 滚动视图不使用页面。

2024-03-26

好的,我有一个滚动视图,它已被子类化,可以应用于我在这里问的上一个问题中的任何场景:

SpriteKit,Swift 2.0 - 反向滚动视图 https://stackoverflow.com/questions/34712427/spritekit-swift-2-0-scrollview-in-reverse

import Foundation
import SpriteKit

/// Nodes touched
var nodesTouched: [AnyObject] = [] // global

/// Scroll direction
enum ScrollDirection: Int {
case None = 0
case Vertical
case Horizontal
}

class CustomScrollView: UIScrollView {

// MARK: - Static Properties

/// Touches allowed
static var disabledTouches = false

/// Scroll view
private static var scrollView: UIScrollView!

// MARK: - Properties

/// Current scene
private weak var currentScene: SKScene?

/// Moveable node
private var moveableNode: SKNode?

/// Scroll direction
private var scrollDirection = ScrollDirection.None

// MARK: - Init
init(frame: CGRect, scene: SKScene, moveableNode: SKNode, scrollDirection: ScrollDirection) {
    print("Scroll View init")
    super.init(frame: frame)

    CustomScrollView.scrollView = self
    self.scrollDirection = scrollDirection
    self.currentScene = scene
    self.moveableNode = moveableNode
    self.frame = frame
    indicatorStyle = .White
    scrollEnabled = true
    //self.minimumZoomScale = 1
    //self.maximumZoomScale = 3
    canCancelContentTouches = false
    userInteractionEnabled = true
    delegate = self

    // flip for spritekit (only needed for horizontal)
    if self.scrollDirection == .Horizontal {
        let flip = CGAffineTransformMakeScale(-1,-1)
        self.transform = flip
    }
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
    }
}

 // MARK: - Touches
 extension CustomScrollView {

/// began
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    print("Touch began scroll view")

    guard !CustomScrollView.disabledTouches else { return }
    currentScene?.touchesBegan(touches, withEvent: event)
}

/// moved
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    print("Touch moved scroll view")

    guard !CustomScrollView.disabledTouches else { return }
    currentScene?.touchesMoved(touches, withEvent: event)
}

/// ended
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    print("Touch ended scroll view")

    guard !CustomScrollView.disabledTouches else { return }
    currentScene?.touchesEnded(touches, withEvent: event)
}

/// cancelled
override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
    print("Touch cancelled scroll view")

    guard !CustomScrollView.disabledTouches else { return }
    currentScene?.touchesCancelled(touches, withEvent: event)
   }
}

 // MARK: - Touch Controls
 extension CustomScrollView {

/// Disable
class func disable() {
    print("Disabled scroll view")
    CustomScrollView.scrollView?.userInteractionEnabled = false
    CustomScrollView.disabledTouches = true
}

/// Enable
class func enable() {
    print("Enabled scroll view")
    CustomScrollView.scrollView?.userInteractionEnabled = true
    CustomScrollView.disabledTouches = false
   }
 }

 // MARK: - Delegates
 extension CustomScrollView: UIScrollViewDelegate {

/// did scroll
func scrollViewDidScroll(scrollView: UIScrollView) {
    print("Scroll view did scroll")

    if scrollDirection == .Horizontal {
        moveableNode!.position.x = scrollView.contentOffset.x
    } else {
        moveableNode!.position.y = scrollView.contentOffset.y
      }
    }
 }

唯一的问题是滚动视图使用页面,而我希望它的外观方式只滚动精灵,就像 raywenderlich 那样,所有精灵都是唯一移动的东西,所以我不必滚动多个精灵页面来获取精灵。

该项目可以在这里找到:

雷文德利希项目 http://cdn2.raywenderlich.com/wp-content/uploads/2015/01/SwiftSV-21-Sprite-Kit-Level-Selector-I-demo-finished-1_0.zip

因为他们使用他们的 gameViewController,所以我很难弄清楚如何通过像上面那样的子类滚动视图来实现它。


我不明白你在这里问什么。我刚刚查看了 RayWenderlich 教程,它与我的 GitHub 示例项目完全相同。他们只是让精灵更紧密地结合在一起,在我的项目中出于演示目的,我将每个精灵放在一个新页面上。

如果您只想让精灵滚动,只需将精灵添加到 moveableNode 中,然后像往常一样直接将其余精灵添加到场景中。

addChild(background)
moveableNode.addChild(sprite1)

然后改变精灵的位置,使它们靠得更近。您基本上将第一个精灵添加到滚动视图中的第一页,然后根据前一个精灵的 x 位置定位其他精灵。您也将这些精灵添加到 sprite1 中。

let sprite1 = SKSpriteNode(color: SKColor.redColor(), size: CGSize(width: 50, height: 50))
sprite1.position = CGPointMake(0, 0)
page1ScrollView.addChild(sprite1)

let sprite2 = SKSpriteNode(color: SKColor.redColor(), size: CGSize(width: 50, height: 50))
sprite2.position = CGPointMake(sprite1.position.x + (sprite2.size.width * 1.5), sprite1.position.y)
sprite1.addChild(sprite2)

let sprite3 = SKSpriteNode(color: SKColor.redColor(), size: CGSize(width: 50, height: 50))
sprite3.position = CGPointMake(sprite2.position.x + (sprite3.size.width * 1.5), sprite1.position.y)
sprite1.addChild(sprite3)

我更新了我的 gitHub 项目来展示它的实际效果https://github.com/crashoverride777/Swift2-SpriteKit-UIScrollView-Helper https://github.com/crashoverride777/Swift2-SpriteKit-UIScrollView-Helper

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 2.0,SpriteKit - 滚动视图不使用页面。 的相关文章

随机推荐

  • HTML:阻止子元素继承父元素的 [title] 属性

    问题是 当我为 wrapper 元素声明标题属性时 当光标落入 content 元素内时 也会显示工具提示 如何防止这种情况 继承 发生 div title example div div div 我只想显示工具提示between cont
  • 如何使用 gradle 任务解析 .json 文件并从中获取 json 数据?

    有没有一种方法可以在 gradle 任务的帮助下解析 xyz json 文件并获取其中的所有单独的 json 数据 例如 我想解析存储在我的资产文件夹中的 xyz json 文件中的数据并获取其中的所有值 例如 获取 类型 的值 type
  • 在CSS中创建凹角[重复]

    这个问题在这里已经有答案了 是否可以在CSS中创建这样的凹角 如果是 你会怎么做 莉亚 维鲁有一个如何执行此操作的描述 http lea verou me 2011 03 beveled corners negative border ra
  • 使用 jQuery getJSON 时 JSON Feed 返回 null

    http portlandonline com shared cfm json cfm c 27321 http portlandonline com shared cfm json cfm c 27321 它返回 null 我真的无权接触
  • 匿名委托中捕获的私有字段

    class A public event EventHandler AEvent class B private A foo private int bar public void AttachToAEvent foo AEvent del
  • 数据工厂子项修改或创建日期

    我有一个数据工厂 V2 管道 由 获取元数据 和 forEach 活动组成 用于读取文件共享 本地 上的文件列表并将其记录在数据库表中 目前 我只能读取文件名 但还想检索每个文件的修改日期和 或创建日期属性 有什么帮助吗 谢谢 Accord
  • 使用SQL计算时间序列中的时间间隔

    我有一个像这样的 MySQL 表 CREATE TABLE IF NOT EXISTS vals DT datetime NOT NULL value INT 11 NOT NULL PRIMARY KEY DT DT 是唯一的日期和时间
  • iOS 自定义字体已移位

    对于一个项目我买了一个OTF字体并将其包含到我的项目中 添加到 plist 文件等 它有效 我可以在按钮上设置字体 但标签会被替换 我添加了屏幕截图 以便您可以看到我的问题 有人知道问题出在哪里吗 系统 iPad 3 iOS 6 0 bet
  • 有什么办法可以提取底层Xaml吗?

    无论如何 是否可以从控件中提取底层 xaml IE 我有一个名为 fooBox 的文本框 我可以在运行时从文本框获取代表文本框的 xaml 吗 这向您展示了完整的生命周期 从控件到 XAML 再到控件 如你看到的 string s Xaml
  • 有保证的方法可以在运行时获取成员字段的源顺序吗?

    我正在寻找一种按源顺序检索 在运行时 类的字段的方法 以便我可以执行自己的 初始化处理 该处理基于声明的顺序 我知道 Javadoc 用于Class getDeclaredFields 明确指出不保证订单 SO 上的一些答案指向Javass
  • iOS7中选择单元格时UITableView分隔线消失

    在我的 tableView 中 我在单元格之间设置了分隔线 我允许选择多个单元格 这是我设置选定单元格背景颜色的代码 UIView cellBackgroundColorView UIView alloc initWithFrame cel
  • 如何从没有 jenkinsfile 的存储库触发 Jenkins 管道构建?

    我有一个不包含詹金斯文件 https jenkins io doc book pipeline jenkinsfile 而且我无法影响存储库本身 这意味着我既不能向存储库添加也不能更改任何文件 在本例中 它是Qt repo http cod
  • ArrayAdapter 中 textview 的自定义字体

    我正在尝试更改 a 的字体TextView in my ArrayAdapter 字体chantelli antiqua ttf位于资产文件夹中 这是我的 Java 代码 listItemAdapter new ArrayAdapter
  • 按字母顺序对数组进行排序

    我有一个数组 我需要按出现次数对其元素进行排序 然后按字母顺序排序 例如 55 The 32 ASomething 32 BSomething ASomething should come before Bsomething because
  • 在iOS中以编程方式生成ppt

    为了生成 PDF 文件 我们可以使用 Core Graphics 同样 是否有任何框架 类可用于通过代码生成 ppt 幻灯片演示 文件 或者是否有任何第三方框架用于此目的 没有内置的 Apple API 我也从未听说过有这样的第三方框架
  • 将 sybase 中现有的 int 列更改为标识

    赛贝斯12 5 我有一个正在生产中的现有表 需要更改它的 PK int 列 以便自动填充 创建表时 理想情况下将 ID 列创建为标识 此 ID 列是多个其他表中的外键 因此不能删除该表并重新开始 问题是 我无法将 PK 设置为 IDENTI
  • 如何使面板内的鼠标拖动从窗口移开?

    我想启用这个 System Windows Forms Panel 以便如果用户单击并拖动鼠标 则将窗口拖动到周围 我可以这样做吗 我必须实施多个事件吗 最适合我的解决方案是使用非托管代码 与 HatSoft 发布的答案不同 它可以为您提供
  • MySQL:如何实现行级事务锁定而不是表锁定

    这是用例 我有一张桌子 上面有一堆可用或不可用的唯一代码 作为事务的一部分 我想选择表中可用的代码 然后在事务中更新该行 由于这种情况可能会同时在许多会话中同时发生 因此我希望理想地选择一个随机记录并在表上使用行级锁定 以便其他事务不会被从
  • 将美国州名映射到字典中分别给出的两个字母首字母缩略词

    假设现在我有一个dataframe有 2 列 州和城市 然后我有一个单独的dict每个州的两个字母的缩写 现在我想添加第三列来映射州名称及其两个字母的缩写 我应该在 Python Pandas 中做什么 例如示例问题如下 import pa
  • Swift 2.0,SpriteKit - 滚动视图不使用页面。

    好的 我有一个滚动视图 它已被子类化 可以应用于我在这里问的上一个问题中的任何场景 SpriteKit Swift 2 0 反向滚动视图 https stackoverflow com questions 34712427 spriteki