20521


複数のUISegmentedControlですが、条件分岐をどこで設定するのか？がわかりません。  
下記コードが、今まで出来ているものです。  
１つのページに３つのUISegmentedControlを設置したいので、どなたかご教授いただけませんか？

import SpriteKit

[code]

        class GameScene: SKScene {
    
            var myImage : SKSpriteNode!
    
            override func didMoveToView(view: SKView) {
    
                //背景画像。SKSPriteNodeで画像を読み込む。
                let backGround = SKSpriteNode(imageNamed:"stadium414736.png")
                //画面サイズを取得
                let Label = SKLabelNode(text: "\(self.size)")
                Label.position = CGPointMake(self.size.width/2.0,self.size.height/2.0)
                //背景を画面の中央に配置する
                backGround.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
                //画像のサイズを画面に合わせる
                backGround.size = self.size
                //画像を最下層に設置
                backGround.zPosition = -CGFloat.infinity
                // シーンに追加.
                self.addChild(backGround)
                // GameSceneの背景色を青色にする.
                self.backgroundColor = UIColor.blueColor()
    
                // ボール画像を生成.
                myImage = SKSpriteNode(imageNamed:"ball04.png")
                // ボール画像の描画場所を指定.
                myImage.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));
                // シーンに追加.
                self.addChild(myImage)
    
                // ラベル　打球種
                let dakyuushu = SKLabelNode(fontNamed:"Chalkduster")
                dakyuushu.text = "打球種"
                dakyuushu.fontSize = 15
                dakyuushu.position = CGPoint(x:(size.width / 10.0) * 1 , y:(size.height / 35) * 11.1)
                dakyuushu.fontColor = UIColor.whiteColor()
                self.addChild(dakyuushu)
                //選択肢
                let myArray1: NSArray = ["  ゴロ  ", "  ライナー  ", "  フライ  " ]
                // SegmentedControlを作成する.
                let dakyuushu1: UISegmentedControl = UISegmentedControl(items: myArray1 as [AnyObject])
                dakyuushu1.center = CGPoint(x:(size.width / 10.0) * 5.8 , y:(size.height / 35) * 23.5)
                dakyuushu1.tintColor = UIColor.yellowColor()
                // イベントを追加する.
                dakyuushu1.addTarget(self, action: "segconChanged1:", forControlEvents: UIControlEvents.ValueChanged)
                // Viewに追加する.
                self.view!.addSubview(dakyuushu1)
    
                // ラベル　捕球野手
                let hokyuu = SKLabelNode(fontNamed:"Chalkduster")
                hokyuu.text = "捕球野手"
                hokyuu.fontSize = 15
                hokyuu.position = CGPoint(x:(size.width / 10.0) * 1 , y:(size.height / 35) * 9)
                hokyuu.fontColor = UIColor.whiteColor()
                self.addChild(hokyuu)
                //選択肢
                let myArray2: NSArray = ["投 ", "捕 ", "一 ", "二 ", "三 ", "遊 ", "左 ", "中 ", "右 ", "無 " ]
                // SegmentedControlを作成する.
                let hokyuu2: UISegmentedControl = UISegmentedControl(items: myArray2 as [AnyObject])
                hokyuu2.center = CGPoint(x:(size.width / 10.0) * 5 , y:(size.height / 35) * 27.3)
                hokyuu2.tintColor = UIColor.yellowColor()
                // イベントを追加する.
                hokyuu2.addTarget(self, action: "segconChanged2:", forControlEvents: UIControlEvents.ValueChanged)
                // Viewに追加する.
                self.view!.addSubview(hokyuu2)
    
                // ラベル　結果
                let kekka = SKLabelNode()
                kekka.text = "結果"
                kekka.fontSize = 15
                kekka.position = CGPoint(x:(size.width / 10.0) * 1 , y:(size.height / 35) * 5.5)
                kekka.fontColor = UIColor.whiteColor()
                self.addChild(kekka)
                //選択肢
                let myArray: NSArray = ["Out ", "1BH ", "2BH ", "3BH ","HR ", "ERR ", "Fc " ]
                // SegmentedControlを作成する.
                let kekka1: UISegmentedControl = UISegmentedControl(items: myArray as [AnyObject])
                kekka1.center = CGPoint(x:(size.width / 10.0) * 5 , y:(size.height / 35) * 31)
                kekka1.tintColor = UIColor.yellowColor()
                // イベントを追加する.
                kekka1.addTarget(self, action: "segconChanged:", forControlEvents: UIControlEvents.ValueChanged)
                // Viewに追加する.
                self.view!.addSubview(kekka1)
            }
    
            override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
                for touch: AnyObject in touches {
    
                    // タッチされた場所の座標を取得.
                    let location = touch.locationInNode(self)
                    //画面の中心
                    let midX = CGRectGetMidX(self.frame)
                    let midY = CGRectGetMidY(self.frame)
    
                    // ボール位置・軌跡のエリア条件
                    let area2 = (location.x - midX) / (location.y - (midY - (midY / 5.0)))
                    if location.y > midY - (midY / 5.0) {
                        if area2 >= -1  && area2 <= 1 {
                            //　打球到達エリア判定
                            let area1 = ((location.x - midX) / (location.y - midY))
                            if location.y - midY <= 0 && location.x - midX <= 0 {
                                print("left")
                            } else if location.y - midY < 0 && location.x - midX > 0 {
                                print("right")
                            } else if area1 < -0.3 {
                                print("left")
                            } else if area1 >= -0.3 && area1 <= 0.3 {
                                print("center")
                            } else if area1 > 0.3 {
                                print("right")
                            }
    
                            // タッチされた場所に画像を移動
                            myImage.position = location
                            // 始点を記憶するインスタンス変数
                            var position = CGPointZero
                            // 始点を記憶
                            position = self.convertPointFromView((touches.first?.locationInView(view))!)
                            // CGPathを生成
                            let path = CGPathCreateMutable()
                            // 描画のペンを始点に移動
                            CGPathMoveToPoint(path, nil, position.x, position.y)
                            // カーブを描く
                            //CGPathAddCurveToPoint(path, nil, position.x , position.y , midX, midY, midX, midY)
                            // "curve"という名前のノードがあったら消去する
                            if let theNode = self.childNodeWithName("curve") {
                                theNode.removeFromParent()
                            }
                            // pathからSKShapeNodeを生成。
                            let shapeNode = SKShapeNode(path: path)
                            // ノードに名前を付ける
                            shapeNode.name = "curve"
                            //軌跡を描画
                            self.addChild(shapeNode)
                        }
                    }
                }
            }
    
            //打球種　SegmentedControlの値が変わったときに呼び出される.
            func segconChanged1(sender: UISegmentedControl){
                // CGPathを生成
                let path = CGPathCreateMutable()
                //画面の中心
                let midX = CGRectGetMidX(self.frame)
                let midY = CGRectGetMidY(self.frame)
                // shapeNodeを取得
                guard let shapeNode = childNodeWithName("curve") as? SKShapeNode else {
                    return
                }
                switch sender.selectedSegmentIndex {
                case 0:
                    CGPathAddCurveToPoint(path, nil, position.x , position.y , midX, midY, midX, midY)
                case 1:
                    CGPathAddCurveToPoint(path, nil, (position.x + midX) / 2.0 , position.y , midX, midY, midX, midY)
                case 2:
                    CGPathAddCurveToPoint(path, nil, (position.x + midX) / 2.0 , (position.y + (midY / 1.5)), midX, midY, midX, midY)
                default:
                    print("Error")
                }
                // 線の太さを指定
                shapeNode.lineWidth = 1.0
    
            }
    
            //結果　SegmentedControlの値が変わったときに呼び出される.
                func segconChanged(segcon: UISegmentedControl){
                    // shapeNodeを取得
                    guard let shapeNode = childNodeWithName("curve") as? SKShapeNode else {
                        return
                    }
                    switch segcon.selectedSegmentIndex {
                    case 0:
                        shapeNode.strokeColor = UIColor.redColor()
                    case (1...4):
                        shapeNode.strokeColor = UIColor.greenColor()
                    case (5...6):
                        shapeNode.strokeColor = UIColor.yellowColor()
                    default:
                        print("Error")
                    }
                    // 線の太さを指定
                    shapeNode.lineWidth = 1.0
    
            }
        }
    
[/code]


CC BY-SA 3.0
2015-12-31T04:44:15.690
20498
2016-01-03T13:33:39.563
2016-01-03T13:33:39.563
13156
13156
question
swift xcode
GameSceneにUISegmentedControlを実装したいのですが・・・。


UISegmentedControlで色を選択したときに例外が発生する原因は、mySegcon.addTarget()で指定しているsegconChanged()が呼び出せないためです。現在のSwiftでは、関数の内部関数をaddTarget()で指定することはできません。

segconChanged()を通常のメンバー関数にして、その形に合うようにSKShapeNode周りの処理を書き直せば、色の選択でSKShapeNodeの色が変わるようになります。

以下、こちらで動作を確認したソースです。  
（Xcode 7.2 / iOS9で確認）

[code]

    import SpriteKit
    
    class GameScene: SKScene {
    
        var myImage : SKSpriteNode!
    
        override func didMoveToView(view: SKView) {
    
            //背景画像。SKSPriteNodeで画像を読み込む。
            let backGround = SKSpriteNode(imageNamed:"stadium414736.png")
    
            //画面サイズを取得
            let Label = SKLabelNode(text: "\(self.size)")
            Label.position = CGPointMake(self.size.width/2.0,self.size.height/2.0)
    
            //背景を画面の中央に配置する
            backGround.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
    
            //画像のサイズを画面に合わせる
            backGround.size = self.size
    
            //画像を最下層に設置
            backGround.zPosition = -CGFloat.infinity
    
            // シーンに追加.
            self.addChild(backGround)
    
            // GameSceneの背景色を青色にする.
            self.backgroundColor = UIColor.blueColor()
    
            // ボール画像を生成.
            myImage = SKSpriteNode(imageNamed:"ball04.png")
    
            // ボール画像の描画場所を指定.
            myImage.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));
    
            // シーンに追加.
            self.addChild(myImage)
    
            // 表示する配列を作成する.
            let myArray: NSArray = ["  Red  ","  Blue  ","  Green  "]
    
            // SegmentedControlを作成する.
            let mySegcon: UISegmentedControl = UISegmentedControl(items: myArray as [AnyObject])
    //      mySegcon.center = CGPoint(x:(size.width / 5.0) * 2 , y:(size.height / 35) * 24)
            mySegcon.center = CGPoint(x:120 , y:(size.height / 35) * 24)
            mySegcon.tintColor = UIColor.yellowColor()
    
            // イベントを追加する.
            mySegcon.addTarget(self, action: "segconChanged:", forControlEvents: UIControlEvents.ValueChanged)
    
            // Viewに追加する.
            self.view!.addSubview(mySegcon)
        }
    
        override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
            for touch: AnyObject in touches {
    
                // タッチされた場所の座標を取得.
                let location = touch.locationInNode(self)
    
                //画面の中心
                let midX = CGRectGetMidX(self.frame)
                let midY = CGRectGetMidY(self.frame)
    
                // ボール位置・軌跡のエリア条件
                let area2 = (location.x - midX) / (location.y - (midY - (midY / 5.0)))
                if location.y > midY - (midY / 5.0) {
                    if area2 >= -1  && area2 <= 1 {
    
                        // タッチされた場所に画像を移動
                        myImage.position = location
    
                        // 始点を記憶するインスタンス変数
                        var position = CGPointZero
    
                        // 始点を記憶
                        position = self.convertPointFromView((touches.first?.locationInView(view))!)
    
                        // CGPathを生成
                        let path = CGPathCreateMutable()
    
                        // 描画のペンを始点に移動
                        CGPathMoveToPoint(path, nil, position.x, position.y)
    
                        // カーブを描く
                        CGPathAddCurveToPoint(path, nil, (position.x + midX) / 2.0 , (position.y + (midY / 2.5)), midX, position.y, midX, midY)
    
                        // "curve"という名前のノードがあったら消去する
                        if let theNode = self.childNodeWithName("curve") {
                            theNode.removeFromParent()
                        }
    
                        // pathからSKShapeNodeを生成。
                        let shapeNode = SKShapeNode(path: path)
    
                        // ノードに名前を付ける
                        shapeNode.name = "curve"
    
                        // 線の色を指定
                        shapeNode.strokeColor = UIColor.greenColor()
    
                        self.addChild(shapeNode)
    
                        // ここにあったsegconChangedを外に出す
                    }
                }
            }
        }
    
        //SegmentedControlの値が変わったときに呼び出される.
        func segconChanged(segcon: UISegmentedControl){
    
            // shapeNodeを取得
            guard let shapeNode = childNodeWithName("curve") as? SKShapeNode else {
                return
            }
    
            switch segcon.selectedSegmentIndex {
            case 0:
                shapeNode.strokeColor = UIColor.redColor()
    
            case 1:
                shapeNode.strokeColor = UIColor.blueColor()
    
            case 2:
                shapeNode.strokeColor = UIColor.greenColor()
    
            default:
                print("Error")
            }
    
            // 線の太さを指定
            shapeNode.lineWidth = 1.0
    
            // すでに登録済み
            // Sceneに乗せる
            //      self.addChild(shapeNode)
    
            // Viewに追加する.
            //self.view!.addSubview(mySegcon)
    
            //　打球到達エリア判定
            //
    
            //画面の中心
            let midX = CGRectGetMidX(self.frame)
            let midY = CGRectGetMidY(self.frame)
    
            let area1 = ((position.x - midX) / (position.y - midY))
    
            if position.y - midY <= 0 && position.x - midX <= 0 {
                print("left")
            } else if position.y - midY < 0 && position.x - midX > 0 {
                print("right")
            } else if area1 < -0.3 {
                print("left")
            } else if area1 >= -0.3 && area1 <= 0.3 {
                print("center")
            } else if area1 > 0.3 {
                print("right")
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2016-01-01T10:01:43.190
20521
2016-01-01T10:01:43.190
7459
20498
answer