शीर्षक को अपडेट करते समय UIButton को चमकने से कैसे रोकें


85

जब मैं एक UIButton पर सेटटाइटल कॉल करता हूं, तो बटन iOS 7 में चमकता है। मैंने myButton.highlighted = NO को सेट करने का प्रयास किया, लेकिन उस बटन को चमकने से नहीं रोका।

[myButton setTitle:[[NSUserDefaults standardUserDefaults] stringForKey:@"elapsedLabelKey"] forState:UIControlStateNormal];

myButton.highlighted = NO;

यहां बताया गया है कि मैं टाइमर को कैसे सेट करता हूं जिसने शीर्षक अपडेट किए हैं:

- (void)actionTimer {
    if (myTimer == nil) {

        myTimer = [NSTimer scheduledTimerWithTimeInterval: 1.0
                        target: self
                        selector: @selector(showActivity)
                        userInfo: nil
                        repeats: YES];
    }
}

यहाँ वह विधि है जो वास्तव में शीर्षकों को अद्यतन करती है:

- (void)showActivity {

    NSString *sym = [[NSLocale currentLocale] objectForKey:NSLocaleCurrencySymbol];

    if (pauseInterval == nil) {

        // Update clock
        seconds = [[NSDate date] timeIntervalSinceDate:startInterval] - breakTime;

        // Update total earned
        secRate = rate.value / 60 / 60;
        total = secRate * seconds;
        [totalLabel setTitle:[NSString stringWithFormat:@"%@%.4f",sym,total] forState:UIControlStateNormal];

        days = seconds / (60 * 60 * 24);
        seconds -= days * (60 * 60 * 24);
        int hours = seconds / (60 * 60);
        fhours = (float)seconds / (60.0 * 60.0);
        seconds -= hours * (60 * 60);
        int minutes = seconds / 60;
        seconds -= minutes * 60;

        // Update the timer clock
        [elapsed setTitle:[NSString stringWithFormat:@"%.2i:%.2i:%.2i:%.2i",days,hours,minutes,seconds] forState:UIControlStateNormal];
    }
}

यह चमकती नहीं होनी चाहिए। क्या आप पृष्ठभूमि के धागे पर ऐसा करने की कोशिश कर रहे हैं?
BergQuester

हाँ यह हर सेकंड बटन शीर्षक को अपडेट करने के लिए एक टाइमर में सेट किया जा रहा है (जो मुझे लगता है कि अपना खुद का धागा बनाएं)
FierceMonkey

टाइमर केवल एक अलग थ्रेड पर चलते हैं यदि आप उन्हें ऐसा करने के लिए सेट करते हैं। क्या हम उस पद्धति को देख सकते हैं जहां शीर्षक अपडेट हो जाता है और आपने टाइमर कैसे सेट किया?
BergQuester

मैंने मुख्य प्रश्न में अनुरोधित कोड
FierceMonkey

जवाबों:


205

बटन प्रकार को UIButtonTypeCustom पर सेट करें और यह फ़्लैश करना बंद कर देगा


16
यह वास्तव में पसंदीदा उत्तर होना चाहिए। सबसे सरल उपाय। और यह काम कर रहा है।
जोहान कार्लसन ने

4
माना। मैंने कई अन्य समाधानों की कोशिश की और यह वह चीज है जिसने यह किया, सभी अपने आप से।
BBQ स्टीव

2
यह स्वीकृत उत्तर होना चाहिए। अब तक का सबसे सरल उपाय।
मचाडो

1
एक जादू की तरह काम करता है! धन्यवाद

2
मुझे लगता है कि इसके लिए कोई कोड लिखे बिना यह वास्तव में अच्छा समाधान है।
चौहान

55

[UIView setAnimationsEnabled:NO]अन्य एनिमेशन को प्रभावित करने वाले से बेहतर दृष्टिकोण केवल विशिष्ट शीर्षक एनीमेशन को अक्षम करना है।

उद्देश्य सी:

[UIView performWithoutAnimation:^{
  [myButton setTitle:text forState:UIControlStateNormal];
  [myButton layoutIfNeeded];
}];

स्विफ्ट:

UIView.performWithoutAnimation { 
    myButton.setTitle(text, for: .normal)
    myButton.layoutIfNeeded()
}

बस अब नवीनतम iOS पर स्विफ्ट समाधान की कोशिश की - महान काम करता है।
रोनेन राबिनोविक

1
दिन बचाने वाला। चीयर्स!
pkc456

बस स्विफ्ट 3 में यह कोशिश की, और यह लेआउट के उपयोग के बिना काम करता है IfNeeded ()
user1898712

3
यह बिना किसी संदेह के स्वीकृत उत्तर होना चाहिए!
जूलियस

1
यह ऐसा करने का सबसे अच्छा तरीका है। बहुत बढ़िया जवाब!
aecend

29

* कृपया ध्यान दें *

जब " buttonType _button की" है "UIButtonTypeSystem" नीचे दिए गए कोड है, अवैध :

[UIView setAnimationsEnabled:NO];
[_button setTitle:@"title" forState:UIControlStateNormal];
[UIView setAnimationsEnabled:YES];

जब _ बटन का " बटन टाइप " "UIButtonTypeCustom" है , तो उपरोक्त कोड मान्य है


19

शीर्षक परिवर्तन पर अवांछित UIButton एनीमेशन को कैसे रोकें से प्रतिक्रियाएं देखें ? :

[UIView setAnimationsEnabled:NO];
[elapsed setTitle:[NSString stringWithFormat:@"%.2i:%.2i:%.2i:%.2i",days,hours,minutes,seconds] forState:UIControlStateNormal];
[UIView setAnimationsEnabled:YES];

7
के लिए एक कॉल जोड़ने का प्रयास करें @FierceMonkey layoutIfNeeded: [elapsed layoutIfNeeded];। इसने मेरे मामले में पलक को हटा दिया।
कालस

1
layoutIfNeeded ने मेरे लिए किया।
काओलिन फायर

यह एक बल्कि गंदा layoutIfNeededकाम लगता है, हालांकि काम करने के लिए प्रतीत होता है
Przemysław Wrzesiński

7

आप बस आसान भविष्य के उपयोग के लिए UIButton के लिए बस एक और कार्य कर सकते हैं।

extension UIButton {
    func setTitleWithoutAnimation(_ title: String?, for controlState: UIControlState) {
        UIView.performWithoutAnimation {
            self.setTitle(title, for: controlState)
            self.layoutIfNeeded()
        }
    }
}

बस इतना ही!

और जैसा आपने पहले किया था, वैसा ही शीर्षक सेट करें, लेकिन उसके setTitleसाथ बदलेंsetTitleWithoutAnimation


6

डिफ़ॉल्ट "सेटटल" व्यवहार निश्चित रूप से घृणित है!

मेरा समाधान है:

[UIView setAnimationsEnabled:NO];
[_button layoutIfNeeded]; 
[_button setTitle:[NSString stringWithFormat:@"what" forState:UIControlStateNormal];
[UIView setAnimationsEnabled:YES];

इसके अलावा, स्टोरीबोर्ड में, बटन की संपत्ति के तहत मैं अनचेक करता हूं:

  • हाइलाइट पर उलटा
  • हाइलाइट की गई एडजस्ट इमेज

और जाँच करें:

  • विकलांग समायोजित छवि

परीक्षण किया गया है और iOS 8 पर भी काम कर रहा है।

अद्यतन - स्विफ्ट

मेरा सुझाव है कि आप अपना कस्टम बटन बनाएं और सेटटाइल विधि को ओवरराइड करें ।

class UnflashingButton: UIButton {
   
    override func setTitle(title: String?, forState state: UIControlState) {
        UIView.setAnimationsEnabled(false)
        self.layoutIfNeeded()
        super.setTitle(title, forState: state)
        UIView.setAnimationsEnabled(true)
    }

}

मैंने इस दृष्टिकोण की कोशिश की (उपवर्गिंग, ओवरराइडिंग सेटटाइट: फॉरस्टेट: और डिसेबल-इनेबलिंग-यूआईवाईवाई.सेटएनीमेशन इनेबल्ड)। IOS 9 और 10 बीटा में मेरे लिए काम नहीं कर रहा है। यह काम करता है अगर मैं केवल एनिमेशन को निष्क्रिय कर देता हूं, लेकिन फिर वे हर UIView के लिए खो जाते हैं ...
cdf1982

2

यह प्रयास करें, यह IOS के नए संस्करणों में काम करता है:

class CustomButtonWithNoEffect : UIButton {
    override func setTitle(_ title: String?, for state: UIControlState) {
        UIView.performWithoutAnimation {
            super.setTitle(title, for: state)
            super.layoutIfNeeded()
        }
    }

}

0

मैं कोडिंग और स्टैकओवरफ़्लो के लिए नया हूं, इसलिए https://stackoverflow.com/users/4673064/daniel-tseng उत्कृष्ट उत्तर पर विस्तार करने के लिए सीधे टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है । इसलिए मुझे अपना नया उत्तर लिखना होगा, और यह है:

extension UIButton {
    func setTitleWithoutAnimation(_ title: String?, for controlState: UIControlState) {
        UIView.performWithoutAnimation {
            self.setTitle(title, for: controlState)
            self.layoutIfNeeded()
        }
    }
}

महान काम करता है, EXCEPT:

अगर बाद में "setTitleWithoutAnimation" कोड में मेरे सभी कॉल भेजने वाले को निर्दिष्ट नहीं करते हैं, तो मुझे CoreMedia या CoreData से संबंधित ये अजीब संदेश मिलते हैं, उदाहरण के लिए, "2526: (null) के लिए CoreMedia की अनुमति प्राप्त करने में विफल"

यह शायद कोडिंग और आईओएस के लिए बहुत ही बुनियादी है, लेकिन मेरे लिए एक नए कोडर के रूप में, इसने मुझे कुछ समय के लिए खरगोश के निशान पर भेजा, जैसे कि: आज एक्सटेंशन कोरमीडिया से अनुमति प्राप्त करने में विफल रहा , जहां लोगों के पास दिलचस्प जवाब थे लेकिन यह नहीं था मेरी समस्या की जड़ तक पहुँचो।

इसलिए मैंने अंत में पाया कि मुझे अपने पैरामीटर को कम-से-कम फ़ंक्शन पैरामीटर देना था, यानी मुझे एक प्रेषक को निर्दिष्ट करना था। वह प्रेषक UIButton, Any, या AnyObject हो सकता है। उन सभी ने काम किया, लेकिन अंततः "स्व" के साथ एक बटन एक्सटेंशन जोड़ने के बीच एक संघर्ष प्रतीत होता है और विशेष रूप से बाद में यह नहीं कह रहा है कि एक बटन इसका उपयोग कर रहा है।

फिर, शायद बुनियादी, लेकिन मेरे लिए नया है, इसलिए मुझे लगा कि यह साझा करने के लायक होगा।


0

एक और तरकीब

@IBOutlet private weak var button: UIButton! {
    didSet {
        button.setTitle(title, for: .normal)
    }
}

यह तभी काम करता है जब आप बिना किसी एपीआई कॉल के शीर्षक का मूल्य जानते हैं। बटन का शीर्षक दृश्य लोड होने से पहले सेट किया जाएगा ताकि आपको एनीमेशन दिखाई न दे

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.