Ios 在SpriteKit中使用Swift拍摄和共享屏幕截图

Ios 在SpriteKit中使用Swift拍摄和共享屏幕截图,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我刚刚在SpriteKit中使用Swift制作了一个简单的游戏。在最后一个场景中,它显示了Score、Share和Restart按钮 共享最终场景屏幕截图的功能仍在等待中。我在这里找到了一个非常简单的解决方案 我不是专业人士,因此我迄今为止实施此解决方案的所有尝试都是徒劳的 当播放器点击shareButton()时,我试图调用shareScore()函数(如该解决方案中所述),但它不起作用 这是我最后一幕的代码 var restartBtn = SKSpriteNode() var shareB

我刚刚在SpriteKit中使用Swift制作了一个简单的游戏。在最后一个场景中,它显示了Score、Share和Restart按钮

共享最终场景屏幕截图的功能仍在等待中。我在这里找到了一个非常简单的解决方案

我不是专业人士,因此我迄今为止实施此解决方案的所有尝试都是徒劳的

当播放器点击
shareButton()
时,我试图调用
shareScore()
函数(如该解决方案中所述),但它不起作用

这是我最后一幕的代码

var restartBtn = SKSpriteNode()
var shareBtn = SKSpriteNode()
var scoreLbl = SKLabelNode()
var score = Int()


override func didMoveToView(view: SKView) {

    scene!.scaleMode = .AspectFill

    self.view?.backgroundColor = UIColor.grayColor()

    scoreLabel()

    shareBtn = SKSpriteNode(imageNamed: "Share")
    shareBtn.position = CGPointMake(self.frame.width / 2, self.frame.height / 3)
    shareBtn.setScale(0.0005)
    self.addChild(shareBtn)

    restartBtn = SKSpriteNode(imageNamed: "Restart")
    restartBtn.position = CGPointMake(self.frame.width / 2, self.frame.height / 4)
    restartBtn.setScale(0.0005)

    self.addChild(restartBtn)
}


func scoreLabel() {

    let scoreDefault = NSUserDefaults.standardUserDefaults()
    score = scoreDefault.valueForKey("score") as! NSInteger

    scoreLbl.position = CGPoint(x: self.frame.width / 2, y: self.frame.height / 2)
    scoreLbl.fontSize = 40
    scoreLbl.setScale(0.001)
    scoreLbl.text = "Score: \(score)"

    self.addChild(scoreLbl)
}


override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

    for touch in touches {

        let location = touch.locationInNode(self)

        if restartBtn.containsPoint(location) {

            let gameScene = GameScene(fileNamed: "GameScene")
            let transition = SKTransition.fadeWithDuration(0.5)
            let skView = self.view! as SKView
            skView.ignoresSiblingOrder = true
            gameScene?.scaleMode = .AspectFill
            skView.presentScene(gameScene!, transition: transition)

        } else if shareBtn.containsPoint(location) {

            // Function for sharing screenshot should be called here
        }
    }

}
var restartBtn=SKSpriteNode()
var shareBtn=SKSpriteNode()
var scoreLbl=SKLabelNode()
var得分=Int()
覆盖func didMoveToView(视图:SKView){
场景!.scaleMode=.AspectFill
self.view?.backgroundColor=UIColor.grayColor()
记分标签()
shareBtn=SKSpriteNode(图像名称:“共享”)
shareBtn.position=CGPointMake(self.frame.width/2,self.frame.height/3)
shareBtn.setScale(0.0005)
self.addChild(shareBtn)
restartBtn=SKSpriteNode(图像名为:“重新启动”)
restartbn.position=CGPointMake(self.frame.width/2,self.frame.height/4)
restartBtn.setScale(0.0005)
self.addChild(restartBtn)
}
func scoreLabel(){
让scoreDefault=NSUserDefaults.standardUserDefaults()
score=scoreDefault.valueForKey(“score”)作为!NSInteger
scoreLbl.position=CGPoint(x:self.frame.width/2,y:self.frame.height/2)
scoreLbl.fontSize=40
分数设置刻度(0.001)
scoreLbl.text=“分数:\(分数)”
self.addChild(scoreLbl)
}
覆盖功能触摸开始(触摸:设置,withEvent事件:UIEvent?){
接触{
let location=touch.locationInNode(自)
如果重新启动btn.containsPoint(位置){
让GameSecene=GameSecene(文件名为:“GameSecene”)
let transition=SKTransition.fadeWithDuration(0.5)
让skView=self.view!作为skView
skView.ignoresSiblingOrder=true
游戏场景?.scaleMode=.AspectFill
skView.presentScene(游戏场景,过渡:过渡)
}如果shareBtn.containsPoint(位置),则为else{
//此处应调用共享屏幕截图的函数
}
}
}

您没有演示如何使用
shareScore()
函数,因此我根据您提供的教程为您创建了一个简单的示例,它运行良好,下面是完整的示例代码:

import SpriteKit

class GameScene: SKScene {

    let sprite = SKSpriteNode(imageNamed:"Spaceship")

    override func didMoveToView(view: SKView) {

        sprite.xScale = 0.5
        sprite.yScale = 0.5
        sprite.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))

        self.addChild(sprite)
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

        for touch in touches {

            let location = touch.locationInNode(self)

             if sprite.containsPoint(location) {

                let postText: String = "Check out my score! Can you beat it?"
                let postImage: UIImage = getScreenshot(scene!)
                let activityItems = [postText, postImage]
                let activityController = UIActivityViewController(
                    activityItems: activityItems,
                    applicationActivities: nil
                )

                let controller: UIViewController = scene!.view!.window!.rootViewController!

                controller.presentViewController(
                    activityController,
                    animated: true,
                    completion: nil
                )
            }
        }

    }

    func getScreenshot(scene: SKScene) -> UIImage {
        let snapshotView = scene.view!.snapshotViewAfterScreenUpdates(true)
        let bounds = UIScreen.mainScreen().bounds

        UIGraphicsBeginImageContextWithOptions(bounds.size, false, 0)

        snapshotView.drawViewHierarchyInRect(bounds, afterScreenUpdates: true)

        let screenshotImage : UIImage = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()

        return screenshotImage;
    }
}
导入SpriteKit
类游戏场景:SKScene{
让sprite=SKSpriteNode(图像名为:“太空船”)
覆盖func didMoveToView(视图:SKView){
sprite.xScale=0.5
sprite.yScale=0.5
sprite.position=CGPoint(x:CGRectGetMidX(self.frame),y:CGRectGetMidY(self.frame))
self.addChild(精灵)
}
覆盖功能触摸开始(触摸:设置,withEvent事件:UIEvent?){
接触{
let location=touch.locationInNode(自)
如果sprite.containsPoint(位置){
让postText:String=“看看我的分数!你能打败它吗?”
让postImage:UIImage=getScreenshot(场景!)
让activityItems=[postText,postImage]
让activityController=UIActivityViewController(
activityItems:activityItems,
应用程序活动:无
)
让控制器:UIViewController=场景!.view!.window!.rootViewController!
controller.presentViewController(
活动控制器,
是的,
完成日期:无
)
}
}
}
func getScreenshot(场景:SKScene)->UIImage{
让snapshotView=scene.view!.SnapshotViewAfterScreenUpdate(true)
让bounds=UIScreen.mainScreen().bounds
UIGraphicsBeginImageContextWithOptions(bounds.size,false,0)
snapshotView.drawViewHierarchyInRect(边界、后屏幕更新:true)
让screenshotImage:UIImage=UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsSendImageContext()
返回截屏图像;
}
}
当你点击太空船图像时,你会得到如下结果:

现在你可以很容易地分享它


代码获取更多信息。

@DharmeshKheni我刚刚也包括了我的代码。谢谢你的回答。我为该函数创建了一个单独的
ShareScore.swift
文件,并尝试在
中调用它,如果shareBtn.containsPoint(location)
现在我实现了您的解决方案,是的,它显示了这个共享弹出窗口,但我刚刚注意到另一个问题。它并没有截图,而是保存了一张白色的图片,里面什么都没有。我已经测试过了,效果很好。我在实际设备上测试过,但仍然存在相同的问题。屏幕截图是完全白色的,上面没有任何内容。我可以用这个来调整解决方案。我应该在你的答案中添加这段代码吗?