Nedense textColor'ı canlandırmaya çalıştığımda işe yaramıyor. TextColor birdenbire A'dan B'ye değişir. Kırmızıdan siyaha doğru canlandırmak mümkün mü?
Nedense textColor'ı canlandırmaya çalıştığımda işe yaramıyor. TextColor birdenbire A'dan B'ye değişir. Kırmızıdan siyaha doğru canlandırmak mümkün mü?
Yanıtlar:
Bu yanıt eski ve orijinal soru için iyi bir çözüm değil. @strange'nin aşağıdaki cevabı çok daha iyi ve şu cevabın yerine kullanılmalı: https://stackoverflow.com/a/20892927/76559
// Aşağıdaki eski yanıt
textColor
Ben basit bir UIView animasyonlar bloğuyla yapabilir sanmıyorum mülkiyet, docs canlandırılabilir olarak belirtilmemişse ...
Bu muhtemelen NSTimer
her iki milisaniyede bir ateşleme ile oldukça kabaca yapılabilir , her seferinde rengi birinden diğerine kademeli olarak ayarlar.
Bunun kaba olduğunu söylüyorum çünkü başlangıç renginden bitiş rengine giden bir dizi veya başka bir ön ayarlı renk değeri konteyneri gerektirecektir ve eminim bunu çekirdek animasyon veya başka bir şey kullanarak yapmanın bir yolu vardır. ne olduğunu bilmiyorum.
CADisplayLink
yerine kullanmalısınız NSTimer
. Bkz. WWDC 2014 Oturum 236: Kesilebilir ve Duyarlı Etkileşimler Oluşturma yaklaşık 13:00.
Bunun yerine, nesnenin kendisinde böyle bir geçiş geçişi kullanmayı denediniz mi, bu size bir renkten diğerine hoş bir solma efekti verecektir:
Hedef C
[UIView transitionWithView:myLabel duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
myLabel.textColor = NEW_COLOR;
} completion:^(BOOL finished) {
}];
Swift
UIView.transitionWithView(creditsLabel, duration: 0.25, options: .TransitionCrossDissolve, animations: {
self.creditsLabel.textColor = UIColor.redColor()
},
completion: nil)
Bu, çeşitli nedenlerden dolayı NSTimer, CATextLayers ve benzerlerini kullanmaktan daha iyidir. CATextLayer, metin karakter aralığı veya NSAttributedText için uygun desteğe sahip değil ve NSTimers gecikmeli (artı çok fazla kod var). Yukarıdaki geçiş animasyonu hile yapar ve ayrıca bir zincir animasyonunda da kullanılabilir. Aynı sorunu yaşadım ve yukarıdaki çözümleri zaten denedim ancak bu basit kod bunun yerine harikalar yaratıyor.
UIView.transitionWithView(creditsLabel, duration: 0.3, options: .TransitionCrossDissolve, animations: { self.creditsLabel.textColor = UIColor.redColor() }, completion: nil)
Swift 4 çözümü:
UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
self.yourLabel.textColor = .red
}, completion: nil)
UILabel
için with
mülkiyet. Böyle bir şey yaparsanız transition(with: outerView.label…)
ve içine yerleştirmeye çalışırsanız, bu sessizce başarısız olur.
options: .easeInOut
, bu yüzden değiştirdim .transitionCrossDissolve
ve çalıştım.
TextColor'un canlandırılamamasının nedeni, UILabel'in CATextLayer yerine normal bir CALayer kullanmasıdır.
TextColor'u canlandırılabilir hale getirmek için (metin, yazı tipi vb.) UILabel'i bir CATextLayer kullanacak şekilde alt sınıflayabiliriz.
Bu oldukça fazla iş ama neyse ki zaten yaptım :-)
Bu makalede tam bir açıklama + UILabel için bir açık kaynak alternatifi bulabilirsiniz.
UILabel'in başka bir örneğini veya textColor'a sahip olan her şeyi oluşturmayı deneyebilir ve ardından animasyonu bu iki örnek arasında (eski textColor ile ve yeni textColor ile) arasında uygulayabilirsiniz.
Bu benim için işe yarayan TEK şeydi:
let changeColor = CATransition()
changeColor.duration = 1
CATransaction.begin()
CATransaction.setCompletionBlock {
selected.label.layer.addAnimation(changeColor, forKey: nil)
selected.label.textColor = .blackColor()
}
selected.nameLabel.textColor = .redColor()
CATransaction.commit()
İşte etiket metin rengini canlandırmak için kodum. Önemli kısmı clearColor için textColor ayarlamaktır animasyon önce
label.textColor = [UIColor clearColor];
[UIView transitionWithView:label duration:duration/4 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
label.textColor = self.highlightedCellPrimaryTextColor;
} completion:^(BOOL finished) { }];
güncellenmiş hızlı 3.0
@Budidino yorumlarından az önce değiştim
UIView.transition(with: my.label, duration: 0.3, options: .transitionCrossDissolve, animations: { my.label.textColor = .black }, completion: nil)
@ Strange'in cevabı için teşekkürler , Swift 5, Xcode 11'de biraz sözdizimi değişikliğiyle mükemmel çalışıyor. Birden çok UIL etiketi için metin rengini canlandırıyordum, bu da sizin durumunuzsa, şunu deneyin
for label in [label1, label2, ...] as [UILabel] { // loop through a @IBOutlet UILabel array
UIView.transition(with: label, duration: 0.3, options: .transitionCrossDissolve, animations: {
label.textColor = .label
}, completion: nil)
}