我目前在图层中有一个地图(tilemap),我想使用以下代码进行平移/缩放:
- (void) pinchGestureUpdated: (UIPinchGestureRecognizer *) recognizer {
if([recognizer state] == UIGestureRecognizerStateBegan) {
_lastScale = [recognizer scale];
CGPoint touchLocation1 = [recognizer locationOfTouch:0 inView:recognizer.view];
CGPoint touchLocation2 = [recognizer locationOfTouch:1 inView:recognizer.view];
CGPoint centerGL = [[CCDirector sharedDirector] convertToGL: ccpMidpoint(touchLocation1, touchLocation2)];
_pinchCenter = [self convertToNodeSpace:centerGL];
}
else if ([recognizer state] == UIGestureRecognizerStateChanged) {
// NSLog(@"%d", recognizer.scale);
CGFloat newDeltaScale = 1 - (_lastScale - [recognizer scale]);
newDeltaScale = MIN(newDeltaScale, kMaxScale / self.scale);
newDeltaScale = MAX(newDeltaScale, kMinScale / self.scale);
CGFloat newScale = self.scale * newDeltaScale;
//self.scale = newScale;
[self scale: newScale atCenter:_pinchCenter];
_lastScale = [recognizer scale];
}
}
- (void) scale: (CGFloat) newScale atCenter: (CGPoint) center {
CGPoint oldCenterPoint = ccp(center.x * self.scale, center.y * self.scale);
// Set the scale.
self.scale = newScale;
// Get the new center point.
CGPoint newCenterPoint = ccp(center.x * self.scale, center.y * self.scale);
// Then calculate the delta.
CGPoint centerPointDelta = ccpSub(oldCenterPoint, newCenterPoint);
// Now adjust your layer by the delta.
self.position = ccpAdd(self.position, centerPointDelta);
}
我的问题是变焦在夹点的中心没有生效,即使我试图在我通过这种方法放大的同时改变它:(void) scale: (CGFloat) newScale atCenter: (CGPoint) center
。有什么理由可能不会发生这种情况吗?另外,我如何将捏的中心位置转换为我的场景/图层的坐标系?
答案 0 :(得分:1)
在我的方法中,一切都很好。我遇到的问题是,层anchor point
与我定义的地图不同,后者在缩放期间引入了偏移。我必须将两个锚都设置为ccp(0,0)
。
从捏手势的中心到图层的屏幕坐标的对齐是正确的,并且在使用UIKIt gesture recognizers
时可以通过以下说明获得:
CGPoint centerGL = [[CCDirector sharedDirector] convertToGL: ccpMidpoint(touchLocation1, touchLocation2)];
_pinchCenter = [self convertToNodeSpace:centerGL];
答案 1 :(得分:0)
首先,你不能这样做([识别器状态] == UIGestureRecognizerStateBegan)因为状态是位域!所以你必须这样做:
([识别器状态]和UIGestureRecognizerStateBegan)
捏的中心位置基本上是在屏幕的坐标上。至于如何将其转换为自己的坐标系,您需要弄清楚设备屏幕上的边界是手势开始时显示的场景/图层部分。这将是10,10 x 200,200或类似的坐标,代表屏幕的像素网格。然后你必须在你自己的应用场景/图层的坐标系中找出10,10映射到的内容,以及200,200映射到的内容。从那里,您可以导出一个因子应用于捏合手势中心的屏幕坐标,这会将捏合手势的屏幕坐标转换为场景/图层坐标。
你要做的事情很棘手,因为当你缩放场景/图层时,你的中心会围绕一个不在视图中心的点进行缩放。我敢肯定,如果你在一个与地图相关的应用程序中查看一些Apple的示例代码,你可能会发现一些具有这种缩放缩放的方法示例。
我希望这会有所帮助。