当使用捏合手势时,uiview的边界是否会发生变化?

时间:2011-08-30 11:30:13

标签: ios uiview uigesturerecognizer

我正在使用UIPinchGestureRecognizer来扩展/缩小uiview。

UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scaleElement:)];
[pinchGesture setDelegate:self];
[element addGestureRecognizer:pinchGesture];
[pinchGesture release];

//缩放元素方法

- (void)scaleElement:(UIPinchGestureRecognizer *)gestureRecognizer {
    UIView *element = [gestureRecognizer view];
    [self adjustAnchorPointForGestureRecognizer:gestureRecognizer];
    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan){
        lastTouchPosition = [gestureRecognizer locationInView:element];
    } 
    else if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged){
            CGPoint currentTouchPosition = [gestureRecognizer locationInView:element];
            CGPoint deltaMove = [self calculatePointDistancewithPoint1:currentTouchPosition andPoint2:lastTouchPosition];
            float distance = sqrt(deltaMove.x*deltaMove.x + deltaMove.y*deltaMove.y);
            float hScale = 1 - deltaMove.x/distance * (1-gestureRecognizer.scale);
            float vScale = 1 - deltaMove.y/distance * (1-gestureRecognizer.scale);
            if (distance == 0) {
                hScale = 1;
                vScale = 1;
            }
            element.transform = CGAffineTransformScale([element transform], hScale, vScale);
            CGAffineTransform transform = CGAffineTransformMakeScale(hScale, vScale);
            element.bounds = CGRectApplyAffineTransform(element.bounds, transform);
                [gestureRecognizer setScale:1];
                lastTouchPosition = currentTouchPosition;
            }
            if ([gestureRecognizer state] == UIGestureRecognizerStateEnded) {
                NSLog(@"scaling over");
                NSLog(@"bounds = %@",NSStringFromCGRect(element.bounds));
                NSLog(@"frame = %@", NSStringFromCGRect(element.frame));
            }
            NSLog(@"scalePiece exit");
    }

//adjustAnchorPointForGestureRecognizer method

    - (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
        if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
            UIView *elementToAdjust = gestureRecognizer.view;
            [self.view bringSubviewToFront:gestureRecognizer.view];
            CGPoint locationInView = [gestureRecognizer locationInView:elementToAdjust];
            CGPoint locationInSuperview = [gestureRecognizer locationInView:elementToAdjust.superview];
            elementToAdjust.layer.anchorPoint = CGPointMake(locationInView.x / elementToAdjust.bounds.size.width, locationInView.y / elementToAdjust.bounds.size.height);
            elementToAdjust.center = locationInSuperview;
        }
    }

控制台打印:

bounds = {{0, 0}, {178.405, 179.018}}
frame = {{300.642, 566.184}, {192.899, 194.227}}

为什么框架在变化时不会调整边界? 它是否与自动调整大小掩码有关,因为我有此视图的子视图?

1 个答案:

答案 0 :(得分:2)

这与UIPinchGestureRecognizer无关。这与您设置transform以执行缩放有关。更改transform不会更改bounds。它只是更改此视图的坐标空间(bounds)映射到superview的坐标空间(frame)的方式。如果您需要boundsframe匹配,则必须直接更改其中一个,而不是transform。也就是说,您通常应该使用transform因为它更快。

修改

如果您不想缩放,而是要调整视图大小,请致电setBounds:。您可以通过将转换应用于bounds而不是元素来找到新的bounds

CGPoint currentTouchPosition = [gestureRecognizer locationInView:element];
CGPoint deltaMove = [self calculatePointDistancewithPoint1:currentTouchPosition andPoint2:lastTouchPosition];
...

CGAffineTransform transform = CGAffineTransformMakeScale(hScale, vScale);
self.bounds = CGRectApplyAffineTransform(self.bounds, transform);