39070


■バージョン  
swift 4

■やりたいこと/質問  
MenuPageScene.swift（下記に詳細を記載）にUIButtonを追加したい  
現状下記コードでは追加できていない状況です。  
追加したいのですが、下記コードに問題があるのか、そのほかの設定等で失念していることがあるのか、swift4ではできないのかがわかりません。  
ご回答お待ちしております。  
.sksファイルとの連携はできており、MenuPageScene.sksにColor Spriteを  
追加するとシミュレータに表示されます。MenuPageScene.sksのCustom Classには  
MenuPageSceneを設定しています。

■ファイル構成  
MenuPageViewController.swift  
MenuPageScene.swift  
MenuPageScene.sks:CustomeClassにMenuPageSceneを設定

■ソースコード  
MenuPageViewController.swift

[code]

    import Foundation
    import UIKit
    import SpriteKit
    import GameplayKit
    
    class MenuPageViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            if let view = self.view as! SKView? {
                // Load the SKScene from 'GameScene.sks'
                if let scene = SKScene(fileNamed: "MenuPageScene") {
                    // Set the scale mode to scale to fit the window
                    scene.scaleMode = .aspectFill
    
                    // Present the scene
                    view.presentScene(scene)
                }
    
                view.ignoresSiblingOrder = true
    
                view.showsFPS = true
                view.showsNodeCount = true
            }
        }
    ・・・以下省略
    
[/code]

MenuPageScene.swift

[code]

    import Foundation
    import SpriteKit
    import GameplayKit
    import UIKit
    class MenuPageScene: SKScene{
    
        let myButton = UIButton()
    
        @objc func onClickMyButton(sender : UIButton){
    
            let rect = SKShapeNode(rect: CGRect(origin: CGPoint(x:50.0,y:50.0),size:CGSize(width:50.0,height:50.0)) )
            rect.fillColor = UIColor.red
            //rect.position = CGPointMake(self.frame.midX, self.frame.midY)
            rect.physicsBody = SKPhysicsBody(rectangleOf:CGSize(width:50.0,height:50.0))
    
            self.addChild(rect)
    
        }
    
        override func didMove(to view: SKView) {
    
            // ボタンを生成.
            myButton.backgroundColor = UIColor.red
            myButton.layer.masksToBounds = true
            myButton.setTitle("Add Block", for: UIControlState.normal)
            myButton.setTitleColor(UIColor.white, for: UIControlState.normal)
            myButton.setTitle("Done", for: UIControlState.highlighted)
            myButton.setTitleColor(UIColor.black, for: UIControlState.highlighted)
            myButton.layer.cornerRadius = 20.0
            myButton.layer.position = CGPoint(x: -self.view!.frame.width/4, y:-self.view!.frame.height/4)
            myButton.addTarget(self, action: #selector(onClickMyButton(sender:)), for: .touchUpInside)
            self.view!.addSubview(myButton);
        }
    ・・・以下省略
    }
    
[/code]


CC BY-SA 3.0
2017-10-27T01:31:45.957
39059
2017-10-27T06:00:10.993
2017-10-27T03:30:04.767
25745
25745
question
swift ios xcode
SKSceneにUIButtonを追加(addSubview)しても表示されないのはなぜか？


  * あなたのコードは不要なセミコロン`;`の位置からして「spritekit ボタン」と言ったキーワードで上位に出てくるあるサイトのコードを元にしているように思われるのですが? 参考にしたサイトがある場合、リンク等で出典を明示した方が早く問題の解決に結びつく場合が多いです。

  * あなたはそのコードで普通のViewにボタンを追加できるかどうか試されたでしょうか。(`SKScene`の表示を受け持っている)`SKView`にボタンを追加するコードは、普通にプログラムでViewにボタンを追加するコードと変わりません。まずは普通のViewにボタンを追加できるようなコードにしてください。

  * あなたのコード内のコメントで「ボタンを生成」と書いてある場所では、ボタンを生成しておらず、実際にボタンを「生成」しているのは、プロパティの初期化式の中です。
[code]     let myButton = UIButton()

    
[/code]

`UIButton`クラスでは引数を取らないイニシャライザ`init()`の動作は明確には定義されていません。  
[`UIView`](https://developer.apple.com/documentation/uikit/uiview) >
[`UIControl`](https://developer.apple.com/documentation/uikit/uicontrol) >
[`UIButton`](https://developer.apple.com/documentation/uikit/uibutton)

ドキュメントで動作の定義された次の3つのイニシャライザのどれかを使った方が良いでしょう。  
[`init(frame:)`](https://developer.apple.com/documentation/uikit/uiview/1622488-init),
[`init?(coder:)`](https://developer.apple.com/documentation/uikit/uiview/1622477-init),
[`init(type:)`](https://developer.apple.com/documentation/uikit/uibutton/1624028-init)  
(ただし、2個目を普通のアプリから呼ぶことはまずあり得ない。)

ちなみに`UIButton()`とすると(現在のiOSでは)サイズが0のボタンができてしまい、当然見えません。

  * あなたのコード内のこの行:
[code]     myButton.layer.position = CGPoint(x: -self.view!.frame.width/4,
y:-self.view!.frame.height/4)

    
[/code]

`layer.position`で表示位置を調整するのは特殊な事例である上に、原点(Viewの場合、画面の左上隅)よりも左上を指定しているので、よほど大きなサイズのボタンでないと見えません。

* * *

と言うわけであなたの現在のコードは、

## サイズが0のボタンを画面の外に置く

と言う動作をするものになっています。

`SKScene`の中でやっているかどうかは別にして、それでは表示されるはずがありません。

* * *

SpriteKitの画面内に`UIButton`を置くなんてデザインが本当に良い事かどうかの判断は置いて、画面の中に大きさのある`UIButton`を置くなら、例えばこんな感じのコードになります。

[code]

    override func didMove(to view: SKView) {
        // 画面の中央に
        let x = view.frame.width/2 - 100
        let y = view.frame.height/2 - 20
        // サイズが(200,40)のボタンを生成.
        let myButton = UIButton(frame: CGRect(x: x, y: y, width: 200, height: 40))
    
        myButton.backgroundColor = .red
        myButton.layer.masksToBounds = true
        myButton.setTitle("Add Block", for: .normal)
        myButton.setTitleColor(.white, for: .normal)
        myButton.setTitle("Done", for: .highlighted)
        myButton.setTitleColor(.black, for: .highlighted)
        myButton.layer.cornerRadius = 20.0
        myButton.addTarget(self, action: #selector(self.onClickMyButton(sender:)), for: .touchUpInside)
        view.addSubview(myButton)
    }
    
[/code]


CC BY-SA 3.0
2017-10-27T06:00:10.993
39070
2017-10-27T06:00:10.993
13972
39059
answer