Меняются ли границы пользовательского интерфейса при использовании жеста повышения? - PullRequest
1 голос
/ 30 августа 2011

Я использую 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 Ответ

2 голосов
/ 30 августа 2011

Это не имеет ничего общего с UIPinchGestureRecognizer. Это связано с настройкой transform для масштабирования. Изменение transform не меняет bounds. Это просто меняет то, как координатное пространство этого вида (bounds) отображается на координатное пространство супервизии (frame). Если вам нужно bounds, чтобы соответствовать frame, вы должны изменить один из них напрямую, а не использовать transform. Тем не менее, вы обычно должны использовать transform, потому что это намного быстрее.

EDIT

Если вы не хотите масштабировать, а хотите изменить размер представления, позвоните 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);
...