使用新框架

时间:2015-12-07 16:04:20

标签: ios objective-c uiview rotation transform

我一直在开发一款应该显示室内蓝图的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
);

1 个答案:

答案 0 :(得分:0)

如果更改其视图的变换,则frame属性将变为未定义。您应该使用center属性来更改视图的位置,并使用bounds.size来更改视图的大小。