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

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

О. Я делаю операцию масштабирования для 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; } } 

благодаря

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

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

    Метод поворота. Сбросьте поворот распознавателя жестов на 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]; } } 

    Scale Method, в конце сбросить масштаб распознавателя жестов до 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; } } 

    Просто выполните gestureRecognizer: shouldRecognizeSimultaneousWithGestureRecognizer: в вашем делегате .

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

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

    Я нашел то, что может вас заинтересовать на веб-сайте университета Стэнфорд :

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

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

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

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

    надеюсь, я помог 🙂

    Когда вы используете 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]; } 

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

    ZoomRotatePanImageView

    Давайте будем гением компьютера.