通过CGAffineTransformScale计算的边界,框架和框架之间的差异

时间:2011-10-31 22:34:48

标签: iphone objective-c ios cocoa-touch core-graphics

我有一个简单的应用程序,可以在屏幕上放置一个图像视图,并允许用户移动它并使用捏合和平移手势识别器进行缩放。在我的uipangesturerecognizer委托方法(比例)中,我试图在使用CGAffineTransformScale实际执行转换之前计算转换帧的值。然而,我没有得到正确的值,并且得到了一些奇怪的结果,这些结果不符合变换后的帧应该是什么。以下是我的方法:

- (void)scale:(UIPinchGestureRecognizer *)sender 
{
    if([sender state] == UIGestureRecognizerStateBegan) 
    {
        lastScale = [sender scale];
    }

    if ([sender state] == UIGestureRecognizerStateBegan || 
        [sender state] == UIGestureRecognizerStateChanged) 
    {
        CGFloat currentScale = [[[sender view].layer valueForKeyPath:@"transform.scale"] floatValue];
        CGFloat newScale = 1 -  (lastScale - [sender scale]) * (CropThePhotoViewControllerPinchSpeed); 

        newScale = MIN(newScale, CropThePhotoViewControllerMaxScale / currentScale);   
        newScale = MAX(newScale, CropThePhotoViewControllerMinScale / currentScale);

        NSLog(@"currentBounds: %@", NSStringFromCGRect([[sender view] bounds]));
        NSLog(@"currentFrame: %@", NSStringFromCGRect([[sender view] frame]));

        CGAffineTransform transform = CGAffineTransformScale([[sender view] transform], newScale, newScale);
        CGRect nextFrame = CGRectApplyAffineTransform([[sender view] frame], transform);

        NSLog(@"nextFrame: %@", NSStringFromCGRect(nextFrame));

        //NSLog(@"nextBounds: %@", NSStringFromCGRect(nextBounds));

        [sender view].transform = transform;
        lastScale = [sender scale];

    } 
}

这是我得到的印刷结果:

/* currentBounds: {{0, 0}, {316, 236.013}} 
   currentFrame: {{-115.226,-53.4392}, {543.452, 405.891}} 
   nextFrame: {{-202.566, -93.9454}, {955.382, 713.551}} */

使用这些结果,currentBounds坐标显然是0,0,就像它一直是,并且大小和宽度是原始图像在变换之前的大小和宽度。无论我做了多少次转换,这个值似乎保持不变。

currentFrame是正确的坐标,正确的大小和宽度基于图像在其转换状态下的当前状态。

nextFrame不正确,它应该与来自下一组打印值的currentFrame匹配,但它不会。

所以我有一些问题:

1)为什么currentFrame显示正确的帧值?执行转换后,我认为框架无效?在我用手指对图像进行了许多放大和最小化之后,显示了这组值。似乎currentBounds的高度和宽度是我对currentFrame所期望的。

2)为什么我的下一个帧值计算不正确,如何在实际实现转换之前准确计算变换帧的值?

1 个答案:

答案 0 :(得分:1)

您需要将新变换应用于视图的未变换帧。试试这个:

    CGAffineTransform transform = CGAffineTransformScale([[sender view] transform], newScale, newScale);
    CGAffineTransform iTransform = CGAffineTransformInvert([[sender view] transform]);
    CGRect rawFrame = CGRectApplyAffineTransform([[sender view] frame], iTransform);
    CGRect nextFrame = CGRectApplyAffineTransform(rawFrame, transform);