2010-08-10 219 views
23

我想提出2個操作的UIImageView縮放,旋轉,我有2個問題:的UIImageView手勢(縮放,旋轉)問題

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

感謝

+0

我想設置我的應用程序的雙指縮放你可以告訴我什麼是lastScaleFactor在你的代碼。先謝謝你。 – Hosni 2012-06-06 14:51:36

回答

15

我發現了一些您可能會感興趣在斯坦福大學網站:

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

在這個網站,你會需要,直到你看到14號向下滾動

: 「標題:講座#14 - 多點觸控」

下載:「14_MultiTouchDemo.zip」

在這個例子你可以同時縮放和旋轉每個圖像。

希望我幫助:)

+0

此演示不使用UIGestureRecognizer,它解決了觸摸的含義。 – 2010-08-29 09:09:00

+0

這是一個很好的鏈接。謝謝 – dubbeat 2011-04-08 12:26:43

+0

superhit鏈接,謝謝 – 2012-01-25 09:26:32

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:

我有一個UIPinchGestureRecognizerUIPanGestureRecognizerUIRotationGestureRecognizer設置,我希望他們都在同一時間工作。我也有一個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施加所以接下來回調之後的增量從CUR的增量租金規模

- (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 2011-09-20 20:27:32

+1

真棒代碼。甜的 – 2011-11-08 15:42:17

+1

+1。幹得好! – Tirth 2013-02-25 10:47:48

2

我知道這是一個很老的線程,我遇到了這個imageview子類,它適用於縮放,旋轉和平移。它在imageview上使用手勢識別器。我正在使用這個爲我的應用程序之一。

ZoomRotatePanImageView

+0

非常感謝,這正是我一直在尋找的。 – 2017-02-16 07:44:51