来自 UIImage 的 SKTexture 尊重宽高比

问题描述 投票:0回答:2

我正在将图像设置为

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
,让它们混淆了。

ios swift uiimage sktexture
2个回答
19
投票

您可以为 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)

2
投票

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)
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.