2011-07-07 9 views
12

UVE'yu sürükle, fiske atma veya fırlatma gibi bir UIView'i (örneğin, http://www.cardflick.co/ veya https://squareup.com/cardcase demo videoları) çekmek için ne yapmam gerektiğini merak ediyordum.IOS bir UIView

Öğeleri nasıl sürükleyeceğimi biliyorum, ancak onlara yer çekimi/ataletini nasıl veriyorsunuz? Bu IOS tarafından ele alınmış mı?

cevap

42

Eğer/atalet kolaylığı-out vasıtasıyla üretilebilir bir ağırlık kral simüle olarak tarif olduğu etkilerin tür (yavaş hızlı, bitiş) ve kolay (hızlı, yavaş, bitiş) zamanlama fonksiyonları. dışarı hafifletilmesi ve hafifletilmesi için

Destek iOS mevcuttur, bu yüzden herhangi bir harici kütüphane ne de emeğine (tahmin edebileceğiniz gibi, her ne kadar, sizin etkisi ince ayar bir sürü gerekir) gerek yoktur.

Bu kolaylığı aşımı etkisi ile belirli bir pozisyona bir nesnenin çevirisini Canlandıracağımız: Bir UIPanGestureRecognizer aracılığıyla hareketini işlemek durumunda

[UIView animateWithDuration:2.0 delay:0 
     options:UIViewAnimationOptionCurveEaseOut 
     animations:^ { 
       self.image.center = finalPosition; 
     } 
     completion:NULL]; 
} 

, jest tanıyıcı iki önemli bilgilere sağlayacaktır Son konumu hesaplayın: Sırasıyla nesnenin ne kadar hızlı ve ne kadar hareket ettiğini gösteren velocity ve translation.

UIPanGestureRecognizer* panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)]; 
    [yourView addGestureRecognizer:panGestureRecognizer]; 
      [panGestureRecognizer release]; 

Sonra işleyicinizde animasyon işlemek:

Böyle (sanırım bu Canlandırmak istediğiniz nesne olurdu) sizin görünümünde bir tava jest tanıyıcı yükleyebilirsiniz

- (void)handlePanFrom:(UIPanGestureRecognizer*)recognizer { 

    CGPoint translation = [recognizer translationInView:recognizer.view]; 
    CGPoint velocity = [recognizer velocityInView:recognizer.view]; 

    if (recognizer.state == UIGestureRecognizerStateBegan) {  
    } else if (recognizer.state == UIGestureRecognizerStateChanged) { 
     <track the movement> 
    } else if (recognizer.state == UIGestureRecognizerStateEnded) { 
     <animate to final position> 
    } 
} 
+0

Animasyon bitmeden animasyonu durdurmak istediğinizde animasyonu durdurmam gerekirse ne yapmalıyım? Animasyon her zaman tamamlanana kadar çalışır. – Howard

+0

"interruptible animations" ı googling yapmayı deneyin veya yeni bir soru yayınlayın (ve isterseniz yorumlarınızı buraya gönderin). – sergio

+0

Tamamlanmadan önce animasyonu temizlemenin işimi yaptığını buldum. Teşekkürler. – Howard

0

Bunu yapmak için iOS'ta yerleşik hiçbir şey yoktur, ancak bunu kolayca kendiniz uygulayabilirsiniz. Kullanmak istediğiniz "fiske" hareketini tanıyan bir jest tanıyıcı oluşturarak başlayabilirdim, muhtemelen sabit yönünü arayan ve hızda artış gösteren bir şey. Böyle bir hareketi tanıdığınızda, sadece etkilenen görüntünün konumunu uygun şekilde hareketlendirmeniz gerekir.

1

iOS, yerçekimi/atalet için yerleşik bir API'ye sahip değil. En iyi seçenekler:

  1. animasyonlarla etkisini simüle: Eğer (o şeyler kapalı çıkma gerekmez) bir hedefe doğru bir nesne fiskeleme eğer, muhtemelen göndererek oldukça iyi bir sonuç sadece alabilir hedefe ve animasyon zamanlama eğrisini ayarlayarak. Fizik kitaplığı kullanın. Chipmunk yüksek kaliteli bir model ve pek çok iOS desteği var. Nesneleri ayarlayın, ağırlıkları atayın, şekillerini tanımlayın ve daha sonra kütüphane kodu size güncelleştirilmiş (x, y) koordinatları verecek ve böylece nesnelerinizi ekranda güncelleyebileceksiniz.

İlgili konular