我正在将图像设置为
SKScene
的背景,代码类似于以下
/* In SKScene subclass */
background = SKSpriteNode()
background.anchorPoint = CGPointMake(0,1)
background.position = CGPointMake(0, size.height)
background.zPosition = Layer.Background
background.size = view!.bounds.size
background.texture = SKTexture(image: <# UIImage #>)
addChild(background)
这可以插入图像作为场景的背景,但如果图像的纵横比与
background
节点不同,则会拉伸以填充它。
(左边是裁剪图像以适合
SKSpriteNode
的宽高比时的结果,右边是图像具有不同宽高比时的结果)
有没有办法让 SKSpriteNode 尊重图像的原始宽高比,例如可以将
UIImageView
设置为使用 UIViewContentModeScaleAspectFill
?
编辑 将
UIViewContentModeScaleAspectFit
的提及改为 UIViewContentModeScaleAspectFill
,让它们混淆了。
您可以为 SKSpriteNode 创建一个扩展来执行此操作。
extension SKSpriteNode {
func aspectFillToSize(fillSize: CGSize) {
if texture != nil {
self.size = texture!.size()
let verticalRatio = fillSize.height / self.texture!.size().height
let horizontalRatio = fillSize.width / self.texture!.size().width
let scaleRatio = horizontalRatio > verticalRatio ? horizontalRatio : verticalRatio
self.setScale(scaleRatio)
}
}
}
使用方法
let background = SKSpriteNode()
background.anchorPoint = CGPointMake(0,1)
background.position = CGPointMake(0, size.height)
background.texture = SKTexture(imageNamed: "1.png")
background.aspectFillToSize(view.frame.size) // Do this after you set texture
addChild(background)
Rakeshbs 的回答很棒。 但我认为这个解决方案的关键点是动态改变SKSpriteNode的大小。不需要出售节点。所以我更新了他的代码如下
extension SKSpriteNode {
func aspectFillToSize(fillSize: CGSize) {
if let texture = self.texture {
let horizontalRatio = fillSize.width / texture.size().width
let verticalRatio = fillSize.height / texture.size().height
let finalRatio = horizontalRatio < verticalRatio ? horizontalRatio : verticalRatio
size = CGSize(width: texture.size().width * finalRatio, height: texture.size().height * finalRatio)
}
}
}