UIButton'da yerel "Darbe efekti" animasyonu nasıl yapılır - iOS


Yanıtlar:


199
CABasicAnimation *theAnimation;

theAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"];
theAnimation.duration=1.0;
theAnimation.repeatCount=HUGE_VALF;
theAnimation.autoreverses=YES;
theAnimation.fromValue=[NSNumber numberWithFloat:1.0];
theAnimation.toValue=[NSNumber numberWithFloat:0.0];
[theLayer addAnimation:theAnimation forKey:@"animateOpacity"]; //myButton.layer instead of

Swift

let pulseAnimation = CABasicAnimation(keyPath: #keyPath(CALayer.opacity))
pulseAnimation.duration = 1
pulseAnimation.fromValue = 0
pulseAnimation.toValue = 1
pulseAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
pulseAnimation.autoreverses = true
pulseAnimation.repeatCount = .greatestFiniteMagnitude
view.layer.add(pulseAnimation, forKey: "animateOpacity")

"Katman İçeriğini Canlandırma" makalesine bakın.


1
Cevabınız için teşekkürler! Yine de biraz sıkıştığımı söylemeliyim. CALayer'a hiç aşina değilim ve onu UIButton'uma nasıl bağlayacağımı bilmiyorum. Ayrıca kodunuz, ölçeği değil opaklığı değiştiriyor gibi görünür.
Johann

8
Tamam). 'Darbeli animasyon', bu bağlantıdaki örnekte söylendiği gibi, genellikle titreme efektine uygulanan bir terimdir. Şimdi sorunuzu tekrar okudum ve ne istediğinizi anlıyorum. İlk başta her görünümün kendi katmanı vardır. QartzCore çerçevesi projeye eklenirse myView.layer, erişmek için yazmanız yeterlidir . Katmanları Core Animation ile canlandırabilirsiniz. Ölçek dönüşümü için şu yaklaşımı kullanabilirsiniz: Yapı Alanları için Anahtar Yol Desteği
berilyum

7
Fantastik! @ "Opacity" yerine @ "transform.scale" kullanmak bir cazibe gibi çalışır. Çok teşekkürler!
Johann

2
Zaten sahip değilseniz #import <QuartzCore/QuartzCore.h>, CALayers için tüm tanımları almak için eklemeniz gerekir .
progrmr

UGH! Asıl yanıtı doğru modern sürüme güncellemediğiniz sürece güncel olmayan 3 yıllık yanıtları düzenlemeyin. Boşluk eklemek onu güncellemiyor. Özellikle 3 yıl sonra diriltmemek.
Fogmeister

31

İşte bunun için hızlı kod;)

let pulseAnimation:CABasicAnimation = CABasicAnimation(keyPath: "transform.scale")
pulseAnimation.duration = 1.0
pulseAnimation.toValue = NSNumber(value: 1.0)
pulseAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
pulseAnimation.autoreverses = true
pulseAnimation.repeatCount = .greatestFiniteMagnitude
self.view.layer.add(pulseAnimation, forKey: nil)

2
Tüm noktalı virgüllerin nesi var? ;)
Christian

@Christian noktalı virgül, pulseAnimation sabitinin türünü ayarlar. Kullanılması gerekli değildir, ancak bir atamanın sağ tarafı hangi tür atayacağını açıkça göstermediğinde kod netliğini artırma eğilimindedir.
Scott Chow

@ScottChow Sanırım kolondan bahsediyorsun. Swift ile noktalı virgüllere gerek olmadığı için yorumum orijinal cevaba bir şakaydı. Sanırım cevap çok fazla düzenlendiğinde artık o kadar açık değildi :)
Christian

bir değer eklediğinizden emin olun
Kev Wats

9

Swift kodunda a eksik fromValue, çalışmasını sağlamak için eklemek zorunda kaldım.

pulseAnimation.fromValue = NSNumber(float: 0.0)

Ayrıca forKeyayarlanmalıdır, aksi takdirde removeAnimationçalışmaz.

self.view.layer.addAnimation(pulseAnimation, forKey: "layerAnimation")

3
func animationScaleEffect(view:UIView,animationTime:Float)
{
    UIView.animateWithDuration(NSTimeInterval(animationTime), animations: {

        view.transform = CGAffineTransformMakeScale(0.6, 0.6)

        },completion:{completion in
            UIView.animateWithDuration(NSTimeInterval(animationTime), animations: { () -> Void in

                view.transform = CGAffineTransformMakeScale(1, 1)
            })
    })

}


@IBOutlet weak var perform: UIButton!

@IBAction func prefo(sender: AnyObject) {
    self.animationScaleEffect(perform, animationTime: 0.7)
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.