दो संख्याओं के बीच चेतन UILabel पाठ?


80

मैं iPhone और मैक प्रोग्रामिंग के लिए नया हूं (पहले विंडोज के लिए विकसित), और मुझे एक सवाल मिला है:

मैं आसानी से आउट शैली में 5 से 80 के बीच की दो संख्याओं के बीच की textसंपत्ति को कैसे एनिमेट करूं ? क्या यह संभव है ? मैं एक घंटे से Google पर खोज रहा हूं, लेकिन मुझे अपनी समस्या का समाधान करने के लिए कुछ भी नहीं मिला है। मैं क्या चाहता हूं: उपयोगकर्ताओं को एक सरल गेम के लिए पैसे दें। यह बहुत अच्छा नहीं लगता है, जब यह सिर्फ 50 से 100 या एनीमेशन के बिना ऐसा कुछ हो जाता है ।UILabelCoreAnimation

किसी को भी एक विचार है कि कैसे करना है?

धन्यवाद!


2
यह एक पुराना प्रश्न है लेकिन पॉप (फेसबुक एनीमेशन फ्रेमवर्क) एक अच्छा समाधान होगा। आप सीधे टेक्स्ट प्रॉपर्टी को एनिमेट कर सकते हैं।
jrturton

जवाबों:


160

आप स्वचालित बदलाव का उपयोग कर सकते हैं। यह पूरी तरह से अच्छी तरह से काम कर रहा है:

// Add transition (must be called after myLabel has been displayed)
 CATransition *animation = [CATransition animation];
animation.duration = 1.0;
animation.type = kCATransitionFade;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[myLabel.layer addAnimation:animation forKey:@"changeTextTransition"];

// Change the text
myLabel.text = newText;

यह कोड काम करता है अगर myLabel पहले से प्रदर्शित है। यदि myLabel.layer शून्य नहीं है और ऑब्जेक्ट में एनीमेशन नहीं जोड़ा जाएगा।


में स्विफ्ट 4 होगा कि:

let animation: CATransition = CATransition()
animation.duration = 1.0
animation.type = kCATransitionFade
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
myLabel.layer.add(animation, forKey: "changeTextTransition")

2
मैंने यह कोशिश की (यह सुनिश्चित करते हुए कि एनीमेशन को जोड़ने पर परत शून्य नहीं है), लेकिन पाठ अभी भी चेतन नहीं करता है। किसी भी अन्य gotchas?
एल्सरुडो

5
बस एक साइड नोट, आपको टेक्स्ट को बदलने से पहले एनीमेशन को जोड़ना होगा, जब भी आप टेक्स्ट को बदलना चाहते हैं और फीका प्रभाव हो सकता है। हालांकि आपको हर बार एक नया संक्रमण तुरंत नहीं करना पड़ता है, एक ही उदाहरण को बार-बार उपयोग किया जा सकता है।
लांस

2
सवाल यह था कि संख्याओं को कैसे चेतन किया जाए जैसे कि उन्हें मूल्य में वृद्धि करना, न कि दोनों के बीच रेखांकन। PRTween का उपयोग करें: github.com/shu223/TweenDemo/tree/…
jowie

14
वास्तव में, यदि आप इसके उदाहरण पर सेट removedOnCompletionकरते हैं , तो लेबल का प्रत्येक परिवर्तन एनिमेटेड होगा। NOCATransitiontext
मार्क एडम्स

1
@kientux कुंजी के बारे में कुछ खास नहीं है changeTextTransition। यह केवल एक स्ट्रिंग है जो एनीमेशन की पहचान करता है , जिसका अर्थ है कि यह एक स्ट्रिंग है जिसे आप बाद में उपयोग किए जाने वाले एनीमेशन की पहचान करने के लिए उपयोग कर सकते हैं। यदि आपको बाद में अपने एनीमेशन की पहचान करने में सक्षम होने की आवश्यकता नहीं है, तो आप बस निर्दिष्ट कर सकते हैं nil
jamesk

27

यह अच्छा काम करता है!

उद्देश्य सी

[UIView transitionWithView:self.label 
                  duration:.5f 
                   options:UIViewAnimationOptionCurveEaseInOut | 
                           UIViewAnimationOptionTransitionCrossDissolve 
                animations:^{

    self.label.text = rand() % 2 ? @"111!" : @"42";

} completion:nil];

स्विफ्ट 2

UIView.transitionWithView(label, duration: 0.25, options: [.CurveEaseInOut, .TransitionCrossDissolve], animations: {
    self.label.text = (arc4random() % 2 == 0) ? "111" : "222"
}, completion: nil)

स्विफ्ट 3, 4, 5

UIView.transition(with: label, duration: 0.25, options: [.curveEaseInOut, .transitionCrossDissolve], animations: {
    self.label.text = (arc4random() % 2 == 0) ? "111" : "222"
}, completion: nil)

1
अन्य गुणों के लिए भी काम किया गया, जैसे किimageUIImageView
SaltyNuts

7

मुझे कई अलग-अलग टाइमिंग फ़ंक्शन के साथ मूल्यों को ट्विन करने के लिए एक महान इंजन मिला, जिसे PRTween कहा जाता है । कक्षाएं स्थापित करें और इन पंक्तियों के साथ कुछ कोड बनाएं:

- (IBAction)tweenValue
{
    [[PRTween sharedInstance] removeTweenOperation:activeTweenOperation];
    PRTweenPeriod *period = [PRTweenPeriod periodWithStartValue:0.0 endValue:100.0 duration:1.0];
    activeTweenOperation = [[PRTween sharedInstance] addTweenPeriod:period
                                                             target:self
                                                           selector:@selector(update:)
                                                     timingFunction:&PRTweenTimingFunctionCircOut];
}

- (void)update:(PRTweenPeriod*)period
{
    self.animatingView.center = CGPointMake(period.tweenedValue + 100.0, 200.0);
    self.valueLabel.text = [NSString stringWithFormat:@"%.2f", period.tweenedValue];
}

मेरे लिए एक इलाज का काम करता है। :)


5

यदि आप चाहते हैं कि इसे पिछली संख्या से दूर धकेलने वाले नए नंबर (जैसे टिकर या कुछ और) के साथ ऊपर और नीचे गिनें:

let animation = CATransition()
animation.removedOnCompletion = true
animation.duration = 0.2
animation.type = kCATransitionPush
animation.subtype = newValue > value ? kCATransitionFromTop : kCATransitionFromBottom
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
valueLabel.layer.addAnimation(animation, forKey:"changeTextTransition")

अरे! आपके उत्तर के लिए धन्यवाद! यह बहुत साफ काम करता है। मेरे पास केवल आगे के प्रश्न पर है। क्या आप जानते हैं कि पाठ के केवल हिस्सों को कैसे चेतन करना है? तीसरे चरित्र की तरह और बाकी को अपरिवर्तित रहने दें? मैं एक लेबल लागू करना चाहूंगा जो संख्या दिखाता है। यदि मान केवल अंकों में परिवर्तन करता है, तो वह वास्तव में बदल जाएगा।
लार्स पीटरसन

व्यक्तिगत रूप से मैं इस तरह की चीज़ के लिए CoreGraphics और CoreAnimation का उपयोग करूँगा। या आप एक साथ कई लेबलों को धोखा और स्ट्रिंग कर सकते हैं? निर्भर करता है कि आप कितने जटिल हैं।
एडम वेट

3

स्विफ्ट 2.0 में, UIView.transitionWithView()विधि का उपयोग कर :

UIView.transitionWithView(self.payPeriodSummaryLabel,
        duration: 0.2,
        options: [.CurveEaseInOut, .TransitionCrossDissolve],
        animations: { () -> Void in
            self.label.text = "your text value"
        }, completion: nil)

1

एक और सरल विकल्प

extension UILabel {    
    func countAnimation(upto: Double) {
        let from: Double = text?.replace(string: ",", replacement: ".").components(separatedBy: CharacterSet.init(charactersIn: "-0123456789.").inverted).first.flatMap { Double($0) } ?? 0.0
        let steps: Int = 20
        let duration = 0.350
        let rate = duration / Double(steps)
        let diff = upto - from
        for i in 0...steps {
            DispatchQueue.main.asyncAfter(deadline: .now() + rate * Double(i)) {
                self.text = "\(from + diff * (Double(i) / Double(steps)))"
            }
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.