SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Objective-CユーザーのためのSwift入門

SwiftでアプリのUIと画面の操作を実装する

Objecive-CユーザーのためのSwift入門 第5回

  • X ポスト
  • このエントリーをはてなブックマークに追加

タッチの利用

 iOSアプリでは、UIViewクラス単位でタッチを検出してタッチ時の処理を行うことも可能です。前項までで紹介した方法以外で、単純なタッチに対する処理はタッチを利用して行うことができます。ビューコントローラーの画面もUIViewクラスですので、画面全体に対するタッチ等も容易に実装できます。

タッチイベントを利用する

 UIViewクラスは、画面のタッチや端末のシェイク等のイベントを管理するUIResponderクラスを継承しています。UIResponderクラスのメソッドでタッチ時に発生するイベントを検出でき、イベントが発生した際の処理を行うことができます。UIResponderクラスのタッチを検出するメソッドには次のものがあります。

タッチを検出するメソッド
名前 概要
touchesBegan(_:withEvent:) タッチ開始時の処理を指定
touchesMoved(_:withEvent:) タッチ中の処理を指定
touchesEnded(_:withEvent:) タッチ終了時の処理を指定

 各メソッドとも引数は同じで、記述する際にはoverrideをつけます。touchesBegan(_:withEvent:)メソッドを例にすると、書式は次のようになります。

書式2 touchesBeganメソッドの書式
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    // 処理を記述
}

 メソッド実行時に、タッチ情報を管理するUITouchオブジェクトが集合を表すNSSetオブジェクトとして、発生したイベントがUIEventオブジェクトとして得られます。具体的な利用例は次の通りです。

リスト4 タッチ利用の例(TouchViewController.swift抜粋)
// タッチ開始時
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        var touch = touches.anyObject() as UITouch  // NSSetの中からUITouchオブジェクトを取得
        var nowP : CGPoint = touch.locationInView(self.view)  // UITcouhの位置を取得
        SampleView.center = nowP  // タッチした場所に矩形を表示
        if SampleView.hidden { SampleView.hidden = false; }
}
// タッチ中
override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
        var touch = touches.anyObject() as UITouch
        var nowP : CGPoint = touch.locationInView(self.view)  // 現在タッチした位置
        var oldP : CGPoint = touch.previousLocationInView(self.view)  // 前回タッチした位置
        var deltaX : CGFloat = nowP.x - oldP.x  // 2点の差を現在の矩形の位置に加算して
        var deltaY : CGFloat = nowP.y - oldP.y  // 指が移動した位置に矩形を表示
        SampleView.center = CGPointMake(SampleView.center.x + deltaX, SampleView.center.y + deltaY)
 }
// タッチ終了時
override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
        if(!SampleView.hidden){ SampleView.hidden = true; }  // 矩形を非表示にする
}

 各メソッドでタッチ情報はNSSetオブジェクトで渡されますので、NSSetのanyObject()メソッドでその中の1つのタッチ情報を取り出します。タッチされた位置を得るには、UITouchオブジェクトのlocationInView(_:)メソッドを利用して、配置されているビュー内のCGPointオブジェクトを参照します。実行結果は次の通りです。

タッチ利用の例
タッチ利用の例

 タッチ開始時にタッチされた場所に矩形を表示します。タッチしたまま指を動かすと、その動きに矩形がついていきます。指を離すと矩形を非表示にします。

タップの回数/タッチした時間に応じて処理を行う

 間髪を入れずにタッチを行なった場合、touchesBegan(_:withEvent:)メソッドで複数のタッチを検出することができます。タッチの個数はUITouchオブジェクトのtapCountプロパティで参照できます。また、タッチイベントが発生した日時は、タイムスタンプとしてUIEventオブジェクトのtimestampで参照できます。これらのプロパティを利用することで、タップの回数やタッチの長さに応じて処理を行うことも可能です。

リスト5 タッチ利用の例(TouchViewController.swift抜粋)
// タッチ開始時
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        var touch = touches.anyObject() as UITouch
        var count : Int = touch.tapCount  // タッチの回数を取得
        label.text = "\(count)"
        time = event.timestamp  // イベントのタイムスタンプをshutoku
}
// タッチ終了時
override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
        var diff : NSTimeInterval = event.timestamp-time!  // タッチ開始時と終了時のタイムスタンプの差を取得
        if diff < 0.5 {
            timeLabel.text = "Short Tap"
        }else{
            timeLabel.text = "Long Tap"
        }
}

 UIResponderクラスのメソッドを利用することによって、ダブルタップ等の連続したタップや長押しがなされた場合の処理を行うことができます。実行結果は次の通りです。

タッチ利用の例
タッチ利用の例

まとめ

 今回はアプリの動作時の処理にいて基本的な説明を行いました。次回は、SwiftからObjective-Cを呼び出す方法とObjective-Cで作成されているライブラリの利用の仕方について説明します。

参考資料

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Objective-CユーザーのためのSwift入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 片渕 彼富(カタフチ カノトミ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8473 2015/03/05 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング