从plist中读取计算出的CGPoints

时间:2015-01-22 10:12:44

标签: swift plist cgpoint

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

我曾经以格式{160,450}的形式将CGPoints作为字符串输入到plist中,加载字符串并使用CGPointFromString()将其转换。

由于我希望应用程序在不同的设备上运行,我需要这些CGPoints与屏幕大小相关。

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

是否可以将其保存并加载为plist中的“Data”? 我已经尝试了很多,但似乎无法找到解决方案。

任何想法都非常感激!

以下是代码:

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(知道如何做)。

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

我需要在所有设备上创建相对于屏幕尺寸相同的路径。应将路径的CGPoints手动输入到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中保存以下两个CGPoints,就像我可以在代码中设置位置一样,当解包时,应用程序会知道查看这些常量并得到它们的值:

(x:kScreenWidth * 1/4,y:sprite.size.width / 2)

bottomRight

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

1 个答案:

答案 0 :(得分:0)

您可以使用以下扩展程序:

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)

如果你在Playground中运行它,你会发现存在精度问题但是使用绘图坐标你可以忽略它们。

假设你有这个条目的plist:

<dict>
  <key>myPoint</key>
  <string>1.2;3.4</string>
</dict>

之后

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

你可以解压CGPoint之类的

var p = CGPoint()
p.fromString(levelDict["myPoint"] // now it's CGPoint(x:1.2,y:3.4)

要将其保存回来,您需要设置

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

在将plist从字典中写入文件之前。