読者です 読者をやめる 読者になる 読者になる

woshidan's blog

そんなことよりコードにダイブ。

タッチベントの処理とタイマーの処理について

内容

上の本を参考にiOSのUIViewと戯れています。

  • タッチベントの処理
    • UIResponder
    • 画面の再描画
    • タッチ位置の取得
    • ルートビューコントローラの取得
  • タイマーの処理
    • UIImageとUIImageViewの違い
    • タイマーの設定

タッチベントの処理

UIResponder

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIResponder_Class/

UIViewクラスとUIApplicationクラスのスーパークラスで、タッチ操作に関するイベントを取得、処理できます。

タッチイベントの操作を行いたいときは、このクラスのメソッドをオーバーライドします。

タッチ開始時

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

タッチ移動時

func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?)

タッチ終了時

func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?)

タッチキャンセル時

func touchesCanceld(touches: Set<UITouch>, withEvent event: UIEvent?)

画面の再描画

func setNeedsDisplay()

サンプルでは、タッチイベントを取得 => タッチイベントをプロパティに => 再描画 としていましたが、これ子Viewの一部を再描画などでなくて大丈夫なのかな(いちいち全体再描画するのはちと怖いな)、みたいなことを思ってしまった...。

タッチ位置の取得

UITouch#locationInView(view: UIView?) -> CGPoint

ルートビューコントローラの取得

ルートビューコントローラから3Dタッチが利用可能かの設定が取得できます。

ルートビューコントローラは下記の手順で取得します。

  • UIApplicationクラスのsharedApplicationでUIApplicationオブジェクトを取得
  • UIApplicationクラスのkeyWindowプロパティ、またはwindowsプロパティからウィンドウを取得
  • windowクラスのrootViewControllerプロパティでルートビューコントローラを取得

ルートビューコントローラから3Dタッチが利用可能かなどの設定は、UIViewControllerクラスのtraitCollectionプロパティを通して取得できる、UITraitCollectionクラスのオブジェクトから取得できます。このUITraitCollectionクラスのオブジェクトには端末の特徴的な情報(縦方向, 横方向のサイズ, 画面のスケール, UIの種類...)が入っています。

タイマーの処理

UIImageとUIImageViewの違い

補完でUIImageViewがでてきて、あれ、UIImageを違うの?と思ったので確認。

UIImage

https://developer.apple.com/reference/uikit/uiimage

画像データをiOSのプラットフォームで取り扱うためのクラス。Immutableなクラスなので利用する時はいつも既存のデータからこのオブジェクトを作成するっぽい。

Drawable的な。

UIImageView

https://developer.apple.com/reference/uikit/uiimageview

一連のアニメする画像あるいは静止画像を表示するためのView.アニメの開始 & 停止のメソッドも生えてるみたいです。

ImageView的な。

タイマーの設定

var _timer = NSTimer.scheduledTimerWithTimeInterval(
                定時処理を行う時間の間隔,
                target: self,
                selector: "onTick:", // 時間になった時実行するメソッド名 
                // deprectedみたいな警告出てたので実際使う時は調べ直す
                userInfo: nil,
                repeats: true) // 繰り返し処理を行うかどうか
// タイマーの停止
_timer.invalidate()
_timer = nil