質問

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 。コンテンツビューの drawRect:で実際のズーム(任意の方向)を処理します。

Uい詳細:

  1. ズームの進行中、UIScollViewは contentOffset および contentScale を変更するため、これらの以前の値を scrollViewWillBeginZooming:に保存し、 scrollViewDidZoom:で、ズームに従って新しい contentOffset を自分で計算できます。

  2. zoomScale を変更するとすぐに別の scrollViewDidZoom:が起動されるため、 zoomScale をリセットする前(およびその後)にBOOLを設定する必要があります>。 scrollViewDidZoom:の開始時にBOOLをテストし、trueの場合に戻ります。

  3. ズームの進行中に scrollViewDidScroll:を禁止する必要がある場合があります(BOOLをテストします。 scrollViewWillBeginZooming:で設定し、でクリアしますscrollViewDidEndZooming:)ので、ズームの進行中に独自のcontentOffsetsが使用されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top