Swift 从plist读取计算的CG点

Swift 从plist读取计算的CG点,swift,plist,cgpoint,Swift,Plist,Cgpoint,我正在寻找一种从plist(Xcode 6/Swift)加载计算出的CGPoints的方法 我曾经以{160450}格式将CGPoints作为字符串输入plist,加载字符串并使用CGPointFromString()进行转换 因为我想让应用程序在不同的设备上工作,所以我需要这些CG点相对于屏幕大小 我认为可以输入一个字符串作为{kScreenWidth/2,kScreenHeight*3/4},但当然,这不起作用,返回CGPointZero。 我想我可以编写自己的CGPointFromStri

我正在寻找一种从plist(Xcode 6/Swift)加载计算出的CGPoints的方法

我曾经以{160450}格式将CGPoints作为字符串输入plist,加载字符串并使用CGPointFromString()进行转换

因为我想让应用程序在不同的设备上工作,所以我需要这些CG点相对于屏幕大小

我认为可以输入一个字符串作为{kScreenWidth/2,kScreenHeight*3/4},但当然,这不起作用,返回CGPointZero。 我想我可以编写自己的CGPointFromString方法,将常量考虑在内,但我不知道如何做到这一点,没有字符串可能会有更好的解决方案

是否可以将其作为“数据”保存并加载到plist中? 我试了很多,但似乎找不到解决办法

任何想法都非常感谢

代码如下:

let points: [CGPoint]

init(levelNumber: Int) {
  let levelDict = NSDictionary(contentsOfFile: NSBundle.mainBundle().pathForResource("level\(levelNumber + 1)", ofType: "plist")!)! {

  self.points = []

  if let pointsData = levelDict["pointsData"] as [NSDictionary]? 
    for item in pointsData {
      let pointString = item["point"] as String
      self.points.append(CGPointFromString(pointString))
    }
  }
}
然后我将从points数组创建一个CGPath(知道如何做)

编辑:只是一个快速更新,让我的意图更清楚

我需要创建在所有设备上相对于屏幕大小相同的路径。路径的CGP点应手动输入plist,以预配置多条路径。应用程序不应在运行时计算和保存它们

考虑下列声明:

let kScreenWidth = UIScreen.mainScreen().bounds.width
let sprite = SKSpriteNode(color: UIColor.blackColor(), size: CGSize(width: kScreenWidth/4, height: kScreenWidth/4))
let bottomRight = CGPoint(x: kScreenWidth - sprite.size.width/2, y: 0.0)
在一个完美的世界中,我会在plist中保存以下两个cgpoint,就像我可以在代码中设置位置一样,在展开时,应用程序会知道查找这些常量并获取它们的值:

(x:kScreenWidth*1/4,y:sprite.尺寸.宽度/2)

右下角

我正在寻找一个尽可能接近的解决方案!
非常感谢你的帮助

您可以使用以下扩展名:

extension CGPoint {
  func string() -> String { return "\(self.x);\(self.y)" }
  mutating func fromString(s:String)  {
    var coords = split(s) {$0 == ";"}
    x = CGFloat((coords[0] as NSString).floatValue)
    y = CGFloat((coords[1] as NSString).floatValue)
  }
}

let p = CGPoint(x:1.2, y:3.4)
println(p.string())
var p1 = CGPoint()
p1.fromString(p.string())
println(p1)
若你们在操场上运行,你们会发现有一个精度问题,但对于绘图坐标,你们可以忽略这些

假设您有一个包含此条目的plist:

<dict>
  <key>myPoint</key>
  <string>1.2;3.4</string>
</dict>
您可以像这样解包
CGPoint

var p = CGPoint()
p.fromString(levelDict["myPoint"] // now it's CGPoint(x:1.2,y:3.4)
要将其保存回去,您需要设置

levelDict["myPoint"] = p.string()

在将词典中的plist写入文件之前。

您查看过NSValue吗?您好,托马斯,谢谢您的回复!我现在尝试使用NSValue,但我不知道如何在我的案例中使用它。在plist中输入CGPoints的格式是什么(我正在手动设置一些预配置的路径,这取决于屏幕的大小)?我也研究了这个问题。NSValue似乎不是最终路径。您无法使用NSDictionary保存它。它必须是NSData。我有点纠结于如何把一个放进另一个。乍一看,字符串解析可能更容易。分隔为分号并使用NSNumberFormatter为什么不相对地存储坐标?比如,你知道该点应该在iPhone5屏幕上的
{160,450}
坐标处,然后你需要将坐标除以当前屏幕的宽度和高度,比如
160/320=0.5
450/568=0.792
并将这些比例值仅存储在
CGPoint
中,比如
{0.5,0.792}
(您可以这样做)并且您可以计算当前屏幕的最终坐标,例如,对于iPhone 6+来说,这些坐标将是
0.5*414=207
0.792*786=583
等。@holex感谢您的建议!是的,这是一种最后的解决方法(应该会奏效),我希望有一种更优雅的方法来实现这一点,而不需要那种硬编码。非常感谢,这确实考虑到了常量变量!但是,我仍然需要将数据保存为plist中的CGPoints。我猜,或者,也可以将CGPoints保存为字符串,包括变量名,然后是ext结束NSString以与上面类似的方式转换为CGPoint?我将尝试并在今晚报告。如果我在这里遗漏了什么,请让我知道,你显然比我更有经验!非常感谢!上面考虑到你在plist中将它们保存为字符串。我将修改答案。对于延迟,我可以之前不要尝试该代码。非常感谢您花时间键入该代码,非常感谢!它似乎仍然不适用于我的计算变量。我已声明
let kScreenWidth=UIScreen.mainScreen().bounds.width let kScreenHeight=UIScreen.mainScreen().bounds.height
我已将点作为字符串输入plist:
kScreenWidth/2;kScreenHeight/2
Xcode将中断,并出现致命错误:“无法索引空缓冲区”指向CGPoint扩展的x=行。我猜转换为NSString不知道如何处理我的常量?我已经更新了问题,使其更精确。在运行时保存CGPoint时,您的解决方案工作正常,我需要在plist中预先编写它们。
levelDict["myPoint"] = p.string()