在菜单按钮之前和之间留出等宽的间隙

2023-12-25

我使用下面的代码创建了一个滚动菜单。我试图在每个菜单精灵按钮之间创建相等的行间隙(宽度间距)。目前,我已经能够在左右两端留出等宽间距,但不能在精灵按钮之间留出等宽间距。请参阅下面的相关代码:

class LevelScene: SKScene {

let levelButtonSize = SKSpriteNode(imageNamed: "b1").size
let levelButton1: SKSpriteNode = SKSpriteNode(imageNamed: "b1")

let levelButton2: SKSpriteNode = SKSpriteNode(imageNamed: "b2")
let levelButton3: SKSpriteNode = SKSpriteNode(imageNamed: "b3")
let levelButton4: SKSpriteNode = SKSpriteNode(imageNamed: "b4")
let levelButton5: SKSpriteNode = SKSpriteNode(imageNamed: "b5")
let levelButton6: SKSpriteNode = SKSpriteNode(imageNamed: "b6")
let levelButton7: SKSpriteNode = SKSpriteNode(imageNamed: "b7")
let levelButton8: SKSpriteNode = SKSpriteNode(imageNamed: "b8")

let levelButton9: SKSpriteNode = SKSpriteNode(imageNamed: "b9")
let levelButton10: SKSpriteNode = SKSpriteNode(imageNamed: "b10")
let levelButton11: SKSpriteNode = SKSpriteNode(imageNamed: "b11")
let levelButton12: SKSpriteNode = SKSpriteNode(imageNamed: "b12")

let levelButton13: SKSpriteNode = SKSpriteNode(imageNamed: "b13")
let levelButton14: SKSpriteNode = SKSpriteNode(imageNamed: "b14")
let levelButton15: SKSpriteNode = SKSpriteNode(imageNamed: "b15")
let levelButton16: SKSpriteNode = SKSpriteNode(imageNamed: "b16")
let levelButton17: SKSpriteNode = SKSpriteNode(imageNamed: "b17")
let levelButton18: SKSpriteNode = SKSpriteNode(imageNamed: "b18")


private var scrollCell = SKSpriteNode()

private var moveAmtX: CGFloat = 0
private var moveAmtY: CGFloat = 0
private let minimum_detect_distance: CGFloat = 30
private var initialPosition: CGPoint = CGPoint.zero
private var initialTouch: CGPoint = CGPoint.zero
private var resettingSlider = false

override init(size: CGSize){
  super.init(size: size)

     createMenu()
}

func createMenu() {

    let buttons = [levelButton1, levelButton2, levelButton3, levelButton4, levelButton5, levelButton6, levelButton7, levelButton8, levelButton9, levelButton10, levelButton11, levelButton12, levelButton13, levelButton14, levelButton15, levelButton16, levelButton17, levelButton18]

    for i in 1..<buttons.count  {
        buttons[i-1].name = "level\(i)"
    }

    let padding: CGFloat = 50
    let numberOfRows = CGFloat(buttons.count / 3)

    scrollCell = SKSpriteNode(color: .blue, size: CGSize(width: self.size.width, height: levelButtonSize.height * numberOfRows + padding * numberOfRows))
    scrollCell.position = CGPoint(x: 0 - self.size.width / 2, y: 0 - (scrollCell.size.height - self.size.height / 2))
    scrollCell.anchorPoint = CGPoint.zero
    scrollCell.zPosition = 0
    self.addChild(scrollCell)

    //        let backgroundImage = SKSpriteNode(imageNamed: "bg")
    //        backgroundImage.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
    //        self.addChild(backgroundImage)

    let totalMarginX = self.frame.width - 3*levelButtonSize.width
    let marginX = totalMarginX/4

    let column1PosX = marginX + levelButtonSize.width/2
    let column2PosX = 2*marginX + 3*levelButtonSize.width/2
    let column3PosX = 3*marginX + 5*levelButtonSize.width/2

    print("levelButtonSize.width is \(levelButtonSize.width)")
    print("self.frame.width is \(self.frame.width)")
    print("marginX is \(marginX)")
    print("column1PosX is \(column1PosX)")
    print("column2PosX is \(column2PosX)")
    print("column3PosX is \(column3PosX)")

    var colCount = 0
    var rowCount = 0

    for button in buttons {

        var posX: CGFloat = column2PosX
        if colCount == 0 {
            posX =  column1PosX
        }
        if colCount == 1 {
            posX =  column2PosX
        }

        else if colCount == 2 {
            posX =  column3PosX
            colCount = -1
        }


        let indexOffset = CGFloat(rowCount) * (levelButtonSize.height + padding)
        let posY = scrollCell.size.height - levelButtonSize.height / 2 - (indexOffset + padding / 2)
        button.position = CGPoint(x: posX, y: posY)
        //button.setScale(0.5)
        button.zPosition = 10
        scrollCell.addChild(button)

        if colCount == -1 {
            rowCount += 1
        }
        colCount += 1
    }
}


override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    if let touch = touches.first as UITouch! {

        self.scrollCell.removeAllActions()
        initialTouch = touch.location(in: self.scene!.view)
        moveAmtY = 0
        initialPosition = self.scrollCell.position
    }
}


override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

    if let touch = touches.first as UITouch! {

        let movingPoint: CGPoint = touch.location(in: self.scene!.view)

        moveAmtX = movingPoint.x - initialTouch.x

        let topPos: CGFloat = scrollCell.size.height - self.size.height / 2
        let bottomPos = 0 - (self.size.height / 2)

        if (initialPosition.y - (movingPoint.y - initialTouch.y)) < -topPos {
            print("stop on top")
            moveAmtY = 0
            scrollCell.position.y = -topPos
        }
        else if (initialPosition.y - (movingPoint.y - initialTouch.y)) > bottomPos {
            print("stop on bottom")
            moveAmtY = 0
            scrollCell.position.y = bottomPos

        }
        else {
            moveAmtY = movingPoint.y - initialTouch.y
            scrollCell.position = CGPoint(x: initialPosition.x, y: initialPosition.y - moveAmtY)
        }
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
}

func checkForResettingSlider() {

    let topPos: CGFloat = scrollCell.size.height - self.size.height / 2
    let bottomPos = 0 - (self.size.height / 2)

    if scrollCell.position.y > bottomPos {

        let move = SKAction.moveTo(y: bottomPos, duration: 0.3)
        move.timingMode = .easeOut
        scrollCell.run(move)
    }

    if scrollCell.position.y < -topPos {

        let move = SKAction.moveTo(y: -topPos, duration: 0.3)
        move.timingMode = .easeOut
        scrollCell.run(move)
    }
}

func yMoveActions(moveTo: CGFloat) {

    let move = SKAction.moveBy(x: 0, y: (moveTo * 1.5), duration: 0.3)
    move.timingMode = .easeOut

    self.scrollCell.run(move, completion: { self.checkForResettingSlider() })
}

请注意,我按以下方式设置场景:

 let levelScene = LevelScene(size: CGSize(width:480, height:640))
 levelScene.anchorPoint = CGPoint(x: 0.5, y: 0.5)
 levelScene.scaleMode = .aspectFill
 skView?.presentScene(levelScene)

EDIT

下图显示了我的关卡菜单的一部分,与侧面相比,关卡按钮之间的空间更大。我希望按钮之间以及侧面的间隙宽度相同。


我会建议:

let scaledWidth = levelButtonSize.width/2;
let totalMarginX = self.frame.width - 3*scaledWidth 
let marginX = totalMarginX/4 

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

在菜单按钮之前和之间留出等宽的间隙 的相关文章

  • 检查 switch 语句中的可用性

    if a Enum输入添加新的case在新的操作系统版本中 如何检查可用性switch陈述 像一个Enum in StoreKit below public enum Code Int public typealias ErrorType
  • 使用 Swift 导入 aurioTouch 库

    我正在尝试将 Objective C 应用程序转换为 swift 我想导入课程奥里奥触摸 https developer apple com library ios samplecode aurioTouch Introduction In
  • 如何防止在 macOS 中打开同一窗口的多个实例?

    我正在制作一个 Mac 菜单栏应用程序 它有一个Preferences选项 当用户点击它时 会出现一个Preferences将打开窗口 显示应用程序的所有设置 我打开Preferences窗口如 let storyboard NSStory
  • RealityKit – 如何为自然光创建阴影捕捉器?

    我想创建一架飞机 func getShadowPlane width Float height Float gt ModelEntity let sphereResource MeshResource generatePlane width
  • SpriteKit 的相机抖动效果

    有谁知道一些开箱即用的库可能会提供相机抖动等效果SKNode 如果没有 是否有一种简单的方法可以使用动作来实现相机抖动 Thanks 我发现了一种使用 SKAction 的优雅方法 可以摇动你的节点 例如 水平摇动 void shake N
  • 二元运算符“&=”不能应用于 Swift 中的两个“Bool”操作数

    我正在尝试进行多次检查 将结果累积在Bool 我的代码是 var validParams login characters count gt 4 validParams password characters count gt 6 vali
  • 获取 iOS Swift 中 UIViewController 的所有列表

    有没有办法获取 iOS Swift 项目中的所有 UIViewController 我想获取所有 UIViewController 的数组并检查特定的 UIViewController 是否存在 我必须找到项目中是否存在特定的 UIView
  • 使用 Codable 将字符串编码/解码为整数,并在其间使用函数

    我有这个 json 字符串 let json name Wendy Carlos hexA 7AE147AF hexB 851EB851 let data Data json utf8 我想使用 Codable 对该结构进行编码 或返回 s
  • 免费套餐于今天 11 月 28 日结束,Heroku 网站于今天删除 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我的 Heroku 网站已被删除 因为我没有切换到付费计划 我刚刚切换到 Eco Dyno 我的网站会自动恢复还是需要重建 注意 使用 He
  • 无效的 Swift 支持 - 文件位置不正确

    我一直在尝试将新版本上传到 iTunes Connect 来更新应用程序 我第一次使用 xCode 6 但收到了一封来自 Apple 的电子邮件 内容如下 亲爱的开发者 我们发现您最近交付的 应用程序 存在一个或多个问题 要处理您的交货 必
  • Swift 3 中的 _ArrayType 去了哪里?

    我有一些用于中继的代码 ArrayType在 Swift 3 之前 我试图了解公共协议发生了什么 ArrayType 任何想法 ArrayType被重命名 ArrayProtocol 您可以在ArrayType swift https gi
  • 将 3D 对象添加到 ARGeoAnchor

    如果这个问题不太好 请原谅我 我在 Apple 的 ARGeoAnchor 文档中遇到了一些障碍 目前 ARGeoAnchor 仅在 AR 场景视图中显示一个蓝点 我正在尝试显示任何 3D 渲染或对象 My code let coordin
  • 转换任何对象?到字符串

    我有一个返回 AnyObject 的函数 func aFunction param String gt AnyObject 如何将其转换为字符串 和字符串 尝试这个 if let result aFunction test as Strin
  • Swift 1.2 和 Swift 2.0 中的字符串长度[重复]

    这个问题在这里已经有答案了 在以前版本的 Swift 中 我有以下代码 func myfunc mystr String if mystr utf16Count gt 3 使用最新版本的 Swift 1 2 我现在收到以下错误 utf16C
  • 为什么数组不符合 Equatable,而它的项在 Swift 中是 Equatable?

    UPDATE 从 Xcode 9 3 开始 包括斯威夫特 4 1 数组相等按预期工作 并且原始问题中的代码编译没有错误 然而 请查看已接受的答案 因为它提供了更好 更现代的解决方案 原问题如下 当我尝试声明类型为泛型枚举的实例时 Post
  • 变量 p 在初始化之前通过引用传递

    我有一个 Human 类 它的函数可以接受任意数量的人 并确定某人是否比这些人中的任何人年长 然后返回一个包含他 她比其年长的人的数组 func isOlderThan people Human gt Human var p Human f
  • iPad 的自适应布局

    我正在关注这篇文章在 ios 中构建自适应布局为 iOS 8 构建自适应用户界面 http www sitepoint com building adaptive user interfaces ios 8 它在 iPhone 上运行良好
  • 在 Swift 3 中打印

    我想知道这两种在 Swift 中打印对象的方法有什么不同 结果看起来是一样的 var myName String yohoo print My name is myName print My name is myName 功能上几乎没有区别
  • 检查是否安装了 Google 地图 - iOS 10.2.1

    我刚刚将手机升级到 iOS 10 2 1 在我的 Swift 应用程序 使用 3 0 中 我试图检查手机上是否安装了 Google 地图 如果是 请在 Google 地图中打开该地址 UIApplication shared canOpen
  • 在 UIScrollView Swift 中禁用垂直滚动

    不要将此问题标记为重复 我读了很多问题 但没有找到问题的答案 我的问题如下 我有一个UIScrollView它应该只水平滚动 这里它垂直滚动 20px 奇怪的事实 它似乎与状态栏的高度相同 我尝试打印内容大小 y 偏移量和高度UIScrol

随机推荐

  • 如何访问 sapUI5 聚合绑定中的迭代索引?

    在 sapUI5 中我有一个 JSONModel 包含 element1 columnName col1 values name value 1 1 selected true name value 1 2 selected true na
  • 将 Mongoose 对象保存到两个集合中

    目前我有一个节点应用程序 它使用 mongoose 将对象保存到 MongoDB 中 我正在使用与此类似的模型 var mongoose require mongoose Schema mongoose Schema var Registr
  • IOS 双击单元格导致 UITableView 中的项目不会滚动

    我有一个UITableView其中包含UITextField在每个细胞中当我点击UITextField在单元格中 键盘将显示并覆盖我的单元格 因此 我通过使用将单元格移动到顶部 void keyboardWasShown NSNotific
  • 导出 cytoscape.js 中选定的节点和边

    有没有一种方法可以从图形中导出选定的节点和边并在另一个图形中显示选定的节点和边 maxkfranz说我们可以导出为json 你知道我该怎么做吗 谢谢 您是否尝试过以下内容 cy selected json 编辑 API 现在还允许使用多个元
  • Typescript“无法编译”错误作为警告

    我创建了一个应用程序npx create react app my app typescript我想配置它 以便我的应用程序仍然可以编译 尽管打字稿错误 以便我可以在准备好时返回它们 我没有看到任何compilerOptions为了这 是否
  • 日光浴室用户弃用警告

    自从我在项目中使用 Solarium 以来 我收到了此警告 你知道我该如何解决吗 User Deprecated Not passing an instance of AdapterInterface as the first constr
  • Android 使用 setNumStars 在执行过程中更改星星使收视率变得奇怪

    我正在使用 rb setNumStars int 将星星从给定的默认值 例如 5 更改为具有应用程序首选项的新值 例如 4 代码执行正常 刷新片段后 我可以看到星星数量更改为我设置的任何整数 条形图的 StepSize 为 1 问题是 当我
  • 是否可以从移动设备获取唯一的识别码?

    我目前正在开发移动设备 Web 应用程序 我想知道每个设备是否有某种可以通过浏览器检测到的唯一 ID 号 目的是存储这个号码 以便识别已经访问过该网站的人 我经常使用蓝牙 当您检测到设备时 您可以存储某种 MAC 地址 我将其用作 ID 号
  • 仅对象属性更改时如何触发重组 Jetpack-Android

    想象一下下面的物体 data class CourseState val key Int 0 val name String val courses Courses Courses 实现以下模式 private val courseStat
  • 是否可以从 Sonatype Nexus Repository Manager 3.x 中的本地文件夹部署工件

    I use Sonatype Nexus 存储库管理器 3 5 2并想添加文物 to Nexus Blob 商店从本地文件夹 联系所在的位置 我在 Nexus 文档中找不到解决方案 并尝试在网络中找到 不成功 是否可能以及如何做到这一点 也
  • 在 PowerShell 中获取伟大的祖父文件夹路径(向上三级)?

    有没有一种优雅的方法可以从文件夹路径获取 曾祖父母文件夹 三层 我只是想得到C folderA folderB从完整的路径来看 但这两种解决方案对我来说都显得丑陋 path C folderA folderB folderC FolderD
  • Android Studio Bumblebee 频繁崩溃

    我想知道是否有其他人遇到过这个问题并找到了解决方法 Android Studio Bumblebee 随机且频繁地崩溃 没有模式 当我做某事 例如 编辑代码 或有时什么都不做时 它会崩溃 当我启动 AS 或使用它一段时间后 它可能会崩溃 它
  • 检查多维输入数组中的值

    我将值存储在多维隐藏输入数组中 如下所示
  • 为什么 git rebase 的合并冲突通常比合并少?

    我经常听到有人说 与 git merge 相比 使用 git rebase 可以减少合并冲突的数量 但我从未找到解释为什么会出现这种情况 当两个人都修改同一行代码时 简单地在另一组更改之上重放一组更改并不能神奇地消除固有冲突 那么是什么让
  • Perl:全局符号需要显式包名称

    因此 我一直在尝试找到解决方案 但到目前为止 我在网上阅读的所有内容都与范围问题有关 而不是用my关键词 然而 我似乎无法解决这些问题 因为我已经在顶部声明了所有内容 并且至少对我来说 似乎我没有范围问题 我的以下代码的错误是 Global
  • Cloudera Manager 有其他选择吗? (CDH)[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 正如Cloudera官方博客所说 从6 3 3开始就没有免费版本的CDH 他们会让Cloudera M
  • .net框架中内置的抽象类都有哪些? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我一直在寻找但无法找到合适的列表 有
  • 寻找一种良好的空间划分数据结构,以快速生成数百万个原子键

    我正在执行一些涉及数百万个原子的系统的 MD 模拟 我编写了一些代码来生成一个文件 该文件只是 XYZ 原子坐标的列表 现在我需要在原子之间生成键 如果两个原子彼此之间的距离在一定距离内 则被视为键 XYZ 文件示例 1 0 0 2 0 0
  • Java 中的 HTTPResponse 作为 JSON

    我试图从 HTTP 响应中获取 JSONObject try GetMethod postMethod new GetMethod postMethod setURI new URI url true postMethod setReque
  • 在菜单按钮之前和之间留出等宽的间隙

    我使用下面的代码创建了一个滚动菜单 我试图在每个菜单精灵按钮之间创建相等的行间隙 宽度间距 目前 我已经能够在左右两端留出等宽间距 但不能在精灵按钮之间留出等宽间距 请参阅下面的相关代码 class LevelScene SKScene l