2016-04-02 16 views
1

Ortadaki kilitleme, animasyonumdaki üst bölmeden daha hızlı yukarı doğru canlandırıyor. Ortadaki kilidi, üst panelin yanında yukarı doğru hareket ettirmek için nasıl canlandırabilirim? Daha spesifik olmak gerekirse, orta kilitler merkezinin, ekran yukarı ve aşağı doğru hareket ederken üst panoların alt kısmıyla her zaman hizalanmasını istiyorum. ,Başka bir görünüme göre görünümü canlandırma nasıl yapılır

@IBOutlet var topLock: UIImageView! 
@IBOutlet var bottomLock: UIImageView! 
@IBOutlet var lockBorder: UIImageView! 
@IBOutlet var lockKeyhole: UIImageView! 


override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    openLock() 

} 


func openLock() { 

    UIView.animateWithDuration(0.5, delay: 1.0, options: [], animations: { 
     self.lockKeyhole.transform = CGAffineTransformMakeRotation(CGFloat(3.14)) 
     }, completion: { _ in 

      UIView.animateWithDuration(0.6, delay: 0.2, options: [], animations: { 

       var topFrame = self.topLock.frame 
       topFrame.origin.y -= topFrame.size.height 

       var bottomFrame = self.bottomLock.frame 
       bottomFrame.origin.y += bottomFrame.size.height 


       var lockBorderFrame = self.lockBorder.frame 
       lockBorderFrame.origin.y -= self.view.frame.height 

       var lockKeyholeFrame = self.lockKeyhole.frame 
       lockKeyholeFrame.origin.y -= self.view.frame.height 

       self.topLock.frame = topFrame 
       self.bottomLock.frame = bottomFrame 
       self.lockKeyhole.frame = lockKeyholeFrame 
       self.lockBorder.frame = lockBorderFrame 

       }, completion: { finished in 

      }) 
     }) 
} 
+0

Neden sadece üst yarının alt görünümünü yapmıyorsunuz? – jtbandes

+0

@jtbandes Bunu nasıl yapacağınızı gösterebilir misiniz? Şu anda Storyboard'da her şeyim var. – JEL

+0

Sadece kodu bakarak nasıl kurulduğunu anlamak benim için zor. Önerdiğim şey, "topLock" ve "lockKeyhole"/"lockBorder" 'ın kardeşlerin görüşleri olması değil, "topLock" un alt görünümü olması gerektiğidir. O zaman topLock'u hareket ettirebilirsin ve diğerlerini de yanına alabiliyorsun. – jtbandes

cevap

0

Sen topFrame.size.height tarafından topFrame.origin.y ayarlıyoruz:

Bu

lockBorder ve lockKeyhole topLock kıyasla yukarı çok hızlı hareket ediyor "orta kilidi" olarak adlandırılan, ben şu anda sahip kodudur ancak ve lockKeyholeFrame.origin.y ayarlarını self.view.frame.height ayarlıyorsunuz. Bu ayarların farklı miktarlarda olduğunu söyleyebiliriz. topFrame.size.height'un self.view.size.height'un yarısı olduğunu varsayalım. Kilit görünümlerini topLock hareket edeceğiniz mesafenin iki katı kadar hareket ettirdiğinizden ve her iki ayarın da aynı 0.6 saniye aralığında gerçekleştiğinden kilit görünümleri iki kat hızlı hareket eder.

Kilit görünümlerini ekrandan sonuna kadar canlandırmak istediğinizi farzedersiniz, bu nedenle yalnızca topFrame.size.height numarasına göre taşımak yeterli olmaz. Bu, kilidin alt yarısının görünür olmasını sağlar. Kilit görünümlerini, alt kenarlarının self.view'un üst kenarında olacak şekilde hareket ettirmeniz gerekir.

lockBorder.frame.origin.y değerini lockBorder.frame.size.height negatifine ayarlamanız gerektiği anlamına gelir. lockBorder.frame.maxY'a eşit olan lockBorder.frame.size.height + lockBorder.frame.origin.y toplam mesafesini taşıyacaktır.

lockBorder'un en az lockKeyhole kadar geniş olduğunu varsayalım, bu nedenle tüm görünümleri lockBorder.frame.maxY ile taşırsak, bunların hepsi ekrandan çıkar. Ve onları aynı mesafeye taşıdığımızdan, tüm görüşler birlikte hareket edecektir.

Ayrıca, hikaye tahtanızda kısıtlamalar kullanırsanız, bu görünümler, görünüm hiyerarşisine hemen hemen her şeyi yaptığınız anda orijinal konumlarına geri dönecektir. Bu yüzden onları animasyonlar biter bitmez süper görüntülerinden kaldırmalısınız, eğer başka bir şekilde saklamıyorsanız (görünüm hiyerarşisindeki süper görüntülerini kaldırarak).

Bu arada, standart kitaplık sizin için M_PI'u tanımlar.

func openLock() { 
    UIView.animateWithDuration(0.5, delay: 1.0, options: [], animations: { 
     self.lockKeyhole.transform = CGAffineTransformMakeRotation(CGFloat(M_PI)) 
     }, completion: { _ in 
      UIView.animateWithDuration(0.6, delay: 0.2, options: [], animations: { 
       let yDelta = self.lockBorder.frame.maxY 

       self.topLock.center.y -= yDelta 
       self.lockKeyhole.center.y -= yDelta 
       self.lockBorder.center.y -= yDelta 
       self.bottomLock.center.y += yDelta 
       }, completion: { _ in 
        self.topLock.removeFromSuperview() 
        self.lockKeyhole.removeFromSuperview() 
        self.lockBorder.removeFromSuperview() 
        self.bottomLock.removeFromSuperview() 
      }) 
    }) 
} 
+0

Çalışır, teşekkürler! Hızlı soru, genellikle iş için animasyonlar alıyorum, ama bazen matematik ve kod hakkında düşünmeye gelince yanlış anladım, bu yüzden bu konuda yardımcı olan bir görsel araç var mı? PaintCode çizim ile yardımcı olur, bu konuda yardımcı olan bir şey var mı? – JEL

+0

Böyle bir araç bilmiyorum. –

+0

Sorun değil, cevap verdiğiniz için sağladığınız cevap için teşekkürler! – JEL

İlgili konular