UIView。スケーリングを1次元のみに制限する方法
-
07-07-2019 - |
質問
UIViewのインスタンスを含むUIScrollviewのインスタンスがあります。 UIViewは、UIImageViewインスタンスの水平配列の単なるコンテナです。 -ズームは、UIScrollViewおよびUIScrollViewDelegateによって提供されます。垂直方向の拡大縮小をまったく行わず、水平軸に沿ってのみズームが発生するように制限したいと思います。どうすればいいですか?
たとえば、UIViewをサブクラス化し、適切なメソッドをオーバーライドして、垂直スケーリングを防ぐ方法はありますか?私はこのアプローチが好きですが、どのメソッドをオーバーライドするのか、そしてオーバーライドされたメソッドが実際に何をすべきなのかはわかりません。
乾杯、 ダグ
解決
この回答、UIViewサブクラスを作成し、-setTransform:accessorメソッドをオーバーライドして、UIScrollViewがUIViewに適用しようとする変換を調整できます。このUIViewを設定して、コンテンツサブビューをホストし、UIScrollViewのサブビューにします。
オーバーライドされた-setTransform:内で、UIScrollViewが適用する変換を取り込んで、スケーリングが一方向にのみ有効になるように調整する必要があります。 CGAffineTransformマトリックスの構築方法に関するドキュメント、次の実装はスケーリングを水平方向に沿って制限する必要があると思います:
- (void)setTransform:(CGAffineTransform)newValue;
{
CGAffineTransform constrainedTransform = CGAffineTransformIdentity;
constrainedTransform.a = newValue.a;
[super setTransform:constrainedTransform];
}
他のヒント
OS 3.0を使用すると、スクロールビューで四角形にズームするようズームに指示できます。タップを検出するロジックにこれがあります。
CGRect zoomRect = [self zoomRectForScale:newScale withCenter:CGPointMake(tapPoint.x, tapPoint.y) inScrollView:scrollView];
[scrollView zoomToRect:zoomRect animated:YES];
他の部分では、新しいフレームが元のフレームに対して持っている比率で画像ビューを拡大し、同じ中心点に中心を合わせなければなりません。ズームアニメーションと同じタイミングのアニメーションでこれを行うと、見た目が良くなりますが、これが唯一の方法だと思います。
scrollViewDidZoom:で、 zoomScale に基づいてコンテンツビューの変数を調整し、 zoomScale を1.0にリセットしてから、 setNeedsDisplay コンテンツビューのstrong>。コンテンツビューの drawRect:で実際のズーム(任意の方向)を処理します。
Uい詳細:
-
ズームの進行中、UIScollViewは contentOffset および contentScale を変更するため、これらの以前の値を scrollViewWillBeginZooming:に保存し、 scrollViewDidZoom:で、ズームに従って新しい contentOffset を自分で計算できます。
-
zoomScale を変更するとすぐに別の scrollViewDidZoom:が起動されるため、 zoomScale をリセットする前(およびその後)にBOOLを設定する必要があります>。 scrollViewDidZoom:の開始時にBOOLをテストし、trueの場合に戻ります。
-
ズームの進行中に scrollViewDidScroll:を禁止する必要がある場合があります(BOOLをテストします。 scrollViewWillBeginZooming:で設定し、でクリアしますscrollViewDidEndZooming:)ので、ズームの進行中に独自のcontentOffsetsが使用されます。