我正在寻找一种从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
我正在寻找尽可能接近的解决方案! 非常感谢您的帮助!
答案 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从字典中写入文件之前。