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
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;
}
(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
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? –
orantılı olmayan zoom uygulamak mümkün mü? x ve y değişikliklerini ayrı ayrı uygulamak mı demek istedim? – user5599807