एक स्पर्श के बाद UIButton का चयन करना


90

मेरे उपयोगकर्ता द्वारा एक बटन क्लिक करने के बाद, मैं उस बटन को उस समय के दौरान पुश करना चाहता हूं, जब मैं एक नेटवर्क ऑपरेशन करता हूं। जब नेटवर्क ऑपरेशन पूरा हो जाता है, तो मैं चाहता हूं कि बटन अपनी डिफ़ॉल्ट स्थिति पर लौट आए।

मैंने कॉल करने की कोशिश की है - [UIButton setSelected:YES]बटन पुश के ठीक बाद (इसी कॉल के साथ - [UIButton setSelected:NO]मेरे नेटवर्क ऑप फिनिश के बाद) लेकिन यह कुछ भी करने के लिए प्रतीत नहीं होता है। एक ही बात अगर मैं फोन करता हूं setHighlighted:

मुझे लगता है कि मैं नेटवर्क ऑप की अवधि के लिए एक चयनित राज्य को दर्शाने के लिए पृष्ठभूमि की छवि को स्वैप करने की कोशिश कर सकता हूं, लेकिन यह हैक की तरह लगता है। कोई बेहतर सुझाव?

यहाँ मेरा कोड कैसा दिखता है:

- (IBAction)checkInButtonPushed
{
    self.checkInButton.enabled = NO;
    self.checkInButton.selected = YES;
    self.checkInButton.highlighted = YES;
    [self.checkInActivityIndicatorView startAnimating];
    [CheckInOperation startWithPlace:self.place delegate:self];
}

- (void)checkInCompletedWithNewFeedItem:(FeedItem*)newFeedItem wasNewPlace:(BOOL)newPlace possibleError:(NSError*)error;
{
    [self.checkInActivityIndicatorView stopAnimating];
    self.checkInButton.enabled = YES;
    self.checkInButton.selected = NO;
    self.checkInButton.highlighted = NO;
}

जवाबों:


73

आप UIControlStatesबटन पर भिन्न के लिए चित्र कैसे सेट कर रहे हैं ? आप के लिए एक पृष्ठभूमि छवि सेट कर रहे हैं UIControlStateHighlightedऔर साथ ही UIControlStateSelected?

UIImage *someImage = [UIImage imageNamed:@"SomeResource.png"];
[button setBackgroundImage:someImage forState:UIControlStateHighlighted];
[button setBackgroundImage:someImage forState:UIControlStateSelected];

यदि आप चयनित राज्य को बटन टच डाउन ईवेंट पर सेट कर रहे हैं, तो अंदर टच अप करें, आपका बटन वास्तव में हाइलाइटेड + चयनित स्थिति में होगा, इसलिए आप इसे भी सेट करना चाहेंगे।

[button setBackgroundImage:someImage forState:(UIControlStateHighlighted|UIControlStateSelected)];

संपादित करें:

टिप्पणियों में मेरी टिप्पणी का सारांश देने के लिए और आपके द्वारा पोस्ट किए गए कोड को संबोधित करने के लिए ... आपको अपनी पृष्ठभूमि छवियों को उस पूर्ण सेट के लिए सेट करने की आवश्यकता है UIControlजो आप में हैं। आपके कोड स्निपेट के अनुसार, यह नियंत्रण स्थिति अक्षम + चयनित + होगी। नेटवर्क ऑपरेशन की अवधि के लिए हाइलाइट किया गया। इसका मतलब है कि आपको यह करने की आवश्यकता होगी:

[button setBackgroundImage:someImage forState:(UIControlStateDisabled|UIControlStateHighlighted|UIControlStateSelected)];

यदि आप इसे हटा देते हैं highlighted = YES, तो आपको इसकी आवश्यकता होगी:

[button setBackgroundImage:someImage forState:(UIControlStateDisabled|UIControlStateSelected)];

तस्वीर ले आओ?


वास्तव में, मेरा मानना ​​है कि मैं वही कर रहा हूं जो आप सुझाते हैं; मैं सिर्फ इंटरफ़ेस बिल्डर के माध्यम से कर रहा हूँ। मैंने उस कोड को जोड़ा जो मैं अपने प्रश्न के ऊपर उपयोग कर रहा हूं ... शायद यह समस्या पर कुछ प्रकाश डालेगा? जो व्यवहार मैं चाहता हूं, वह यह है कि मैं चाहता हूं कि मेरे नेटवर्क ऑपरेशन की अवधि के दौरान बटन का चयन किया जाए। मैं जो देख रहा हूं वह यह है कि जब टच किया जाता है तो बटन हाईलाइट हो जाता है, फिर टच हो जाने पर हाइलाइट चली जाती है। बटन -never- चयनित हो जाता है। यह काम क्यों नहीं करेगा, इससे मुझे कोई मतलब नहीं है, इसलिए मुझे लगता है कि मैं कुछ बेवकूफी कर रहा हूं। मैंने अपने सभी आईबी कनेक्शनों की जाँच कर ली है और वे अच्छे हैं ...
ग्रेग मैलिक

मुझे विश्वास नहीं है कि आप इंटरफ़ेस बिल्डर में हाइलाइट किए गए + चयनित राज्य के लिए एक पृष्ठभूमि छवि सेट कर सकते हैं, केवल हाइलाइट किए गए और चयनित राज्य अलग से। यदि आपका बटन ऐसी स्थिति में था, जिसे हाइलाइट किया गया और चयनित दोनों सेट किए गए थे, तो मेरा मानना ​​है कि यह आपकी सामान्य छवि के लिए डिफ़ॉल्ट होगा, न कि हाइलाइट की गई या चयनित छवियों में। आपके कोड से, आप बटन की स्थिति को सेट कर रहे हैं जैसे कि चयनित और हाइलाइट किए गए दोनों हाँ हैं। क्या CheckInButtonPushed "टच अप इनसाइड" या कुछ और से जुड़ा है?
ब्रायन हेनरी

हां, यह "टच अप इनसाइड" से जुड़ा है। और अगर मैं 'हाइलाइटेड' राज्य से संबंधित कोड हटाता हूं, तो भी यह काम नहीं करता है। 'चयनित' अवस्था कभी नहीं दिखाई देती है।
ग्रेग मैलिक

इसके अलावा, आप बटन को अक्षम क्यों कर रहे हैं? इसका वास्तव में मतलब होगा कि बटन स्थिति अक्षम + हाइलाइटेड + चयनित है। यदि आपने हां में हाइलाइट की गई लाइन सेटिंग को हटा दिया है, तो आपने अक्षम कर दिया है + चयनित, इसलिए आपको (UIControlStateDisabled | UIControlStateSelected) स्थिति के लिए एक छवि सेट करने की आवश्यकता है।
ब्रायन हेनरी

ठीक है, यही समस्या थी। जब मैंने अक्षम कार्यक्षमता को लिया, तो यह उम्मीद के मुताबिक काम किया। धन्यवाद! (आपके प्रश्न का उत्तर देने के लिए, मैं बटन को अक्षम कर रहा हूं क्योंकि मैं नहीं चाहता कि कोई इसे फिर से धक्का दे जबकि नेटवर्क ऑपरेशन चल रहा है।)
ग्रेग मैलिक

30

मेरे पास एक आसान तरीका है। बस "PerformSelector" का उपयोग करने के लिए 0 देरी से प्रदर्शन करें [button setHighlighted:YES]। यह वर्तमान रनअप समाप्त होने के बाद फिर से हाइलाइटिंग का प्रदर्शन करेगा।

- (IBAction)buttonSelected:(UIButton*)sender {
    NSLog(@"selected %@",sender.titleLabel.text);
    [self performSelector:@selector(doHighlight:) withObject:sender afterDelay:0];
}

- (void)doHighlight:(UIButton*)b {
    [b setHighlighted:YES];
}

27

"जब आप बिजली चालू करते हैं तो सब कुछ बेहतर हो जाता है"

    button.selected = !button.selected;

पूरी तरह से काम करता है ... के बाद मैं इंटरफ़ेस बिल्डर में बटन से आउटलेट जुड़ा।

आपको setBackgroundImage को सेट करने की आवश्यकता नहीं है: forState:, बिल्डर आपको पृष्ठभूमि को निर्दिष्ट करने की अनुमति देता है (यदि आवश्यक हो तो आकार बदला जाता है) या / और अग्रभूमि (आकार परिवर्तन नहीं) छवियां।


27

इसे प्राप्त करने के लिए NSOperationQueue का उपयोग करने का प्रयास करें। कोड निम्नानुसार आज़माएं:

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    theButton.highlighted = YES;
}];

उम्मीद है की यह मदद करेगा।


यह एक महान समाधान है, रॉबर्टो और पार्थ। एक छोटा सा विवरण, हालांकि, यह है कि आप कभी-कभी एक "झिलमिलाहट" देखेंगे यदि उपयोगकर्ता बटन पर अपनी उंगली दबाए रखता है। क्या झिलमिलाहट को रोकने का कोई तरीका है?
स्कॉट लेबरमैन

8

एक ब्लॉक का उपयोग करें ताकि आपको एक पूरी अलग विधि का निर्माण न करना पड़े:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0), dispatch_get_main_queue(), ^{
    theButton.highlighted = YES;
});

अपडेट करें

स्पष्ट होने के लिए आपको अभी भी संयोजन राज्यों के लिए पृष्ठभूमि (या सामान्य छवि) को सेट करने की आवश्यकता है और साथ ही साथ नियमित रूप से जैसे कि sbrocket स्वीकार किए गए उत्तर में कहते हैं। कुछ बिंदु पर आपका बटन चयनित और हाइलाइट किया जाएगा, और आपके पास इसके लिए कोई छवि नहीं होगी जब तक आप ऐसा कुछ नहीं करते:

[button setBackgroundImage:someImage forState (UIControlStateHighlighted|UIControlStateSelected)];

अन्यथा आपका बटन संक्षिप्त चयनित + हाइलाइट किए गए राज्य के लिए UIControlStateNormal छवि पर वापस आ सकता है और आपको एक फ्लैश दिखाई देगा।


FYI dispatch_get_current_queue()को "अविश्वसनीय" कहा जाता है।
याकूब रिलेकिन

1
कहाँ कहा गया है? विकल्प क्या है?
बॉब स्प्रीन

क्या इसके dispatch_afterविपरीत उपयोग करने में महत्व है dispatch_async?
इल्या

हां। dispatch_asyncएक बेहतर विकल्प है।
बॉब स्प्रीन

3

स्विफ्ट में मैं इसे निम्न की तरह कर रहा हूं।

मैं एक उप-वर्ग बनाता हूं UIButtonऔर एक कस्टम संपत्ति कार्यान्वित करता हूंstate

class ActiveButton: UIButton {

    private var _active = false
    var active:Bool {
        set{
            _active = newValue
            updateState()
        }
        get{
            return _active
        }
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.addTarget(self, action: #selector(ActiveButton.touchUpInside(_:)), forControlEvents: .TouchUpInside)
    }

    func touchUpInside(sender:UIButton) {
        active = !active
    }

    private func updateState() {
        NSOperationQueue.mainQueue().addOperationWithBlock {
            self.highlighted = self.active
        }
    }

}

मेरे लिए पूरी तरह से काम करता है।


1

मुझे एक समान समस्या थी जहां मुझे क्लिक के बाद हाइलाइट रखने के लिए एक बटन चाहिए था। समस्या यह है कि यदि आप setHighlighted:YESक्लिक करने की क्रिया के अंदर उपयोग करने का प्रयास करते हैं, तो यह आपके द्वारा क्रिया पर क्लिक करने के तुरंत बाद रीसेट हो जाएगा,- (IBAction)checkInButtonPushed

मैंने इस तरह एक NSTimer का उपयोग करके इसे हल किया

NSTimer *timer;
timer = [NSTimer scheduledTimerWithTimeInterval: 0.01
                                         target: self
                                       selector: @selector(selectCurrentIndex)
                                       userInfo: nil
                                        repeats: NO];

और फिर setHighlighted:YESमेरे selectCurrentIndexतरीके से कॉल करें । मैं नियमित UIButtonTypeRoundedRectबटन का उपयोग करता हूं ।


0

मेरे पास एक और तरीका है ... यदि आप छवियों का उपयोग नहीं करना चाहते हैं, और आप एक दबाए गए बटन का प्रभाव चाहते हैं, तो आप बटन को दबा सकते हैं और यहां मेरा कोड:

इन .h फ़ाइल:

@interface reservasButton : UIButton {

BOOL isPressed;
}
 @end

.M फ़ाइल में:

#import <QuartzCore/QuartzCore.h>


 @implementation reservasButton

 -(void)setupView {  //This is for Shadow

    self.layer.shadowColor = [UIColor blackColor].CGColor;
    self.layer.shadowOpacity = 0.5; 
    self.layer.shadowRadius = 1;    
    self.layer.shadowOffset = CGSizeMake(2.0f, 2.0f); //comment
    //   self.layer.borderWidth = 1;
    self.contentVerticalAlignment   = UIControlContentVerticalAlignmentCenter;
    self.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;

    // [self setBackgroundColor:[UIColor whiteColor]];

    //  self.opaque = YES;


}

-(id)initWithFrame:(CGRect)frame{
    if((self = [super initWithFrame:frame])){
        [self setupView];
    }

    return self;
}

-(id)initWithCoder:(NSCoder *)aDecoder{
    if((self = [super initWithCoder:aDecoder])){
        [self setupView];
    }

    return self;
}

//Here is the important code

 -(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{


  if (isPressed == FALSE) {

      self.contentEdgeInsets = UIEdgeInsetsMake(1.0,1.0,-1.0,-1.0);
      self.layer.shadowOffset = CGSizeMake(1.0f, 1.0f);
      self.layer.shadowOpacity = 0.8;

      [super touchesBegan:touches withEvent:event];

      isPressed = TRUE;

     }
     else {

         self.contentEdgeInsets = UIEdgeInsetsMake(0.0,0.0,0.0,0.0);
         self.layer.shadowOffset = CGSizeMake(2.0f, 2.0f);
         self.layer.shadowOpacity = 0.5;

         [super touchesEnded:touches withEvent:event];

         isPressed = FALSE;

     }


 } `

0

यहाँ ऊपर प्रस्तुत दृष्टिकोण का उपयोग करते हुए C # / MonoTouch (Xamarin.iOS) कार्यान्वयन है। यह मानता है कि आपने पहले से हाइलाइट की गई छवि स्थिति सेट कर दी है, और चयनित और चयनित हाइलाइट किए गए राज्यों को समान छवि का उपयोग करने के लिए कॉन्फ़िगर करता है।

var selected = button.BackgroundImageForState(UIControlState.Highlighted);
button.SetBackgroundImage(selected, UIControlState.Selected);
button.SetBackgroundImage(selected, UIControlState.Selected | UIControlState.Highlighted);
button.TouchUpInside += delegate
{
    NSTimer.CreateScheduledTimer(TimeSpan.FromMilliseconds(0), delegate
    {
        button.Highlighted = true;
        NSTimer.CreateScheduledTimer(TimeSpan.FromMilliseconds(200), delegate
        {
            button.Highlighted = false;
        });
    });
};
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.