コース: Objective-C 基本講座
UIViewをピンチジェスチャーでリサイズする
このレッスンでは PinchGesture に対応する― 方法について学習します UITapGestureRecognizer と 名付けられているように タップもジェスチャーには違いありませんが もう少し iPhone らしく 2 本指を使ったジェスチャーに 対応してみましょう UIPinchGestureRecognizer を使って ピンチジェスチャーに対応してみます ピンチジェスチャーは ズームイン・ズームアウトに使う ジェスチャーです 使い方はUItapGestureRecognizer と同じですが こちらは指が画面から離れていない間は 指の位置が変わる度に 指定したメソッドが繰り返し呼び出されます またスケールという 2本の指が最初に認識された 位置を基準とした比率が 入っているプロパティを持っていて 常に更新されています この値をズーム比率に使えば ピンチジェスチャーに合わせて UIView を拡大 縮小できるわけです 実際にやってみましょう Xcode の画面に切り替えます ピンチジェスチャーによって 変更する UIView を インスタンス変数として1 つ用意しています 名前はbishop です UIPinchGestureRecognizer 自体は self.view に登録し ピンチジェスチャー用の メソッドでは受け取った― UIPinchGestureRecognizer の scale プロパティを使って その倍率にスケーリングする Affin 行列を作り bishop の transform プロパティに 設定しました ランします 2 本指をシュミレーションするには オプションキーを使います 指の間に合わせて bishop が大きくなったり 小さくなったりします ただ 今だと2 本指で触った時に 毎回 scale が 1 に リセットされるので ピンチの繰り返しで ズームすることができません この点を改善してみましょう 説明画面に戻ります この問題は bishop の拡大率を インスタンス変数に持ち UIPinchGestureRecognizer の スケール は この拡大率を変更するために 使うことで解決します ピンチの開始で UIPinchGestureRecognizer の スケールが 1 になるので この時点の拡大率を記憶し 指先の変化時には記憶していた拡大率に UIPinchGestureRecognizer の スケールをかけ それを bishop の新しい拡大率にする こうすることで 連続したズームが できるようになります そのためにはジェスチャーの 開始による呼び出しと 指先の変化による呼び出しを 区別する必要があるのですが これには UIPinchGestureRecognizer の 派生元の UIGestureRecognizer の state プロパティが使えます state はメソッドを呼び出した時の 状況を説明するもので 開始時には UIGestureRecognizerStateBegin が設定され 指の変化時には UIGestureRecognizerStateChanged が設定されています 実際にやってみましょう Xcode の画面に切り替えます インスタンス変数に bishop の 拡大率としてscale そしてピンチ開始時の拡大率を覚えておく― lastScale を加え ViewDidLoad では scale を1.0 に初期化します pinch メソッドでは if 文で state ごとに処理をわけます state にはほかに Ended やCanceled などもあり 必要に応じて使い分けるといいでしょう Canceled は例えばジェスチャー中に 電話がかかったりして ジェスチャー認識が 中断された時などに発生します 連続したズームが可能となりました このレッスンではピンチジェスチャーに 対応する方法について学習しました
エクササイズファイルを使って実践してみましょう。
インストラクターがコースで使用しているファイルはダウンロードできます。見て、聞いて、練習することで、理解度を深めることができます。