无法可靠地验证 SKSpriteNode 的纹理
Posted
技术标签:
【中文标题】无法可靠地验证 SKSpriteNode 的纹理【英文标题】:Can't reliably verify texture for SKSpriteNode 【发布时间】:2015-02-07 18:51:31 【问题描述】:我正在尝试编写一个测试来验证我的场景中的 SKSpriteNode 是否具有正确的纹理。 测试如下:
let sceneSprite = scene.childNodeWithName("sceneSprite") as SKSpriteNode!
let sprite = SKSpriteNode(imageNamed: expectedSpriteTexture)
sprite.size = sceneSprite.size // 102.4 x 136.533
XCTAssertTrue(sceneSprite.texture!.sameAs(sprite.texture!), "Scene sprite has wrong texture")
SKTexture 的 sameAs 方法通过以下扩展实现:
extension SKTexture
func sameAs(texture: SKTexture) -> Bool
return self.image.sameAs(texture.image)
var image: UIImage
let view = SKView(frame:CGRectMake(0, 0, size().width, size().height))
let scene = SKScene(size: size())
let sprite = SKSpriteNode(texture: self)
sprite.position = CGPoint(x: CGRectGetMidX(view.frame), y: CGRectGetMidY(view.frame))
scene.addChild(sprite)
view.presentScene(scene)
return self.imageWithView(view)
func imageWithView(view: UIView) -> UIImage
UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0)
view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
extension UIImage
func sameAs(image: UIImage) -> Bool
let firstData = UIImagePNGRepresentation(self);
let secondData = UIImagePNGRepresentation(image);
return firstData.isEqual(secondData)
问题是有时测试通过,有时测试失败。我更改了代码,以便在失败时保存图像,并发现测试失败,因为即使第一个图像是正确的,第二个图像也是完全黑色。 怎样做才能使测试可靠地通过? iPad2 模拟器上出现此故障。
【问题讨论】:
【参考方案1】:我做了如下更改,似乎可以可靠地通过测试
func imageWithView(view: UIView) -> UIImage
UIGraphicsBeginImageContext(view.bounds.size)
view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: false)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
人们有什么想法为什么可以让测试成功?
【讨论】:
看来我错了。上面两张图片的变化导致测试通过的原因现在完全是白色的。以上是关于无法可靠地验证 SKSpriteNode 的纹理的主要内容,如果未能解决你的问题,请参考以下文章
Swift - 使用纹理数组更改 SKSpriteNode 纹理
SKSpriteNode 纹理 alpha 是不是影响触摸区域?