Жесты UIImageView (увеличение, поворот) Вопрос

Я хотел бы сделать 2 операции для масштабирования UIImageView, повернуть, у меня есть 2 проблемы:

A. Я делаю операцию масштабирования для ex. и когда я пытаюсь сделать ротацию, UIImageView устанавливается на начальный размер, я хотел бы знать, как сохранить увеличенный UIImageView и сделать поворот с увеличенным изображением.

B. Я хотел бы объединить операцию масштабирования с поворотом, и я не знаю, как это реализовать:

- (void)viewDidLoad 
{
    foo = [[UIImageView alloc]initWithFrame:CGRectMake(100.0, 100.0, 600, 800.0)];
    foo.userInteractionEnabled = YES;
    foo.multipleTouchEnabled  = YES;
    foo.image = [UIImage imageNamed:@"earth.jpg"];
    foo.contentMode = UIViewContentModeScaleAspectFit;
    foo.clipsToBounds = YES;

    [self.view addSubview:foo];
}

//---pinch gesture--- 
UIPinchGestureRecognizer *pinchGesture =
[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)];
[foo addGestureRecognizer:pinchGesture]; 
[pinchGesture release];

//---rotate gesture--- 
UIRotationGestureRecognizer *rotateGesture =
[[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(handleRotateGesture:)];
[foo addGestureRecognizer:rotateGesture]; 
[rotateGesture release];

//---handle pinch gesture--- 
-(IBAction) handlePinchGesture:(UIGestureRecognizer *) sender {
    NSLog(@"Pinch");
    CGFloat factor = [(UIPinchGestureRecognizer *) sender scale];
    if (factor > 1) { 
        //---zooming in--- 
        sender.view.transform = CGAffineTransformMakeScale(
                                                           lastScaleFactor + (factor-1),
                                                           lastScaleFactor + (factor-1)); 
    } 
    else {
        //---zooming out--- 
        sender.view.transform = CGAffineTransformMakeScale(lastScaleFactor * factor, lastScaleFactor * factor);
    }
    if (sender.state == UIGestureRecognizerStateEnded) { 
        if (factor > 1) {
            lastScaleFactor += (factor-1); 
        } else {
            lastScaleFactor *= factor;
        }
    }
}

//---handle rotate gesture--- 
-(IBAction) handleRotateGesture:(UIGestureRecognizer *) sender {
    CGFloat rotation = [(UIRotationGestureRecognizer *) sender rotation]; 
    CGAffineTransform transform = CGAffineTransformMakeRotation(rotation + netRotation); 
    sender.view.transform = transform;
    if (sender.state == UIGestureRecognizerStateEnded) { 
        netRotation += rotation;
    }
}

Спасибо

Ответ 1

Надеюсь, это может быть полезно для вас, так как обычно я использую распознаватели жестов:

UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotatePiece:)];
[piece addGestureRecognizer:rotationGesture];
[rotationGesture release];

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

Вращайте метод: Reset вращение распознавателя жестов до 0 после применения, поэтому следующий обратный вызов является дельтами от текущего вращения

- (void)rotatePiece:(UIRotationGestureRecognizer *)gestureRecognizer {
    [self adjustAnchorPointForGestureRecognizer:gestureRecognizer];

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {
        [gestureRecognizer view].transform = CGAffineTransformRotate([[gestureRecognizer view] transform], [gestureRecognizer rotation]);
        [gestureRecognizer setRotation:0];
    }
}

Метод масштабирования, в конце Reset шкала распознавания жестов в 1 после применения, поэтому следующий обратный вызов является дельтами из текущего масштаба

- (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];
    }
}

Затем убедитесь, что распознаватели жесткости, панорамирования и поворота на определенном изображении могут распознавать одновременно, чтобы одновременно распознавать распознаватели распознавания жестов.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
// if the gesture recognizers are on different views, don't allow simultaneous recognition
if (gestureRecognizer.view != otherGestureRecognizer.view)
    return NO;

// if either of the gesture recognizers is the long press, don't allow simultaneous recognition
if ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]] || [otherGestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]])
    return NO;

    return YES;
}

масштаб и поворот преобразование применяется по отношению к точке слоя якоря этот метод перемещает жест распознаватель точки зрения якоря между пользовательскими пальцами

- (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;
    }
}

Ответ 2

Просто внесите gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: в свой делегат.

У меня есть настройки UIPinchGestureRecognizer, a UIPanGestureRecognizer и UIRotationGestureRecognizer, и я хочу, чтобы все они работали одновременно. У меня также есть UITapGestureRecognizer, который я делаю не, чтобы быть распознанным одновременно. Все, что я сделал, это:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    if (![gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]] && ![otherGestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
        return YES;
    }

    return NO;
}

Ответ 3

Я нашел то, что может вас заинтересовать на веб-сайте stanford University:

http://www.stanford.edu/class/cs193p/cgi-bin/drupal/downloads-2010-winter

на этом сайте вам нужно будет прокрутить страницу вниз до тех пор, пока не увидите номер 14: " Название: Лекция № 14 - MultiTouch"

Загрузите: "14_MultiTouchDemo.zip"

В этом примере вы можете масштабировать и поворачивать каждое изображение одновременно.

надеюсь, что я помог:)

Ответ 4

Когда вы используете CGAffineTransformMakeScale, вы каждый раз переустанавливаете преобразование Identity каждый раз, и вы теряете предыдущую информацию о преобразовании.

Попробуйте использовать CGAffineTransformScale(view.transform,scale, scale) для масштабирования пинча. Вам нужно будет сохранить исходный размер кадра, чтобы сохранить масштабирование под контролем. см. Как использовать масштабирование зума (UIPinchGestureRecognizer) для изменения ширины UITextView?

Для вращения аналогично:

   if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {
        view.transform = CGAffineTransformRotate([view transform], [gestureRecognizer rotation]);
        [gestureRecognizer setRotation:0];
    }

Ответ 5

Я знаю, что это довольно старый поток, я столкнулся с этим подклассом imageview, который отлично подходит для масштабирования, поворота и панорамирования. Он использует распознаватель жестов на изображении. Я использую это для одного из своих приложений.

ZoomRotatePanImageView