我有一个简单的应用程序,可以在屏幕上放置一个图像视图,并允许用户移动它并使用捏合和平移手势识别器进行缩放。在我的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)为什么我的下一个帧值计算不正确,如何在实际实现转换之前准确计算变换帧的值?
答案 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);