2010-08-10 2 views
23

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

А. я сделать операцию для увеличения для отл. и когда я пытаюсь сделать ротацию, 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; 
    } 
} 

Благодаря

+0

я пытаюсь установить щепотку масштабирования на мое приложение вы можете просто сказать мне, что lastScaleFactor в вашем коде. Заранее спасибо. – Hosni

ответ

15

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

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

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

Скачать: "14_MultiTouchDemo.zip"

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

надежды я помог :)

+0

В этой демонстрации не используется UIGestureRecognizer, она устраняет смысл касаний. –

+0

это отличная ссылка. Спасибо – dubbeat

+0

superhit link, спасибо –

3

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

Попробуйте использовать CGAffineTransformScale(view.transform,scale, scale) для увеличения зума. Однако вам нужно сохранить исходный размер кадра, чтобы сохранить масштабирование под контролем.
см: How can I use pinch zoom(UIPinchGestureRecognizer) to change width of a UITextView?

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

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

Просто реализовать 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; 
} 
63

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

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

Метод масштаб, в конце сброса шкалы жеста распознаватель до 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; 
    } 
} 
+1

Это здорово, спасибо. – spstanley

+1

замечательный код. сладкий –

+1

+1. Хорошая работа!! – Tirth

2

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

ZoomRotatePanImageView

+0

Большое спасибо, это именно то, что я искал. –

Смежные вопросы