2011-02-09 14 views
39

Bir görüntüyü yakınlaştırma özelliğini başarılı bir şekilde uygulayabildim. Ancak görüş, olmasını istediğim yerde durmuyor. IPad'li stackoverflow'lar için, iPad Photos.app'da görünümümün ortalanmasını istiyorum: bir albüme & zum yaptığınızda, fotoğraflar kendilerini genişleyen bir görünümde sunar. Bu görünüm yaklaşık olarak ilk parmağın sağ üst köşesi ve diğer parmağın sol alt parmağı ile ortalanır. Bunu bir pan tanıyıcı ile karıştırdım, ancak bu şekilde kullanıcının her zaman çimdiklemesi ve ardından ayarlamak için kaydırma yapması gerekir. İşte UIPinchGestureRecognizer, iki parmak arasındaki sıkışmış görünümü konumlandırıyor

(... sır i iPad Photos.app yeniden oluşturmaya çalışıyorum) o belirsiz eğer öyleyse grafik açıklama, benim app bir video sonrası olabilir vardır bir başlangıç ​​için

Yani yakınlaştırma başlangıç ​​parmakların pozisyonu,:

enter image description here

Bu gerçek "zoom" çerçeve şimdi içindir. kare daha büyük, ama pozisyon

İşte

given the start position

Ben istiyorum ne parmakları aşağıdaki gibidir:

enter image description here

: Farklı origin.X ve y aynı boyutta, ancak (Benim zayıf photoshop becerileri hakkında üzgünüm)

+0

Merhaba Thomas, ben de bununla çok ilgileniyorum. Bununla ilgili herhangi bir çözüm buldunuz mu? Herhangi bir örnek kodunuz var mı? thx ~ – ludo

+2

Bu konuya dönme vaktim olmadı, ancak @md_develop yanıtı harika görünüyor. Kodumu güncellemek için biraz zaman bulmaya çalışacağım ve eğer bu –

cevap

41

Sen yöntemde handlingPinchGesture aşağıdaki kodu aracılığıyla iki parmak arasındaki orta noktanın CGPoint alabilirsiniz.

CGPoint point = [sender locationInView:self]; 

Benim bütün handlePinchGesture yöntem altındadır.

/* 
instance variables 

CGFloat lastScale; 
CGPoint lastPoint; 
*/ 

- (void)handlePinchGesture:(UIPinchGestureRecognizer *)sender { 
    if ([sender numberOfTouches] < 2) 
     return; 

    if (sender.state == UIGestureRecognizerStateBegan) { 
     lastScale = 1.0; 
     lastPoint = [sender locationInView:self]; 
    } 

    // Scale 
    CGFloat scale = 1.0 - (lastScale - sender.scale); 
    [self.layer setAffineTransform: 
     CGAffineTransformScale([self.layer affineTransform], 
           scale, 
           scale)]; 
    lastScale = sender.scale; 

    // Translate 
    CGPoint point = [sender locationInView:self]; 
    [self.layer setAffineTransform: 
     CGAffineTransformTranslate([self.layer affineTransform], 
            point.x - lastPoint.x, 
            point.y - lastPoint.y)]; 
    lastPoint = [sender locationInView:self]; 
} 
+1

için buna ihtiyacım vardı [gönderen locationInView: self], her zaman aynı noktayı döndürdüğünde, bu iki sıkıştırma parmağı arasındaki orta noktayı nasıl döndürür? – Guy

+1

@Guy orta noktası, "UIGestureRecognizerStateBegan" ifadesinden sonra değişiyor çünkü parmaklarınızı veya daha fazlasını hareket ettiriyorsunuz. 'locationInView: self', iki parmak arasında centroid döndürür. O bölüm işe yarıyor. Her ne kadar 1 saat sonra hala benim app taşımak için bu elde edemiyorum rağmen, ben taşımak gerekir katmanları demet var .. –

+1

Bu yöntemi kullandım ve görünüm doğru tercüme edildi. Ancak, "_myLayer" adında bir alt katmanı eklediğimde ve "_myLayer" için kodunuzdaki "self.layer" yerini değiştirdiyse, bu yöntem, Fotoğraf uygulaması –

11

Touches sample project'a bir göz atın. Özellikle bu yöntemler size yardımcı olabilecek:

// scale and rotation transforms are applied relative to the layer's anchor point 
// this method moves a gesture recognizer's view's anchor point between the user's fingers 
- (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; 
    } 
} 

// scale the piece by the current scale 
// reset the gesture recognizer's rotation to 0 after applying so the next callback is a delta from the current scale 
- (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]; 
    } 
} 
+0

çalışıyorsa cevabı kabul edeceğim, ama 'view.transform' kullanarak da alt görünümlerimi yeniden boyutlandırıyorum ... Bunu engellemenin bir yolu var mı? –

+0

#import - AnchorPoint –

İlgili konular