Ipad UIPinchGestureRecognitor将挤压视图定位在两个手指之间

Ipad UIPinchGestureRecognitor将挤压视图定位在两个手指之间,ipad,ios,multi-touch,Ipad,Ios,Multi Touch,我成功地实现了视图的收缩和缩放。然而,该视图并没有将自己定位在我希望的位置。对于带有iPad的stackoverflowers,我希望我的视图像iPad照片一样居中。应用程序:当你在相册上收缩和缩放时,照片会以一个正在扩展的视图呈现。此视图大致居中,右手上角位于第一个手指上,左手下角位于另一个手指上。我将其与平移识别器混合使用,但这样用户总是需要捏一下,然后平移以进行调整 这里是如此生动的解释,如果不清楚的话,我可以发布我的应用程序的视频(没有秘密,我正试图复制iPad的Photos.app…)

我成功地实现了视图的收缩和缩放。然而,该视图并没有将自己定位在我希望的位置。对于带有iPad的stackoverflowers,我希望我的视图像iPad照片一样居中。应用程序:当你在相册上收缩和缩放时,照片会以一个正在扩展的视图呈现。此视图大致居中,右手上角位于第一个手指上,左手下角位于另一个手指上。我将其与平移识别器混合使用,但这样用户总是需要捏一下,然后平移以进行调整

这里是如此生动的解释,如果不清楚的话,我可以发布我的应用程序的视频(没有秘密,我正试图复制iPad的Photos.app…)

因此,对于手指的初始位置,开始缩放:

这是目前实际的“缩放”帧。正方形更大,但位置在手指下方

以下是我想要的:相同的尺寸,但不同的原点。x和y:

(很抱歉我的photoshop技能太差了^^)

看一下。具体而言,这些方法可以帮助您:

// scale and rotation transforms are applied relative to the layer's anchor point
// this method moves a gesture recognizer's view's anchor point between the user's fingers
- (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
        UIView *piece = gestureRecognizer.view;
        CGPoint locationInView = [gestureRecognizer locationInView:piece];
        CGPoint locationInSuperview = [gestureRecognizer locationInView:piece.superview];

        piece.layer.anchorPoint = CGPointMake(locationInView.x / piece.bounds.size.width, locationInView.y / piece.bounds.size.height);
        piece.center = locationInSuperview;
    }
}

// scale the piece by the current scale
// reset the gesture recognizer's rotation to 0 after applying so the next callback is a delta from the current scale
- (void)scalePiece:(UIPinchGestureRecognizer *)gestureRecognizer
{
    [self adjustAnchorPointForGestureRecognizer:gestureRecognizer];

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {
        [gestureRecognizer view].transform = CGAffineTransformScale([[gestureRecognizer view] transform], [gestureRecognizer scale], [gestureRecognizer scale]);
        [gestureRecognizer setScale:1];
    }
}

您可以通过方法
handlingpinchgestrue
中的以下代码获得两个手指之间中点的
CGPoint

CGPoint point = [sender locationInView:self];
我的整个
手势
方法如下

/*
instance variables

CGFloat lastScale;
CGPoint lastPoint;
*/

- (void)handlePinchGesture:(UIPinchGestureRecognizer *)sender {
    if ([sender numberOfTouches] < 2)
        return;

    if (sender.state == UIGestureRecognizerStateBegan) {
        lastScale = 1.0;
        lastPoint = [sender locationInView:self];
    }

    // Scale
    CGFloat scale = 1.0 - (lastScale - sender.scale);
    [self.layer setAffineTransform:
        CGAffineTransformScale([self.layer affineTransform], 
                               scale, 
                               scale)];
    lastScale = sender.scale;

    // Translate
    CGPoint point = [sender locationInView:self];
    [self.layer setAffineTransform:
        CGAffineTransformTranslate([self.layer affineTransform], 
                                   point.x - lastPoint.x, 
                                   point.y - lastPoint.y)];
    lastPoint = [sender locationInView:self];
}
/*
实例变量
cglosscale;
CGPoint-lastPoint;
*/
-(无效)HandlePincHistorage:(UIPinchGestureRecognitor*)发送方{
如果([sender NumberOfTouchs]<2)
返回;
if(sender.state==UIgestureRecognitizerStateStart){
lastScale=1.0;
lastPoint=[sender locationInView:self];
}
//鳞片
CGFloat scale=1.0-(lastScale-sender.scale);
[self.layer setAffineTransform:
CGAffineTransformScale([self.layer affineTransform],
规模
比例];
lastScale=sender.scale;
//翻译
CGPoint point=[发送方位置查看:self];
[self.layer setAffineTransform:
CGAffineTransformTranslate([self.layer affineTransform],
point.x-lastPoint.x,
点.y-最后一点.y)];
lastPoint=[sender locationInView:self];
}

谢谢,但是使用
视图。转换
也可以调整我的子视图的大小。。。有什么办法可以防止这种情况发生吗?#进口-我需要这个节目给主播托马斯,我对此也很感兴趣。你找到解决办法了吗?你们有样品代码吗?thx~我还没来得及回到这个问题上来,但是@md_developer answer看起来很棒。我会尽量找时间更新我的代码并接受答案如果这样做有效当[sender locationInView:self]总是返回相同的点,即两个捏手指之间的中点时,这怎么可能起作用?@Guy midpoint在
UIgestureRecognitizerStateStart
之后发生变化,因为你将手指移开或移开<代码>位置查看:self
返回两个手指之间的质心。那部分确实有用。虽然1小时后,我仍然无法在我的应用程序中运行此功能,但我需要移动一堆层。我使用了此方法,视图被正确转换。然而,它的翻译方式并不像照片那样流畅app@mishimay如果我添加名为
\u myLayer
的子层,并将代码中的
self.layer
替换为
\u myLayer
,则代码无法正常工作。为什么以及如何修复它?提前谢谢。