1

ユーザーがピンチまたはダブルタップしてズームしたときに、x 方向にのみストレッチしようとしているビュー (スクロールビューでズームされたビュー) があります。このビューは常に描画されています: Core Graphics を使用してグラフを描画し、1 秒あたり最大 10 回まで。

したがって、次のように setTransform をオーバーライドします。

- (void)setTransform:(CGAffineTransform)newValue;
{
    CGAffineTransform constrainedTransform = CGAffineTransformIdentity;
    constrainedTransform.a = newValue.a;
    [super setTransform:constrainedTransform];
}

そして、これにより、1 つの大きな問題を除いて、通常、私が望む動作が得られます。ビューが非常に頻繁に描画され、ユーザーがダブルタップしてズームインすると、ビュー全体が真っ暗になることがよくあります。上記のメソッドをオーバーライドしないと、これはめったに発生しません (ただし、それでも時々発生します)。また興味深いのは、ユーザーがピンチ ジェスチャを使用してズームすると、これが発生しないことです。これは、ダブルタップによってトリガーされる機能です。

- (void)handleDoubleTap:(UIGestureRecognizer *)gestureRecognizer 
{
    CGRect frame = [[self tiledScrollView] frame];
    float newScale = [[self tiledScrollView] zoomScale] * kZoomStep;
    CGRect zoomRect = [self zoomRectForFrame:frame withScale:newScale withCenter:[gestureRecognizer locationInView:[[self tiledScrollView] tileContainerView]]];
    [[self tiledScrollView] zoomToRect:zoomRect animated:YES];
}

ピンチ ジェスチャは、UIScrollView のストック ピンチ レコグナイザーによって処理されます。上記の関数について気になることの 1 つは、ビューが一方向にしかスケーリングされないにもかかわらず、zoomRect が x 方向と y 方向の両方にスケーリングされることです。zoomRect を x 方向のみにスケーリングしてから zoomToRect を呼び出してみましたが、グラフはズームしません。

したがって、UIScrollView のピンチ認識エンジンと私のダブルタップ認識エンジンは 2 つの異なる方法でビューをスケーリングし、ピンチ認識エンジンの方法だけが私のコードで機能するようです...また、この問題は描画速度が遅くなると非常にまれになり、描画は行われていません。キューを使用して描画とズームをシーケンシャルにしようとしましたが、うまくいきませんでした。zoomToRect やその他のズーム方法は、タスクを他のスレッドなどにディスパッチする可能性があると思われるため、そのように順次処理することはできないと思います。しかし、これは私がもっと調べるべきものですか?

どんな助けでも大歓迎です。私はすでにこれを修正しようとして何日も無駄にしました-_-ありがとう

4

0 に答える 0