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


211

IOS 7 में मेरे UIButton शीर्षक गलत समय पर - में और बाहर एनिमेशन कर रहे हैं। यह समस्या iOS 6 पर दिखाई नहीं देती है।

[self setTitle:text forState:UIControlStateNormal];

मैं पसंद करूंगा कि यह तुरंत और बिना किसी खाली फ्रेम के होता है। यह पलक विशेष रूप से विचलित करने वाला है और अन्य एनिमेशन से ध्यान खींचता है।


हम इसे भी अनुभव कर रहे हैं। यकीन नहीं है कि यह एक iOS7 बग या कुछ है जिसे हमें ठीक करना चाहिए।
स्वेग

कोशिश करो, [self.button setHighlighted: NO];
कार्तिक

इन विचारों के लिए धन्यवाद। मैंने कोशिश कीहै। प्रकाश: नहीं, लेकिन वहाँ कोई किस्मत। मैं सेटटलिट को अंदर रखकर पलक को कम करने में सक्षम हूं: [UIView चेतनविद्या: 0.0f एनिमेशन: ^ {...}];
भूतकाल

1
आप कुछ मामलों में इस वर्कअराउंड का उपयोग कर सकते हैं self.button.titleLabel.text = text:। लेकिन यह लेबल फ्रेम का आकार परिवर्तन नहीं करता है और UIControlStates के साथ सही ढंग से काम नहीं करता है
बजे

वह एक चतुर काम है। मैं इसके साथ खेलूंगा और देखूंगा कि क्या होता है, दुर्भाग्य से मैं UIControlStates का उपयोग कर रहा हूं।
exsulto

जवाबों:


165

यह कस्टम बटन के लिए काम करता है:

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

सिस्टम बटन के लिए आपको एनिमेशन को फिर से सक्षम करने से पहले इसे जोड़ना होगा (साभार @Klaas):

[_button layoutIfNeeded];

12
दुर्भाग्य से यह काम नहीं करता है। न तो performWithoutAnimation करता है
बोलबाला

9
ठीक है, इसलिए अंत में काम करने वाले फिक्स को मूल यूआईबूटन टेक्स्ट को खाली छोड़ना था ताकि जब मैं इसे कोड के साथ सेट करूं तो यह एनीमेशन को ट्रिगर न करे।
बोलबाला

27
यह तभी काम करता है जब आप बटन का प्रकार कस्टम पर सेट करते हैं, इस उत्तर के अनुसार stackoverflow.com/a/20718467/62
लिरॉन याहदव

15
IOS 7.1 के रूप में मुझे जोड़ना होगा[_button layoutIfNeeded];
क्लेअस

6
@ LironYahdav यदि आपके पास UIButtonTypeCustom पर बटन प्रकार सेट है, तो इस उत्तर की आवश्यकता नहीं है।
डोनाल्डिया

262

performWithoutAnimation:विधि का उपयोग करें और फिर बाद में के बजाय तुरंत होने के लिए लेआउट को मजबूर करें।

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

11
यह स्वीकृत उत्तर के साथ-साथ काम करता है, लेकिन अच्छा लगता है क्योंकि यह अधिक संक्षिप्त है - [UIView setAnimationsEnabled: YES], या इसके लिए ट्रैक को हटा दिया जाना जोड़ना मुश्किल है।
s

19
यदि आप [button layoutIfNeeded];ब्लॉक के अंदर कॉल करते हैं तो यह सिस्टम बटन के लिए काम करता है ।
एलेक्जेंडर ब्लिन

1
बीटीडब्ल्यू, सिस्टम बटन के लिए, लेआउटआईफेड को पाठ बदलने के बाद बुलाया जाना चाहिए
योन

यह सबसे अच्छा उपाय है! चीयर्स
sachadso

यह मेरे लिए सही है। यह सबसे अधिक मतदान और 6 वें स्थान पर है। अच्छा ...
Solgar

79

बटन प्रकार को कस्टम फ़ॉर्म इंटरफ़ेस बिल्डर में बदलें।

यहां छवि विवरण दर्ज करें

इसने मेरे लिए काम किया।


6
सबसे अच्छा उपाय! धन्यवाद।
थॉमसन कैलम

3
लेकिन यह भी क्लिक बटन पर एनीमेशन को अक्षम करता है। मैं बटन दिखाने पर केवल एनीमेशन अक्षम करना चाहता हूं।
पायोत्र वासिलिवेज़

यह तब काम करता है जब आप बटन टैप करते समय एनीमेशन के बारे में परवाह नहीं करते हैं।
जोकिन परेरा

मेरे पास इस तरह से सेट किए गए कुछ बटन हैं और जाहिर है कि यह मेरे मामले का सबसे सुरुचिपूर्ण जवाब है। अच्छा धन्यवाद!
ज़ोल्टन

79

स्विफ्ट में आप उपयोग कर सकते हैं:

UIView.performWithoutAnimation {
    self.someButtonButton.setTitle(newTitle, forState: .normal)
    self.someButtonButton.layoutIfNeeded()
}

1
यह अब तक की सबसे आसान विधि थी। और एक स्विफ्ट उत्तर btw
simplexity

1
स्विफ्ट के लिए सबसे अच्छा जवाब!
नूबसलॉन

एक कष्टप्रद बग था, जहां एक UIButton शीर्षक को बदलते समय ऑफ़स्क्रीन जबकि अजीब एनीमेशन टाइमिंग का कारण होता था इंटरपॉइंटग्योरचर रिकॉग्नर और इससे हल होता था। मुझे अभी भी लगता है कि यह ओएस के साथ एक बग है
SparkyRobinson

अजीब बात है कि .layoutIfNeeded () को कॉल किया जाना है, लेकिन मैंने इसे स्विफ्ट 5 में दोनों तरीकों से परीक्षण किया और यह निश्चित रूप से अभी भी बिना इसके एनिमेट करता है।
Wildcat12

2
ज़रुरी नहीं। यदि आप फोन नहीं करते हैं, layoutIfNeeded()तो बटन को फिर से performWithoutAnimation
डिज़ाइन

60

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

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

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

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


विश्वास नहीं कर सकता कि आपने कितना समय बिताया इससे पहले कि आपको केवल बटन प्रकार बदलने की आवश्यकता हो ... ऊग ...
सैंडी चैपमैन

बिना किसी कोड के काम करता है। केवल बटन प्रकार बदलें और यह काम करेगा।
एलेक्स मोटर

52

IOS 7.1 में शुरू करना मेरे लिए काम करने वाला एकमात्र समाधान टाइप के साथ बटन को इनिशियलाइज़ करना था UIButtonTypeCustom


यह किसी के लिए सबसे समझदार दृष्टिकोण है जिसे UIButtonTypeSystem की आवश्यकता नहीं है।
डोनाल्डिया

यह मेरे लिए सबसे अच्छा काम कर रहा है, मैंने सिर्फ एक CUSTOM बटन बनाया और इसे सिस्टम बटन की तरह देखा और हाइलाइट किया। मुश्किल से अंतर देख सकते हैं लेकिन आपके पास वह देरी नहीं है।
ट्रैविस एम।

18

तो मैं काम कर समाधान मिल:

_logoutButton.titleLabel.text = NSLocalizedString(@"Logout",);
[_logoutButton setTitle:_logoutButton.titleLabel.text forState:UIControlStateNormal];

पहले हम बटन के लिए शीर्षक बदलते हैं, फिर इस शीर्षक के लिए बटन का आकार बदलें


1
मैं उसी वर्कअराउंड का उपयोग करता हूं। स्वीकृत उत्तर मेरे लिए काम नहीं करता है।
deej

यह शीर्षक दो बार फ्लैश करने का कारण बनता है, कम से कम iOS 8 के साथ
जॉर्डन एच

1
यह मेरे लिए 7.1 और 8.1 दोनों फ्लैशिंग के बिना काम करता है। सरल और प्रभावी।
टोड

आईओएस 11 में पूरी तरह से काम करता है, हालांकि मुझे दूसरी पंक्ति के लिए फिर से उसी स्ट्रिंग का उपयोग करना पड़ा (बटन लेबल के शीर्षक का उपयोग करने से यह पलक झपकने का कारण बना)।
सिल्वरवॉल्फ - मोनिका

13

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


कैसे उन सभी समाधान "समाधान" इतने सारे अपवोट हो सकते हैं जब इस सरल जवाब को इस मुद्दे को 99% समय में हल करना होगा ...
Rob


11

मैंने ऐसा करने के लिए एक स्विफ्ट एक्सटेंशन बनाया है:

extension UIButton {
    func setTitleWithoutAnimation(title: String?) {
        UIView.setAnimationsEnabled(false)

        setTitle(title, forState: .Normal)

        layoutIfNeeded()
        UIView.setAnimationsEnabled(true)
    }
}

मेरे साथ iOS 8 और 9 पर काम करता है UIButtonTypeSystem

(कोड स्विफ्ट 2, स्विफ्ट 3 और ऑब्जेक्टिव-सी के समान होना चाहिए)


यह अब उपयोग करने के लिए नहीं जा रहा है, लेकिन बहुत आसान है!
फ्रांसिस रेनॉल्ड्स

9

कस्टम के रूप में UIButton प्रकार सेट करें। कि अंदर और बाहर एनिमेशन फीका हटा देना चाहिए।


1
यह अधिक upvotes होना चाहिए! पूरी तरह से काम करता है और इन अन्य वर्कअराउंड्स के बजाय मूल कारण पर एनीमेशन को अक्षम करता है।
जेस्पर श्लैगर

7

आमतौर पर बटन प्रकार को मेरे लिए कस्टम काम करने के लिए सेट किया जाता है, लेकिन अन्य कारणों से मुझे UIButton को उप-लिंक करने और बटन प्रकार को डिफ़ॉल्ट (सिस्टम) पर वापस सेट करने की आवश्यकता होती है, इसलिए पलक फिर से दिखाई देती है।

UIView.setAnimationsEnabled(false)शीर्षक बदलने से पहले और फिर उसके बाद फिर से सच करने के लिए सेट करना मेरे लिए पलक झपकने से नहीं बचा, फिर चाहे मुझे बुलाया जाए self.layoutIfNeeded()या नहीं।

यह, और केवल निम्नलिखित सटीक क्रम में, मेरे लिए iOS 9 और 10 बीटा के साथ काम किया:

1) UIButton के लिए एक उपवर्ग बनाएँ (स्टोरीबोर्ड में बटन के लिए कस्टम वर्ग सेट करना न भूलें)।

2) ओवरराइड setTitle:forState:निम्नानुसार है:

override func setTitle(title: String?, forState state: UIControlState) {

    UIView.performWithoutAnimation({

        super.setTitle(title, forState: state)

        self.layoutIfNeeded()
    })
}

इंटरफ़ेस बिल्डर में, आप बटन प्रकार को सिस्टम पर छोड़ सकते हैं, काम करने के लिए इस दृष्टिकोण के लिए इसे कस्टम प्रकार में बदलने की कोई आवश्यकता नहीं है।

मुझे आशा है कि यह किसी और की मदद करता है, मैं लंबे समय तक कष्टप्रद झपकाए बटन के साथ संघर्ष करता हूं कि मैं इसे दूसरों से बचने की उम्मीद करता हूं;)


मत भूलना layoutIfNeeded():]
ताई ली

6

आप बस कस्टम बटन बना सकते हैं और शीर्षक बदलते समय यह चेतन को रोक देगा।

        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        [btn setTitle:@"the title" forState:UIControlStateNormal];

आप इसे स्टोरीबोर्ड चेकबॉक्स में भी कर सकते हैं: स्टोरीबोर्ड में बटन चुनें -> गुण निरीक्षक (बाईं ओर से चौथा) का चयन करें -> 'टाइप' ड्रॉप डाउन मेनू में, 'सिस्टम' के बजाय 'कस्टम' चुनें जो संभवतः चुना गया था ।

सौभाग्य!


3

आप शीर्षक लेबल की परत से एनिमेशन हटा सकते हैं:

    [[[theButton titleLabel] layer] removeAllAnimations];

मैं सभी उत्तरों से गुजरा। यह सबसे अच्छा है।
रुडोल्फ एडमकोविले

2
यह अभी भी झपकाता है लेकिन यह बेहतर है।
ल्यूसिन

इस प्रति को होना चाहिए।
mxcl

3

Xhacker लियू उत्तर के 4 संस्करण स्विफ्ट

import Foundation
import UIKit
extension UIButton {
    func setTitleWithOutAnimation(title: String?) {
        UIView.setAnimationsEnabled(false)

        setTitle(title, for: .normal)

        layoutIfNeeded()
        UIView.setAnimationsEnabled(true)
    }
} 

1

systemप्रकार के साथ UIButton पर अंतर्निहित एनीमेशन है setTitle(_:for:)। आप इसे दो अलग-अलग तरीकों से ठीक कर सकते हैं:

  1. बटन प्रकार को customकोड या इंटरफ़ेस बिल्डर से सेट करें :
let button = UIButton(type: .custom)

यहां छवि विवरण दर्ज करें

  1. कोड से एनीमेशन अक्षम करें:
UIView.performWithoutAnimation {
    button.setTitle(title, for: .normal)
    button.layoutIfNeeded()
}

0

मैंने पाया है कि यह समाधान UIButtonTypeSystem के साथ भी काम करता है, लेकिन केवल तभी काम करेगा जब बटन किसी कारण से सक्षम हो

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

यदि आपको इसके शीर्षक को सेट करते समय अक्षम करने के लिए बटन की आवश्यकता है तो आपको इन्हें जोड़ना होगा।

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

(iOS 7, Xcode 5)


बस पुष्टि की है कि यह समाधान अब iOS 7.1 पर काम नहीं करता है।
scha

मान लीजिए आप 7.1 के लिए एक समाधान नहीं मिला है?
जॉर्ज ग्रीन

@GeorgeGreen UIButtonTypeSystem के लिए कोई कार्य समाधान नहीं ढूंढ सका । मुझे UIButtonTypeCustom का उपयोग करना था ।
scha

7.1 के बाद से, आपको सभी राज्यों में शीर्षक परिवर्तन लागू करने की आवश्यकता होगी, इसे केवल सामान्य स्थिति के लिए सेट करना अब लागू नहीं होता है। [_button setTitle:@"title" forState:UIControlStateDisabled]
सैम

0

UIButtonTypeSystem के लिए निम्नलिखित समाधानों में महान उत्तरों के ऊपर संयोजन करने का परिणाम है :

if (_button.enabled)
{
    [UIView setAnimationsEnabled:NO];
    [_button setTitle:@"title" forState:UIControlStateNormal];
    [UIView setAnimationsEnabled:YES];
}
else // disabled
{
    [UIView setAnimationsEnabled:NO];
    _button.enabled = YES;
    [_button setTitle:@"title" forState:UIControlStateNormal];
    _button.enabled = NO;
    [UIView setAnimationsEnabled:YES];
}

0

UITabBarController के भीतर व्यू कंट्रोलर में बटन शीर्षक बदलते समय मुझे बदसूरत एनीमेशन समस्या मिली। मूल रूप से स्टोरीबोर्ड में सेट किए गए शीर्षक अपने नए मूल्यों में लुप्त होने से पहले थोड़ी देर के लिए दिखाई दिए।

मैं सभी साक्षात्कारों के माध्यम से पुनरावृति करना चाहता था और NSLocalizedString के साथ अपने स्थानीय मूल्यों को प्राप्त करने के लिए कुंजी के रूप में बटन शीर्षक का उपयोग करता था;

for(UIView *v in view.subviews) {

    if ([v isKindOfClass:[UIButton class]]) {
        UIButton *btn = (UIButton*)v;
        NSString *newTitle = NSLocalizedString(btn.titleLabel.text, nil);
        [btn setTitle:newTitle];
    }

}

मुझे पता चला कि एनीमेशन को ट्रिगर करना वास्तव में btn.titleLabel.text के लिए कॉल है। इसलिए अभी भी स्टोरीबोर्ड का उपयोग करना और घटकों को गतिशील रूप से स्थानीय बनाना है जैसे कि मैं प्रत्येक बटन की बहाली आईडी (पहचान निरीक्षक में) को शीर्षक के समान स्थापित करना सुनिश्चित करता हूं और शीर्षक के बजाय कुंजी के रूप में उपयोग करता हूं;

for(UIView *v in view.subviews) {

    if ([v isKindOfClass:[UIButton class]]) {
        UIButton *btn = (UIButton*)v;
        NSString *newTitle = NSLocalizedString(btn.restorationIdentifier, nil);
        [btn setTitle:newTitle];
    }

}

आदर्श नहीं, लेकिन काम करता है ।।


0

आप वास्तव में एक एनीमेशन ब्लॉक के बाहर शीर्षक सेट कर सकते हैं, बस layoutIfNeeded()एक performWithoutAnimation के अंदर कॉल करना सुनिश्चित करें :

button1.setTitle("abc", forState: .Normal)
button2.setTitle("abc", forState: .Normal)
button3.setTitle("abc", forState: .Normal)
UIView.performWithoutAnimation {
    self.button1.layoutIfNeeded()
    self.button2.layoutIfNeeded()
    self.button3.layoutIfNeeded()
}

यदि आपके पास बटनों का एक गुच्छा है, layoutIfNeeded()तो सुपर व्यू पर कॉल करने पर विचार करें:

button1.setTitle("abc", forState: .Normal)
button2.setTitle("abc", forState: .Normal)
button3.setTitle("abc", forState: .Normal)
UIView.performWithoutAnimation {
    self.view.layoutIfNeeded()
}

0

Xhacker लियू विस्तार स्विफ्ट 3 में परिवर्तित हो गया:

extension UIButton {
    func setTitleWithoutAnimation(title: String?) {
        UIView.setAnimationsEnabled(false)

        setTitle(title, for: .normal)

        layoutIfNeeded()
        UIView.setAnimationsEnabled(true)
    }
}

-1

हो सकता है कि 2 एनिमेशन और 2 बटन जनरेट करना एक बेहतर उपाय है, जो उस समस्या से बचने के लिए है जो एक बटन के एनिमेशन को बदलने और बदलने में है?

मैंने एक दूसरा यूब्यूटॉन बनाया और 2 एनीमेशन तैयार किए, यह समाधान बिना किसी हिकअप के काम करता है।

    _button2.hidden = TRUE;
    _button1.hidden = FALSE;

    CGPoint startLocation = CGPointMake(_button1.center.x, button1.center.y - 70);
    CGPoint stopLocation  = CGPointMake(_button2.center.x, button2.center.y- 70);


    [UIView animateWithDuration:0.3 animations:^{ _button2.center = stopLocation;} completion:^(BOOL finished){_button2.center = stopLocation;}];
    [UIView animateWithDuration:0.3 animations:^{ _button1.center = startLocation;} completion:^(BOOL finished){_button1.center = startLocation;}];

-1

मुझे जवाबों के संयोजन के साथ काम करने के लिए मिला:

[[[button titleLabel] layer] removeAllAnimations];

    [UIView performWithoutAnimation:^{

        [button setTitle:@"Title" forState:UIControlStateNormal];

    }];

-1

स्विफ्ट में एनिमेटेड बटन शीर्षक परिवर्तन के लिए एक सुविधाजनक विस्तार जो डिफ़ॉल्ट कार्यान्वयन के साथ अच्छी तरह से निभाता है:

import UIKit

extension UIButton {
  /// By default iOS animated the title change, which is not desirable in reusable views
  func setTitle(_ title: String?, for controlState: UIControlState, animated: Bool = true) {
    if animated {
      setTitle(title, for: controlState)
    } else {
      UIView.setAnimationsEnabled(false)
      setTitle(title, for: controlState)
      layoutIfNeeded()
      UIView.setAnimationsEnabled(true)
    }
  }
}

@Fogmeister 1. मेरा उत्तर अलग है 2. अप-टू-डेट स्विफ्ट सिंटैक्स 3. एप्पल के एपीआई के साथ संगत UIButton
रिचर्ड टोपची
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.