2014-09-16 38 views
5

UIPinchGestureRecognizer uygulamasını uygulamamdaki bir UIImageView uygulamasında uyguladım, ancak görüntüde nerede kıstığım önemli değil, aynı noktaya zoom yapıyor gibi görünüyor. Bir kullanıcının, aslında bir kullanıcının "sıkıştığı" yere nasıl yakınlaştırabileceğini biliyor mu? Aşağıdaki kodlara bakın.PinchGesture Kullanımı; Bir kullanıcının parmaklarının gerçekte "kıstırma" yerini nasıl yakınlaştırabilirim?

ViewController.m

- (IBAction)scaleImage:(UIPinchGestureRecognizer *)recognizer { 

    recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale); 
    recognizer.scale = 1; 

} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch; 
{ 
    BOOL shouldReceiveTouch = YES; 

    if (gestureRecognizer == tap) { 
     shouldReceiveTouch = (touch.view == featureImage); 
    } 
    return shouldReceiveTouch; 
} 

cevap

19

bir ölçek dönüşümü kökeni (0, 0) bırakılmasını sağlar. Bu yüzden belirli bir nokta etrafındaki bir görünümü ölçeklendirmek için önce o noktayı orijine çevirmeli, sonra ölçeği uygulamalı, sonra geri çevirmelisiniz.

İlk önce, görüntünün sıkışmasını sağlarız. tutam merkezini hesaplamak için

UIView *pinchView = pinch.view; 

, biz görünümün sınırların orta noktasına gerekir, bu yüzden de sınırları olsun:

CGRect bounds = pinchView.bounds; 

merkez tutam en ağırlık merkezi dayanmaktadır

CGPoint pinchCenter = [pinch locationInView:pinchView]; 

Ama biz aslında görünümün ortasına göre uzaklığı tutam ihtiyaç görünümü en dönüşümü nedeniyle varsayılan olarak görünümün ortasına görecelidir: bu haIe dokunuşlar.

pinchCenter.x -= CGRectGetMidX(bounds); 
    pinchCenter.y -= CGRectGetMidY(bounds); 

Şimdi güncelleyebilirsiniz (Sen görünümü en layer.anchorPoint. Değiştirerek değiştirebilirsiniz) görünümü en dönüşümü. Öncelikle olsun onun şimdiki dönüşümü:

CGAffineTransform transform = pinchView.transform; 

Sonra kökeni tutam merkezini çevirmek için güncelleyin:

Şimdi ölçeğini uygulayabilirsiniz:

CGFloat scale = pinch.scale; 
    transform = CGAffineTransformScale(transform, scale, scale); 

Sonra görünümü geri çevir:

transform = CGAffineTransformTranslate(transform, -pinchCenter.x, -pinchCenter.y); 
pinch.scale = 1.0; 
} 

Demo:

biz şimdiki ölçeği uygulanmış beri,

pinchView.transform = transform; 

Son olarak, jest tanıyıcı ölçeğini sıfırlayın:Şimdi dönüşümü modifiye görünümüyle güncelleyebilir pinch scale

Simülatörde, bir tutam jest için seçeneği (alt) tutabileceğinizi unutmayın. Vardiya tutma (seçeneği basılı tutarken) iki dokunuşla birlikte hareket eder.İşte

copy/paste için hep birlikte kod:

- (IBAction)pinchGestureDidFire:(UIPinchGestureRecognizer *)pinch { 
    UIView *pinchView = pinch.view; 
    CGRect bounds = pinchView.bounds; 
    CGPoint pinchCenter = [pinch locationInView:pinchView]; 
    pinchCenter.x -= CGRectGetMidX(bounds); 
    pinchCenter.y -= CGRectGetMidY(bounds); 
    CGAffineTransform transform = pinchView.transform; 
    transform = CGAffineTransformTranslate(transform, pinchCenter.x, pinchCenter.y); 
    CGFloat scale = pinch.scale; 
    transform = CGAffineTransformScale(transform, scale, scale); 
    transform = CGAffineTransformTranslate(transform, -pinchCenter.x, -pinchCenter.y); 
    pinchView.transform = transform; 
    pinch.scale = 1.0; 
} 
+0

(olması gerektiği gibi görünüyor olsa da) Bu benim için çalışmak görünmüyor? Yukarıdakileri uyguladım ve hala sadece görüntüdeki bir noktaya zum yapabiliyorum. – Brittany

+1

Hareket algılayıcısını yeni yönteme bağladığınızdan ve eski yönteme bağlı kalmadığından emin misiniz? Arandığından emin olmak için yeni yöntemde bir "NSLog" veya bir kesme noktası koydunuz mu? –

+0

orantılı olmayan zoom uygulamak mümkün mü? x ve y değişikliklerini ayrı ayrı uygulamak mı demek istedim? – user5599807

0

Sadece aşağıdaki gibi bir imageView eklemek scrollview ekleyip scrollview içinde olabilir,

![ImageView on top of scrollView][1] 

resim yüklemesi böylece Bazı sorun Eğer scrollview ve imageview bir IBOutlet özelliğini oluşturabilir, o zaman bu link

de resmi kontrol ve sırasıyla bağlayın. Daha sonra

_scrollView.maximumZoomScale = 10.0;  //Maximum Zoom 
_scrollView.minimumZoomScale = minimumScale; //Minimum Zoom 

Ayrıca Yani şimdi u set/çıkış etkileri ve maksimum/minimum yakınlaştırma limiti zoom alacağı, yönteminin altında

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{ 
    return _imageView; 
} 

ekleyin viewDidAppear yönteminde şu satırları ekleyin. Ur hedefe ulaşmakla birlikte daha az kod.

+0

Bunu yapardım, ancak kaydırma çubuğundaki görüntünün kaydırma çubuğunu görebilme fikrini beğenmedim:/ – Brittany

+0

Kaydırma çubuğunu görebilme fikri, kullanıcının etrafta dolaşabileceğini bilmesini sağlamaktır görüntü (yakınlaştırılmış durumda olduğu gibi tam görüntünün sanatını görecektir) – nikhil84

+0

"Yatay/Dikey Göstergeyi Göster" seçeneklerinin işaretini kaldırarak, Arabirim Oluşturma bölümündeki kaydırma çubuklarını devre dışı bırakabilirsiniz. Programlı olarak bile yapılabilir. –

-1
ViewController.h 

@property (strong, nonatomic) IBOutlet UIImageView *img; 

ViewController.m 

- (void)viewDidLoad 

{ 

    [super viewDidLoad]; 

    UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchDetected:)]; 

    [_img addGestureRecognizer:pinchRecognizer]; 

    // Do any additional setup after loading the view, typically from a nib. 

} 

- (void)pinchDetected:(UIPinchGestureRecognizer *)pinchRecognizer 

{ 

    CGFloat scale = pinchRecognizer.scale; 

    _img.transform = CGAffineTransformScale(self.img.transform, scale, scale); 

    pinchRecognizer.scale = 1.0; 
} 
2

rob en cevabın Swift uygulanması:

@objc private func pinchHandler(gesture: UIPinchGestureRecognizer) { 
    if let view = gesture.view { 

     switch gesture.state { 
     case .changed: 
      let pinchCenter = CGPoint(x: gesture.location(in: view).x - view.bounds.midX, 
             y: gesture.location(in: view).y - view.bounds.midY) 
      let transform = view.transform.translatedBy(x: pinchCenter.x, y: pinchCenter.y) 
              .scaledBy(x: gesture.scale, y: gesture.scale) 
              .translatedBy(x: -pinchCenter.x, y: -pinchCenter.y) 
      view.transform = transform 
      gesture.scale = 1 
     case .ended: 
      // Nice animation to scale down when releasing the pinch. 
      // OPTIONAL 
      UIView.animate(withDuration: 0.2, animations: { 
       view.transform = CGAffineTransform.identity 
      }) 
     default: 
      return 
     } 


    } 
} 
İlgili konular