使用新框架转换后的 UIView 的新中心点
New center point for transformed UIView with new frame
我一直在开发一个 iOS 应用程序,它应该显示室内蓝图。您应该能够在楼层之间切换,并且每个楼层图像都由手势识别器控制以处理平移、旋转和缩放。
我一直在为手势识别器使用这个例子:https://github.com/GreenvilleCocoa/UIGestures/blob/master/UIGestures/RPSimultaneousViewController.m
那么现在进入问题。每当用户切换楼层时,我想保持图像的变换以及相应的中心 lat/lng。然而,新图像可以有另一个旋转偏移和纵横比。
我已经能够用新的尺寸更新图像的新帧并用新的旋转偏移更新变换并验证它。当我尝试计算新的中心点时,我无法让它工作。下面的代码是我目前的做法,只要视图不旋转,它就可以工作:
-(void)changeFromFloor:(int)oldFloorNr toFloor:(int)newFloorNr
{
CGPoint centerPoint = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);
// This is the old non transformed center point.
CGPoint oldCenterOnImage = [self.layer convertPoint:centerPoint toLayer:self.mapOverlayView.layer]; // Actual non transformed point
// This point is verified to be the corresponding non transformed center point
CGPoint newCenterOnImage = [self calculateNewCenterFor:oldCenterOnImage fromFloor:oldFloorNr toFloor:newFloorNr];
// Change image, sets a new image and change the fram of mapOverlayView
[self changeImageFromFloor:oldFloorNr toFloor:newFloorNr]
// Adjust transformed rotation on map if new map have different rotation
[self adjustRotationFromFloorNr:oldFloorNr toFloorNr:newFloorNr];
CGPoint centerOfMapOverlay = CGPointMake((self.mapOverlayView.frame.size.width / 2), (self.mapOverlayView.frame.size.height / 2));
CGPoint newCenterOnImageTransformed = CGPointApplyAffineTransform(newCenterOnImage, self.mapOverlayView.transform);
CGFloat newCenterX = centerPoint.x + centerOfMapOverlay.x - newCenterOnImageTransformed.x;
CGFloat newCenterY = centerPoint.y + centerOfMapOverlay.y - newCenterOnImageTransformed.y;
// This only works without any rotation
self.mapOverlayView.center = CGPointMake(newCenterX, newCenterY);
}
知道我哪里出错了吗?几天来我一直在处理这个问题,但我似乎无法弄清楚。
如果我需要添加某些内容或不清楚的地方,请告诉我。
谢谢!
获得帮助后添加的代码:
CGPoint centerOfMapOverlay = CGPointMake(
(self.mapOverlayView.bounds.size.width / 2,
(self.mapOverlayView.bounds.size.height / 2)
);
centerOfMapOverlay = CGPointApplyAffineTransform(
centerOfMapOverlay,
self.mapOverlayView.transform
);
如果您更改其视图的变换,则框架 属性 将变为未定义。您应该改为使用中心 属性 来更改视图的位置,并使用 bounds.size 来更改视图的大小。
我一直在开发一个 iOS 应用程序,它应该显示室内蓝图。您应该能够在楼层之间切换,并且每个楼层图像都由手势识别器控制以处理平移、旋转和缩放。
我一直在为手势识别器使用这个例子:https://github.com/GreenvilleCocoa/UIGestures/blob/master/UIGestures/RPSimultaneousViewController.m
那么现在进入问题。每当用户切换楼层时,我想保持图像的变换以及相应的中心 lat/lng。然而,新图像可以有另一个旋转偏移和纵横比。
我已经能够用新的尺寸更新图像的新帧并用新的旋转偏移更新变换并验证它。当我尝试计算新的中心点时,我无法让它工作。下面的代码是我目前的做法,只要视图不旋转,它就可以工作:
-(void)changeFromFloor:(int)oldFloorNr toFloor:(int)newFloorNr
{
CGPoint centerPoint = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);
// This is the old non transformed center point.
CGPoint oldCenterOnImage = [self.layer convertPoint:centerPoint toLayer:self.mapOverlayView.layer]; // Actual non transformed point
// This point is verified to be the corresponding non transformed center point
CGPoint newCenterOnImage = [self calculateNewCenterFor:oldCenterOnImage fromFloor:oldFloorNr toFloor:newFloorNr];
// Change image, sets a new image and change the fram of mapOverlayView
[self changeImageFromFloor:oldFloorNr toFloor:newFloorNr]
// Adjust transformed rotation on map if new map have different rotation
[self adjustRotationFromFloorNr:oldFloorNr toFloorNr:newFloorNr];
CGPoint centerOfMapOverlay = CGPointMake((self.mapOverlayView.frame.size.width / 2), (self.mapOverlayView.frame.size.height / 2));
CGPoint newCenterOnImageTransformed = CGPointApplyAffineTransform(newCenterOnImage, self.mapOverlayView.transform);
CGFloat newCenterX = centerPoint.x + centerOfMapOverlay.x - newCenterOnImageTransformed.x;
CGFloat newCenterY = centerPoint.y + centerOfMapOverlay.y - newCenterOnImageTransformed.y;
// This only works without any rotation
self.mapOverlayView.center = CGPointMake(newCenterX, newCenterY);
}
知道我哪里出错了吗?几天来我一直在处理这个问题,但我似乎无法弄清楚。
如果我需要添加某些内容或不清楚的地方,请告诉我。
谢谢!
获得帮助后添加的代码:
CGPoint centerOfMapOverlay = CGPointMake(
(self.mapOverlayView.bounds.size.width / 2,
(self.mapOverlayView.bounds.size.height / 2)
);
centerOfMapOverlay = CGPointApplyAffineTransform(
centerOfMapOverlay,
self.mapOverlayView.transform
);
如果您更改其视图的变换,则框架 属性 将变为未定义。您应该改为使用中心 属性 来更改视图的位置,并使用 bounds.size 来更改视图的大小。