একটি স্পর্শের পরে একটি ইউআইবাটন বাছাই করা


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)];

সম্পাদনা করুন:

মন্তব্যে আমার মন্তব্যগুলি সংক্ষিপ্ত করতে এবং আপনার পোস্ট করা কোডটি সম্বোধনের জন্য ... আপনার সম্পূর্ণ পটভূমির জন্য আপনার পটভূমির চিত্রগুলি সেট করা দরকার your UIControlআপনার কোড স্নিপেট অনুসারে, এই নিয়ন্ত্রণের অবস্থাটি অক্ষম করা হবে + নির্বাচিত + নেটওয়ার্ক অপারেশন সময়কালের জন্য হাইলাইট। এর অর্থ হল আপনার এটি করা দরকার:

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

আপনি যদি এটি অপসারণ করেন highlighted = YESতবে আপনার এটির প্রয়োজন হবে:

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

ছবিটি নাও?


বাস্তবে, আমি বিশ্বাস করি আমি আপনার পরামর্শ অনুযায়ী যা করছি; আমি কেবল এটি ইন্টারফেস বিল্ডারের মাধ্যমে করছি। আমি আমার প্রশ্নের উপরে ব্যবহার করা কোডটি যুক্ত করেছি ... সম্ভবত এটি সমস্যার কিছুটা আলোকপাত করবে? আমি যে আচরণটি চাই তা হ'ল আমি চাই যে আমার নেটওয়ার্ক অপারেশনের সময়কালে বাটনটি নির্বাচিত থাকবে। আমি যা দেখছি তা হ'ল স্পর্শের সময় বোতামটি হাইলাইট হয়, তারপরে স্পর্শটি করা হয়ে গেলে হাইলাইটটি চলে যায়। বোতাম-ওভার- নির্বাচিত হয়। এটি কেন কাজ করবে না তা আমার কাছে কোনও বোধগম্য নয়, তাই আমার মনে হয় আমি বোকা কিছু করছি। আমি আমার সমস্ত আইবি সংযোগগুলি পরীক্ষা করে দেখেছি এবং সেগুলি ভাল ...
গ্রেগ ম্যালেটিক

আমি বিশ্বাস করি না আপনি ইন্টারফেস বিল্ডারে হাইলাইট + নির্বাচিত রাষ্ট্রের জন্য একটি পটভূমি চিত্র সেট করতে পারবেন, কেবলমাত্র হাইলাইটেড এবং নির্বাচিত রাজ্যগুলি আলাদাভাবে। যদি আপনার বোতামটি এমন স্থানে থাকে যা হাইলাইট এবং নির্বাচিত উভয়ই সেট করা থাকে তবে আমি বিশ্বাস করি এটি হাইলাইট বা নির্বাচিত চিত্রগুলির মধ্যে নয় বরং আপনার স্বাভাবিক চিত্রে ডিফল্ট হবে। আপনার কোড থেকে আপনি বোতামের স্থিতি সেট করছেন যে নির্বাচন করা এবং হাইলাইট উভয়ই হ্যাঁ। চেকইনবাটনপুষ্প কি "টাচ আপ ইনসাইড" বা অন্য কোনও কিছুর সাথে সংযুক্ত রয়েছে?
ব্রায়ান হেনরি

হ্যাঁ, এটি "টাচ আপ ইনসাইড" এর সাথে সংযুক্ত। এবং যদি আমি 'হাইলাইটেড' রাষ্ট্রের সাথে সম্পর্কিত কোডটি সরিয়ে ফেলি তবে এটি এখনও কার্যকর হয় না। 'নির্বাচিত' রাষ্ট্রটি কখনই প্রদর্শিত হয় না।
গ্রেগ ম্যালেটিক

এছাড়াও, আপনি বোতামটি অক্ষম করছেন কেন? এর অর্থ হ'ল বাটন স্থিতি অক্ষম + হাইলাইট + নির্বাচিত। যদি আপনি YES তে হাইলাইট করা লাইন সেটিংটি সরিয়ে ফেলে থাকেন তবে আপনি + নির্বাচন করা অক্ষম করেছেন, সুতরাং আপনাকে (UIControlStateDisabled | UIControlStateSelected) রাজ্যের জন্য একটি চিত্র সেট করতে হবে।
ব্রায়ান হেনরি

ঠিক আছে, সমস্যা ছিল। আমি যখন অক্ষম কার্যকারিতাটি বের করেছিলাম তখন এটি প্রত্যাশার মতো কাজ করেছিল। ধন্যবাদ! (আপনার প্রশ্নের জবাব দেওয়ার জন্য, আমি বোতামটি অক্ষম করছি কারণ আমি চাই না যে নেটওয়ার্ক অপারেশন চলাকালীন কেউ আবার এটিকে চাপ দিচ্ছে।)
গ্রেগ ম্লেটিক

30

আমার একটি সহজ উপায় আছে সঞ্চালনের জন্য 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];
}

28

"আপনি শক্তি চালু করলে সবকিছুই ভাল হয়ে যায়"

    button.selected = !button.selected;

ইন্টারফেস বিল্ডারের বোতামের সাথে আমি আউটলেটটি সংযুক্ত করার পরে পুরোপুরি কাজ করে ...

আপনার ব্যাকগ্রাউন্ড ইমেজ সেটআপ করার দরকার নেই: স্টেট:, নির্মাতা আপনাকে ব্যাকগ্রাউন্ড নির্দিষ্ট করার অনুমতি দেয় (প্রয়োজনে পুনরায় আকার দেয়) বা / এবং অগ্রভাগ (আকার পরিবর্তন না করে) চিত্রগুলি।


27

এটি অর্জনের জন্য NSOperationQueue ব্যবহার করার চেষ্টা করুন। নীচে কোড ব্যবহার করে দেখুন:

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

আশাকরি এটা সাহায্য করবে.


এটি একটি দুর্দান্ত সমাধান, রবার্তো এবং পার্থ। একটি ছোট বিবরণ, যদিও, ব্যবহারকারী মাঝে মাঝে বোতামটি "বোকার" দেখতে পাবেন যদি তার বোতামটি বোতামটি চেপে ধরে রাখে। ঝাঁকুনি ঠেকানোর কোনও উপায় আছে কি?
স্কট লাইবারম্যান

8

একটি ব্লক ব্যবহার করুন যাতে আপনার সম্পূর্ণ পৃথক পদ্ধতি তৈরি করতে না হয়:

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

হালনাগাদ

পরিষ্কার হওয়ার জন্য আপনাকে এখনও সম্মিলিত রাজ্যের পাশাপাশি পটভূমি (বা সাধারণ চিত্র) সেট করতে হবে যেমন স্বীকৃত উত্তরে এসব্রকেটের মতো নিয়মিত লেখাগুলি বলে থাকে। এক পর্যায়ে আপনার বোতামটি উভয়ই নির্বাচিত এবং হাইলাইট হবে এবং আপনি যদি এ জাতীয় কিছু না করেন তবে এর জন্য আপনার কোনও চিত্র থাকবে না:

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

অন্যথায় আপনার বোতামটি সংক্ষিপ্ত নির্বাচিত + হাইলাইটেড স্টেটের জন্য ইউআইসিএন্ট্রোলস্টেট সাধারণ চিত্রটিতে ফিরে যেতে পারে এবং আপনি একটি ফ্ল্যাশ দেখতে পাবেন।


এফওয়াইআইটি dispatch_get_current_queue()"অবিশ্বস্ত" বলে উল্লেখ করা হয়েছে।
জ্যাকব রিলকিন

4
কোথায় বলা হয়েছে? বিকল্প কি?
বব স্প্রিন

এর dispatch_afterবিপরীতে ব্যবহার করার তাত্পর্য কি আছে dispatch_async?
ইলিয়া

হ্যাঁ dispatch_asyncএকটি ভাল পছন্দ।
বব স্প্রিন

4

দ্রুতগতিতে আমি নিম্নলিখিতগুলির মতো এটি করছি।

আমি একটি সাবক্লাস তৈরি করেছি 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 *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

উপরে উপস্থাপিত পদ্ধতির ব্যবহার করে এখানে একটি সি # / মনোো টাচ (জ্যামারিন.আইওএস) বাস্তবায়ন করা হচ্ছে। এটি ধরে নিয়েছে যে আপনি ইতিমধ্যে হাইলাইটেড চিত্রের স্থিতি সেট করেছেন এবং একই চিত্র ব্যবহার করার জন্য নির্বাচিত এবং নির্বাচিত | হাইলাইটেড স্টেটগুলি কনফিগার করে।

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;
        });
    });
};
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.