画像のズームやスクロール時の挙動を細かく設定する。画像のズームやスクロール時の挙動を細かく設定する。本記事ではUIScrollView(以下、スクロールビュー)の設定について説明する。デバイス画面にスクロールビューを配置し(下図赤枠)、黄緑枠のアトリビュートインスペクタボタンを押すと設定項目の一覧が表示される。Styleスクロールしたときにスクロールビューの下端と右端に表示されるスクロールバーの色を「Default」、「Black」、「White」の中から選択する。下図は「White」を指定した場合。Indicatorチェックを外した場合、下端のスクロールバーが表示されなくなる。バーが表示されないだけでスクロールはできる。Indicatorチェックを外した場合、右端のスクロールバーが表示されなくなる。バーが表示されないだけでスクロールはできる。Enabledチェックが入っていると、スワイプで画面をスクロールできる。いつも通りということだ。Enabledチェックを入れると、スクロールビューの幅または高さぶん移動するとスクロールがピタッと止まるようになる。電子書籍のページをめくるような感覚。Enabledチェックを入れると、1回のドラッグ&ドロックは水平方向または垂直方向のどちらか一方向しか移動できなくなる。Bouncesチェックが入っていると、端にゴムがついついているかのようにスクロールビューが弾む。Horizontally部品の幅がスクロールビューより小さいと、水平方向にドラッグしてもスクロールやゴムのような弾みは通常おきないが、これにチェックを入れると水平方向の弾みが発生する。Vertically部品の高さがスクロールビューより小さいと、垂直方向にドラッグしてもスクロールやゴムのような弾みは通常おきないが、これにチェックを入れると垂直方向の弾みが発生する。Zoomスクロールビューをズームイン、ズームアウトする倍率の最小倍率(Min)と最大倍率(Max)を指定する。スクロールビューにズームの機能を持たせるには以下のコードのように、スクロールビューのデリゲートメソッドである「ズームする部品を返すメソッド」を実装する。検証では最小倍率を0.5、最大倍率を2.0に設定した。要するに、縮小は縦横2分の1まで、拡大は縦横2倍まで可能ということだ。実装を試してみる人はこのサンプル画像をご利用されたし。//スクロールビューを作成する。//イメージビューを作成する。//ズームの最大最小倍率を設定する。//デリゲート先に自分を設定する。{super.viewDidLoad()//スクロールビューを作成する。1000)//イメージビューを作成する。1000)//部品を登録する。testScrollView.addSubview(testImageView1)self.view.addSubview(testScrollView)//ズームの最大最小倍率を設定する。2.0//デリゲート先に自分を設定する。Zoomチェッックが入っていると、ズームしたときにゴムがついたように弾む。Touchesチェックが入っていると、スクロールビュー内の部品のタッチ判定を遅らせることができる。以下の動画のようにスクロールビューの中にボタンがあるとする。このボタンの上でドラッグを開始すると、ボタンのタッチ判定が若干遅れてスクロール判定が先に行われる。その結果、ボタンを押したことにはならずに画面がスクロールする。ドラッグを開始からスワイプせずにもたもたしているとボタンのタッチ判定が行われる。チェックを入れなかった場合は、部品のタッチ判定が即座に行われる。そのためボタン押下が優先されてスクロールは発生しない。別の場所でドラッグすればいつもどおりスクロールできる。Touchesチェックが入っていると、タッチ判定をキャンセルできるようになる。いっても、そのままでは「キャンセルしない」が常に返ってくるのでチェックを入れても入れなくても同じ結果になる気がする。「キャンセル(しない)をできる。名前と意味で混乱しそうだ。わかりづらいので使用例を挙げておこう。下図のようにスクロールビューの上に2つのボタンがあったとする。ボタン1の上でドラッグ&ドロップした場合は必ずスクロールしたいが、ボタン2の上でドラッグ&ドロップした場合はスクロールしたくない。そんなときにこの機能を使う。上記の機能を実装してみよう。ViewController.swiftを以下のように変更する。検証時間を短縮するために、部品の追加、設定の変更はソースコードで行っている。試してみる人は次のサンプル画像をご利用されたし。⇒「サンプル画像」タッチ判定の有無はソースコードで制御するので、タッチ判定を遅延させる必要は無い。delayContentTouchesプロパティはfalseに設定している。//スクロールビューを作成する。//イメージビューを作成する。//ボタンを作成する。//ボタンを作成する。//スクロールビューの設定を変更する。{super.viewDidLoad()//スクロールビューを作成する。568)//イメージビューを作成する。568)//ボタンを作成する。forControlEvents:.TouchUpInside)//ボタンを作成する。forControlEvents:.TouchUpInside)//部品を登録する。testScrollView.addSubview(testImageView1)testScrollView.addSubview(testImageView2)testScrollView.addSubview(button)testScrollView.addSubview(button2)self.view.addSubview(testScrollView)//スクロールビューの設定を変更する。.Normal)}}次に、UIScrollViewを継承した自作クラスを作り、「タッチ判定のキャンセル有無を返すメソッド」を追加する。ボタンの上でドラッグが開始されるたびにこのメソッドが呼び出されるので、引数で渡ってきた部品のタグ番号がボタン1と同じ場合はタッチ判定をキャンセルするためにtrueを返す。//タグ番号がボタン1のならタッチをキャンセルする。{//タグ番号がボタン1のならタッチをキャンセルする。super.touchesShouldCancelInContentView(view)}}以下が実際のプレイ動画。ボタン2の上ではどうやってもスクロールできなくなり、ボタン1の上ではゆっくりドラッグしてもスクロールできるようになった。interactively」の3つから選択する。dissmiss」は、キーボードはそのまま表示され続ける。drag」は、スクロールするとすぐににキーボードが閉じられる。interactively」は、指でキードードを外に押し出すことができる。大きい部品をスクロールして見る。Recognizerの使い方。2つの指で部品を回転させる。...【Swift】制約を変更してテキストフィールドやテキストビューがキーボードと被らないようにする方法。Controllerの設定。画面遷移のアニメーションを変更する。Controlを使ってページを移動する方法。コメントをキャンセルメールアドレスが公開されることはありません。