沿Y轴和X轴缩放核心图独立
我使用下面的代码沿着X轴Y轴和缩放滚动我的核心图。它的工作正常。但是当我放大我的核心情节时,它会放大两个方向。如果我沿x方向捏住,我想让图形沿X缩放,如果沿着Y方向捏住,则缩放Y.请有人可以帮我解决这个问题。沿Y轴和X轴缩放核心图独立
-(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;
}
保持轴和标题在正确的位置,最简单的方法是使用axisConstraints
用于轴与离开titleLocation
在它的NAN的默认。这将减轻您的代表更新这些项目的责任,您可以专注于缩放。
在这两种代表方法中,您只需要-plotSpace:willChangePlotRangeTo:forCoordinate:
。另一个只在滚动时调用。
决定是否允许缩放发生在x或y(请参阅原始问题的评论中的链接)。检查委托方法中的coordinate
参数;返回newRange
以允许缩放发生或[space plotRangeForCoordinate:coordinate]
恢复原始范围并防止缩放。
如果您需要使用您自己的手势识别器来检测夹角,请在主机视图上将allowPinchScaling
设置为NO以禁用内置识别器。将您自己的识别器添加到托管视图。在处理程序方法中,决定要缩放哪个轴(如果有)并相应地调整适当的绘图范围。如果你这样做,你根本不需要剧情空间委托。
我希望缩放既在X和Y中发生,也是独立的,这意味着如果我沿x轴捏住x轴必须缩放,酒吧的高度必须增加。 – Kashyap 2012-07-20 15:15:26
我正在使用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;
}
虽然我确实感到困惑,你希望发生的事情,如果你只在一个放大什么阅读本http://*.com/q/3559577/1487063 – Dustin 2012-07-19 18:52:11
方向......你会改变比率吗?这不是真的缩放,你可能需要重绘。 – Dustin 2012-07-19 18:54:19
是否有可能没有使用pinchgesture作为核心阴谋本身允许检测捏 – Kashyap 2012-07-19 18:55:28