2

以下のコードを使用して、コア プロットを X 軸 Y 軸に沿ってスクロールし、ズームしています。その正常に動作します。しかし、コアプロットをズームすると、両方の方向にズームします。x方向にピンチするとXに沿ってズームし、Y方向にピンチするとYにズームします。誰かがこれを手伝ってくれませんか。

-(CGPoint)plotSpace:(CPTPlotSpace *)space willDisplaceBy:(CGPoint)displacement
{
    return CGPointMake(displacement.x, displacement.y);
}

-(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate
{                                                                                                                                                                                                                                           
    // Adjust axis to keep them in view at the left and bottom;
    // adjust scale-labels to match the scroll.

    CPTXYAxisSet *axisSet = (CPTXYAxisSet *)self.hostView.hostedGraph.axisSet;
    if (coordinate == CPTCoordinateX) {
        axisSet.yAxis.orthogonalCoordinateDecimal = newRange.location;
    }

    else {
        axisSet.yAxis.titleLocation = CPTDecimalFromFloat(newRange.locationDouble +                                                  (newRange.lengthDouble / 2.0F));
    }

    return newRange;
}
4

2 に答える 2

1

軸とタイトルを正しい位置に維持する最も簡単な方法は、軸に を使用し、をデフォルトの NAN のaxisConstraintsままにすることです。titleLocationこれにより、これらのアイテムを更新する責任を委任する必要がなくなり、ズームに集中できます。

これら 2 つのデリゲート メソッドのうち、必要なのは-plotSpace:willChangePlotRangeTo:forCoordinate:. もう 1 つはスクロール時にのみ呼び出されます。

xまたはyでズームを許可するかどうかを決定します(元の質問のコメントのリンクを参照してください)。coordinateデリゲート メソッドのパラメーターを確認してください。を返してnewRange、ズームを許可するか[space plotRangeForCoordinate:coordinate]、元の範囲を復元してズームを防止します。

独自のジェスチャ レコグナイザーを使用してピンチ アングルを検出する必要がある場合はallowPinchScaling、ホスティング ビューで NO に設定して、組み込みのレコグナイザーを無効にします。独自のレコグナイザーをホスティング ビューに追加します。ハンドラー メソッドで、スケーリングする軸 (存在する場合) を決定し、それに応じて適切なプロット範囲を調整します。このようにすれば、プロット スペース デリゲートはまったく必要ありません。

于 2012-07-19T23:40:52.070 に答える
0

UIPinchGestureRecognizer を使用して X 座標と Y 座標の変化を計算し、プロット範囲を変更する方向 (X または Y) を決定しています。問題なく動いていますが、通常のズームほど滑らかではなく、反応が遅いです。誰かがこれを行うためのより良い方法を提案できますか

- (void)handlePinchGesture:(UIPinchGestureRecognizer *)gestureRecognizer{
       if ([gestureRecognizer state] == UIGestureRecognizerStateBegan){

        CGPoint translation = [gestureRecognizer locationInView:hostView];
       NSLog(@"Sender value %f %f", translation.x,translation.y );
        initialX = translation.x;
        initialY = translation.y;        
        return;   
} 
else if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged){
                NSLog(@"inside else");
        CGPoint currentTouchLocation = [gestureRecognizer locationInView:hostView];
        NSLog(@"currentTouchLocation = %f and  %f and ",currentTouchLocation.x, currentTouchLocation.y);
            finalX = currentTouchLocation.x;
            finalY = currentTouchLocation.y;
                  }
}
-(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate
{
    float x = fabsf(finalX - initialX) ;
    float y = fabsf(finalY - initialY);
    NSLog(@"pinch x = %f  pinch y = %f", x, y);
      CPTPlotRange *updatedRange = nil;

    if (x > y) {
        switch ( coordinate ) {
            case CPTCoordinateX:
                NSLog(@"x is greater than y change x-range");

                if (newRange.locationDouble < 0.0F ) {
                    CPTMutablePlotRange *mutableRange = [[newRange mutableCopy] autorelease];
                  mutableRange.location = CPTDecimalFromFloat(0.0);
                    updatedRange = mutableRange;
                }
                else {
                    updatedRange = newRange;
               }
                break;
            case CPTCoordinateY:
                NSLog(@"x is greater than y keep y range constant");

                updatedRange = ((CPTXYPlotSpace *)space).yRange;
                break;

        }

            }

    if (x < y) {
        switch ( coordinate ) {
            case CPTCoordinateX:
                NSLog(@"y is greater than x keep x-range constant");

                updatedRange = ((CPTXYPlotSpace *)space).xRange;
                                break;
            case CPTCoordinateY:
                if (newRange.locationDouble < 0.0F) {
                    NSLog(@"y is greater than x increase y range");
                    CPTMutablePlotRange *mutableRange = [[newRange mutableCopy] autorelease];
                  //  mutableRange.location = CPTDecimalFromFloat(0.0);
                    updatedRange = mutableRange;
                }
                else {
                   updatedRange = newRange;
                }

                break;

        }

    }
    if (x == y) {
        switch ( coordinate ) {
            case CPTCoordinateX:
                NSLog(@"y is equal to  x keep x-range constant");
                updatedRange = ((CPTXYPlotSpace *)space).xRange;
                break;
            case CPTCoordinateY:
                NSLog(@"y is equal to x keep y-range constant");
                //NSLog(@"%d", CPTCoordinateY);
                updatedRange = ((CPTXYPlotSpace *)space).yRange;
                break;

        }

    }



      return updatedRange;



}
于 2012-07-27T15:32:33.983 に答える