Bir UILabel'in textColor özelliği nasıl canlandırılır?


82

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:


6

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

textColorBen basit bir UIView animasyonlar bloğuyla yapabilir sanmıyorum mülkiyet, docs canlandırılabilir olarak belirtilmemişse ...

Bu muhtemelen NSTimerher 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.


veya: A ile B ve belirli bir yüzde arasında RGB değerlerine sahip bir dizi atan bir işlev. Yine de renk algoritmaları hakkında hiçbir şey bilmiyorum.
dontWatchMyProfile

işte iyi geçici çözümler: burada ve burada Anna Karenina'ya teşekkürler
jackal

4
Ekran güncellemeleriyle senkronize olduğundan, animasyonları manuel olarak sürmek CADisplayLinkyerine kullanmalısınız NSTimer. Bkz. WWDC 2014 Oturum 236: Kesilebilir ve Duyarlı Etkileşimler Oluşturma yaklaşık 13:00.
Douglas Hill

o zaman doğru olsa bile bu artık kabul edilen cevap olmamalıdır. aşağıdaki
strange'in

1
Yığın Taşması, kabul edildiği için bu eski yanıtı silmeme izin vermiyor. Aşağıdaki @ strange yanıtını kontrol edin.
Jasarien

196

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.


7
Güzel, zarif, aslında en iyi ve en temiz çözüm.
maksa

17
Harika. UIView.transitionWithView(creditsLabel, duration: 0.3, options: .TransitionCrossDissolve, animations: { self.creditsLabel.textColor = UIColor.redColor() }, completion: nil)
Swift'de

8
sadece bir not: Bu yalnızca etiket statik olduğunda çalışır. Bunu yaparsanız ve etiketin konumu değiştirilirse, karartma animasyonu çirkin bir yapı gösterecektir.
Lukas Petr

Aşağıdaki Xcode 10.2.1 ve Swift 5. 'shokaveli' yönteminde benim için çalışmıyor
Martin

SwiftUI'de bunu yapmanın bir yolunu arıyordum ama o zaman desteklenmiyor gibi görünüyor.
philipp

59

Swift 4 çözümü:

UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
  self.yourLabel.textColor = .red
}, completion: nil)

Eğer bir örneğini varsa Not bu sadece çalışır UILabeliçin withmü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.
Sam Soffes

Nedense benim için çalışmıyor. Animasyon sırasında kademeli yerine aniden değişiklik yapıyor. :(
ScottyBlades

1
@ScottyBlades belki animasyonu arka plan iş parçacığında yapıyorsunuzdur? UIView.transition kodunu DispatchQueue.main.async {} parantezlerinin içine kaydırmayı deneyin.
budiDino

1
Bilginize - İlk denemem işe yaramadı ve bunun nedeni yapmış olmamdı options: .easeInOut, bu yüzden değiştirdim .transitionCrossDissolve ve çalıştım.
LeoGalante

13

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.


9

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.


7

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()

6

İş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) { }];

0

Etiketin altına bir UIView yerleştirmeyi ve opaklığını canlandırmayı oldukça kolay buldum. Etiket bu görünüme eklenmelidir. Kaynak tüketimi açısından belki iyi bir çözüm değil, ama oldukça basit.


0

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)

0

@ 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)
}
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.