ビギグラマーのノート

自作PCやプログラミングについてのブログです。

【Swift】ScrollView 内にImageViewがある時zoomの変更に注意を!

はじめに

 ScrollViewはiOSの設計の中でもかなり重要なファクターを担っており、これをせいするものがSwiftを制すとも言われます。私が言っているだけですが...

 ScrollViewにImageViewを入れて画像を表示したいというのは非常に多い場面だと思います。その際のZoom指定で数時間悩んだのでメモを残しておきます。

やりたいこと

 これは非常にシンプルでScrollView内の画像を入れ替えた際に画面にちょうど良い形でZoomが行われることを目標にしています。

f:id:BegiGrammer:20190616011233g:plain

To Do

 このようにShow1Btnを押すとScrollViewに青空が、Show2Btnを押すとピザが表示されるようにします。さらに両者のサイズに合わせてZoomを自動で計算し、よしなに表示するようにします。

問題点

 これを実現するために作ったコードは非常に単純で以下のようにしました。

 しかしこれをただ単純にImageViewにImageを挿入後、ImageViewのサイズを整え、ScrollViewのcontentSizeを変更した後に実行したところ以下のようになりました。

f:id:BegiGrammer:20190616012235g:plain

Failure

 1枚目のリサイズはうまく言っているのですが、2枚目以降のリサイズができていないことがわかります。非常に簡単なことなのにここでつまずくかと、ストレスを溜めて画面パンチしそうになる手を押さえつけしばらく考えていました。

解法

 結局しばらく考えたのちに以下のような答えにたどり着きました。

 すなわち言葉では言い表しにくいのですがScrollViewのZoom関係の設定では、Propertyが変更されると現在の倍率の1/x倍して等倍に戻してから次の倍率を再計算しているのでしょう。もしくはこれと同じ結果になる前回と次回の倍率の差か... こっちの方が計算量少ないですかね

 そのためX倍した状態でScrollViewの中のViewのサイズを変更し倍率を変えた時、変更されたViewに1/Xが掛けられ等倍に戻せて無い状態から更に指定された倍率にしようとした結果おかしな状態になるのだと思います。

 教訓としては、「ScrollViewのSubViewnのサイズ変更をするときはZoomを1倍に戻してから変更しないと危ないよ」ということでした。

正解のコード