Ruby Motionチュートリアルやってみた(2)



Ruby Motionチュートリアルをやってます。前回の記事はこちら

Ruby Motionチュートリアルはこちら。

▼開発環境
Ruby 2.5.3
Xcode 10.1
Ruby Motion 5.16

今回はViewについての説明だそうですね。

んで、ViewはUIViewオブジェクトで定義されていると。。。全部ここにまとめられてるのすげーな。

frameと、subviewsについての説明ね。引用しとく。

1.frame プロパティは、 ビューの x と y 座標、ビューの大きさである width と height という値からなります。
2.subviews プロパティは、ビューのすべてのサブビューからなる配列で、背後から前面という視覚的な並びになっています (subviews の配列からビューを取り出すときに指定する index 値は、そのビューの "z-order" のような感じです)。

なるほどね。じゃ、サブビューはわかったけど、ホーム画面みたいなメインのビューはどれ?

って思ったら、次に書いてた。アプリケーションの基本となるビューは "window" だそうです。んで、これはUIWindowでUIViewのサブクラスだそうです。

とりあえず、コードをチュートリアルの指示通りに変更してみます。元のコードはコメントアウトで残しとく。

  def application(application, didFinishLaunchingWithOptions:launchOptions)
    @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
    @window.makeKeyAndVisible

    @blue_view = UIView.alloc.initWithFrame(CGRectMake(10, 10, 100, 100))
    @blue_view.backgroundColor = UIColor.blueColor
    @window.addSubview(@blue_view)

    # rootViewController = UIViewController.alloc.init
    # rootViewController.title = 'HelloMotion'
    # rootViewController.view.backgroundColor = UIColor.whiteColor
    #
    # navigationController = UINavigationController.alloc.initWithRootViewController(rootViewController)
    #
    # @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
    # @window.rootViewController = navigationController
    # @window.makeKeyAndVisible
    #
    # alert = UIAlertView.new
    # alert.message = "Hello Motion!"
    # alert.show
    # puts "Hello again!"

    true
  end

一行目で、UIWindowインスタンスを生成し、二行目でmakeKeyAndVisibleメソッドを呼び出してるらしい。てか、allocってなんぞ?ちょっとググって調べたら、同じことを調べた人がいた。

要するに、Railsで言うところのnewメソッドと同じなんだって!

んで、initWindowFrameは画面の表示する座標とサイズを指定するはず。じゃ、初期値として与えられてる引数を読み解けばいいよね。

UIScreen.mainScreen.boundsってなんぞや。。。どっかにクラスとメソッドの公式ドキュメントあったら教えてくれー!どこにあるかわからん。

まぁ、英語の意味からUIScreenは、スクリーンについてのクラスでmainScreenは、メインスクリーンを選択してboundsは境界だからスクリーンいっぱいって意味なんだろうなきっと。

makeKeyAndVisibleメソッドに関しては、説明があるね。このwindowは一つのタッチイベントを受信し画面上に表示するということだそうです。

次にUIViewのインスタンスの引数にCGRectMake(x, y, w, h)をいれてる。CGRectは実際に描画する何かのオブジェクトってことね。んで、引数4つで指定すると。

んー、UIViewのサブクラスがUIWindowなんだから、前面にCGRectが来るってことか。

じゃ、実際に実行してみようー^^

見事にエラーになった。。。なんか、makeKeyAndVisibleのところでこけてるっぽい。

色々調べたけどよくわからんので、一旦保留しよっか。誰か教えてけろ。。。

てか、インスタンス変数@windowって結局、どんなインスタンスが作られてんの?一旦、「@window.makeKeyAndVisible」をコメントアウトして確認。

ターミナルで、確認。

(main)>UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds).instance_variables
# []

何にもないんかい!!!書かないけど、定義されてるインスタンスメソッドは、クッソ大量にあった。

あー、なんでエラーなってんのかよくわからん!とりあえず、実行してみる。

だめだー!表示されない!さっきの、「makeKeyAndVisible」を使わないとだめなのか?

とりあえず、ここで書いてあることはシンプルなので後で考えよう。

まとめ
・画面上のすべてのものは UIView です。
・アプリケーションの基本となるビューは UIWindow のインスタンスです。ほかのビューは UIWindow の子孫です。 UIWindow を delegate で作成します。
・ビューはサブビューを持っていて、UIView#addSubview で追加します。サブビューはお互いの上に積み重ねられます。

Ruby Motionチュートリアルやってみた(3)に続く。


サポートしていただけると、泣いて喜びます! 嬉しくて仕事をめちゃめちゃ頑張れます。