2018年4月4日水曜日

モーダル範囲外のタッチを判定

タッチした際にモーダル等の矩形の範囲内外を判定する方法です。
  • Xcode 8.3.3
  • Swift 3.1
import UIKit

class ExampleViewController: UIViewController {
  private var _Dismiss: Bool = false
  private let TAG: Int = 100

  override func viewDidLoad() {
    super.viewDidLoad()

    self.view.backgroundColor = UIColor.gray
    _Dismiss = false

    let viewAdd = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 400))
    viewAdd.backgroundColor = UIColor.white
    viewAdd.center = self.view.center
    viewAdd.tag = TAG
    self.view.addSubview(viewAdd)
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
  }

  override func touchesBegan(_ touches: Set<uitouch>, with event: UIEvent?) {
    if _Dismiss {
      return
    }

    let point = touches.first?.location(in: self.view)
    let viewAdd: UIView = self.view.viewWithTag(TAG)! as UIView

    if !viewAdd.frame.contains(point!) {
      _Dismiss = true
      // 範囲外をタッチした時の処理
    }
  }
}

touchesBeganなので指が画面に触れた時のイベントです。
touchesEndedにすれば指が画面から離れた時のイベントになります。
ただ、touchesBeganに画面制御を記述すると反応の早い、ユーザビリティの高いアプリとユーザに判断されます。まぁこれも使い所次第ですが😅
課金とかにtouchesBeganで処理されたら私は速攻アプリアンインストールします😅
なんか信用出来ないですからね…

というかUIがボタンならBeganでselectな制御(グレースケールしたりとか縮小させたりとか)して、Movedで範囲内外を判定、Endedで範囲内(というかBeganで触ったものと同一のままならとか)ならselectedな制御して範囲外なら何もしない(タッチ状態フラグを解除程度)みたいな制御が普通ですね。

こういう制御例ってあまりネットに載らないですよね😇
各社ノウハウとして溜まってるだけで。
まぁ気が向いたらその辺も公開していきます🙌掲載するコード量がとんでもないことになりそう😇

0 件のコメント:

コメントを投稿