当使用捏合手势时,uiview的边界是否会发生变化? [英] Does the bounds of a uiview change when a pinch gesture is used on it?

查看:116
本文介绍了当使用捏合手势时,uiview的边界是否会发生变化?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am using the UIPinchGestureRecognizer to expand/reduce a 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}}

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

Why isn't the bounds adjusting when the frame is changing ? Does it have anything to do with auto resizing masks as I have subviews to this view ?

推荐答案

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

This has nothing to do with UIPinchGestureRecognizer. This has everything to do with your setting the transform to perform scaling. Changing the transform does not change bounds. It just changes how this view's coordinate space (bounds) maps to the superview's coordinate space (frame). If you need bounds to match frame, you have to change one of them directly, not use transform. That said, you should generally use transform because it's much faster.

编辑

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

If you don't mean to scale, but rather mean to resize the view, call setBounds:. You can find the new bounds by applying the transform to the bounds rather than the element.

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

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

这篇关于当使用捏合手势时,uiview的边界是否会发生变化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆