为什么平移让用户在超视图外移动缩放视图?

时间:2012-06-06 12:57:19

标签: ios uigesturerecognizer uipangesturerecognizer uipinchgesturerecognizer

我正在研究pdf页面上的捏合和捏合功能。我的捏合和平移(移动)工作正常,但当用户连续移动缩放视图时,缩放视图超出了超视图范围。这样的事情:

theis is the move user made after zoom

如何限制平移移动,以便用户无法在超视图外移动缩放视图/ pdf 我正在使用的相关代码是:

// This method will handle the PINCH / ZOOM gesture 

- (void)pinchZoom:(UIPinchGestureRecognizer *)gestureRecognizer {

    if([gestureRecognizer state] == UIGestureRecognizerStateBegan) {
        // Reset the last scale, necessary if there are multiple objects with different scales
        lastScale = [gestureRecognizer scale];
    }
if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {

    if (!zoomActive) {
        zoomActive = YES;
        panActive = YES;
        UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panMove:)];
        [panGesture setMaximumNumberOfTouches:2];
        [panGesture setDelegate:self];
        [self addGestureRecognizer:panGesture];
        [panGesture release];

    }

            CGFloat currentScale = [[[gestureRecognizer view].layer valueForKeyPath:@"transform.scale"] floatValue];

            // Constants to adjust the max/min values of zoom
            const CGFloat kMaxScale = 2.0;
            const CGFloat kMinScale = 1.0;

            CGFloat newScale = 1 -  (lastScale - [gestureRecognizer scale]); 
            newScale = MIN(newScale, kMaxScale / currentScale);   
            newScale = MAX(newScale, kMinScale / currentScale);
            CGAffineTransform transform = CGAffineTransformScale([[gestureRecognizer view] transform], newScale, newScale);
            [gestureRecognizer view].transform = transform;

            lastScale = [gestureRecognizer scale];  // Store the previous scale factor for the next pinch gesture call 



    [delegate leavesView:self zoomingCurrentView:[gestureRecognizer scale]];            




}

}
我正在处理平底移动的方法:

// This method will handle the PAN / MOVE gesture 
- (void)panMove:(UIPanGestureRecognizer *)gestureRecognizer  
{  
    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged)   {  
        CGPoint translation = [gestureRecognizer translationInView:[[gestureRecognizer view] superview]];  
        [[gestureRecognizer view] setCenter:CGPointMake([[gestureRecognizer view] center].x + translation.x, [[gestureRecognizer view] center].y + translation.y)];  

        [gestureRecognizer setTranslation:CGPointZero inView:[[gestureRecognizer view] superview]];  
    }  
}  

请建议如何在其超视图范围内处理平移/移动限制平移。

2 个答案:

答案 0 :(得分:3)

panMove方法中试用此代码。它的工作正常。

        static CGPoint initialCenter;

        if (recognizer.state == UIGestureRecognizerStateBegan)
        {
            initialCenter = recognizer.view.center;
        }

        CGPoint translation = [recognizer translationInView:recognizer.view];
        CGPoint newCenter = CGPointMake(initialCenter.x + translation.x,
                                       initialCenter.y + translation.y);
        CGRect newFrame = recognizer.view.frame;
        CGRect superViewBounds = recognizer.view.superview.bounds;
        CGPoint superViewOrigin = recognizer.view.superview.frame.origin;

        if(newCenter.x-(newFrame.size.width/2) >= (superViewBounds.size.width+superViewOrigin.x)-200 /*right*/
           ||
           newCenter.x+(newFrame.size.width/2) <= (superViewOrigin.x+200) /*left*/
           ||
           newCenter.y-(newFrame.size.height/2) >= (superViewBounds.size.height+superViewOrigin.y)-200 /*bottom*/
            ||
            newCenter.y+(newFrame.size.height/2) <= (superViewOrigin.y+100)) /*top*/
        {
            return;
        }else{
            recognizer.view.center = newCenter;
        }

答案 1 :(得分:0)

你可以在代码中添加这样的东西:(这有点粗糙所以你可能需要解决一些错误)

if([gestureRecognizer view].frame.bounds.x < self.view.bounds.x - panExapantion)
{ 
    //then don't move it
}

//... repeat this for all sides (this is left), bottom, right, and top.

编辑: 好吧,考虑一个盒子里面的盒子,因此我们有一个内盒子和一个外盒子。如果我们不希望内部框出现在外部框之外,那么我们必须将所有这些陈述都变为现实:

  1. 内箱的左侧移动不在外箱的左侧。
  2. 内箱的右侧移动不在外箱的右侧。
  3. 内箱的移动底侧不在外箱底部的外侧。
  4. 内盒的移动顶侧不在外盒的顶侧之外。
  5. 在您的情况下,PDF是内部框,iPad是外部框。为了阻止pdf超出框,我们需要检查这些语句是否都是真的,如果一个是假的,我们不会将PDF移动到它的新位置或者我们将PDF移动到iPhone的边缘附近屏幕。

    问题是如果使用了捏合和缩放,那么突然盒子总是在外盒子外面,那么我们该如何解决呢?我们得到在缩放时内部框中添加了多少像素(为了解释这个解释,我们只需将其称为扩展)。因此,我们得出框扩展了多少并减去该值。像这样:(这是一个愚蠢的if语句,在代码中不起作用)

    If(outerBox.leftSide is less than innerBox.leftSide - panExpantion) 
    {
        //Then the innerBox is outside the outterBox
    }
    

    我希望这有助于澄清!