Setelah pengguna saya mengklik sebuah tombol, saya ingin tombol tersebut tetap ditekan selama saya melakukan operasi jaringan. Ketika operasi jaringan selesai, saya ingin tombol tersebut kembali ke keadaan defaultnya.
Saya sudah mencoba menelepon - [UIButton setSelected:YES]
tepat setelah tombol ditekan (dengan panggilan yang sesuai ke - [UIButton setSelected:NO]
setelah operasi jaringan saya selesai) tetapi sepertinya tidak melakukan apa-apa. Hal yang sama jika saya menelepon setHighlighted:
.
Saya kira saya bisa mencoba menukar gambar latar belakang untuk menunjukkan status yang dipilih selama operasi jaringan, tetapi itu sepertinya hack. Ada saran yang lebih baik?
Inilah tampilan kode saya:
- (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;
}
Saya memiliki cara yang lebih mudah. Cukup gunakan "performSelector" dengan 0 penundaan untuk melakukan
[button setHighlighted:YES]
. Ini akan melakukan penyorotan ulang setelah runloop saat ini berakhir.- (IBAction)buttonSelected:(UIButton*)sender { NSLog(@"selected %@",sender.titleLabel.text); [self performSelector:@selector(doHighlight:) withObject:sender afterDelay:0]; } - (void)doHighlight:(UIButton*)b { [b setHighlighted:YES]; }
sumber
"Semuanya menjadi lebih baik saat Anda menyalakan"
button.selected = !button.selected;
bekerja dengan sempurna ... setelah saya menghubungkan stopkontak ke tombol di Interface Builder.
Anda tidak perlu setBackgroundImage: forState :, pembuat memungkinkan Anda menentukan gambar latar belakang (diubah ukurannya jika perlu) atau / dan latar depan (tidak diubah ukurannya).
sumber
Coba gunakan NSOperationQueue untuk mencapai ini. Coba kode sebagai berikut:
[[NSOperationQueue mainQueue] addOperationWithBlock:^{ theButton.highlighted = YES; }];
Semoga ini membantu.
sumber
Gunakan satu blok sehingga Anda tidak perlu membuat metode terpisah secara keseluruhan:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0), dispatch_get_main_queue(), ^{ theButton.highlighted = YES; });
Memperbarui
Untuk lebih jelasnya Anda masih perlu mengatur latar belakang (atau gambar normal) untuk status kombinasi serta yang biasa seperti kata sbrocket dalam jawaban yang diterima. Pada titik tertentu tombol Anda akan dipilih dan disorot, dan Anda tidak akan memiliki gambar untuk itu kecuali Anda melakukan sesuatu seperti ini:
[button setBackgroundImage:someImage forState (UIControlStateHighlighted|UIControlStateSelected)];
Jika tidak, tombol Anda dapat kembali ke gambar UIControlStateNormal untuk status singkat yang dipilih + disorot dan Anda akan melihat flash.
sumber
dispatch_get_current_queue()
dinyatakan sebagai "tidak dapat diandalkan".dispatch_after
sebagai lawandispatch_async
?dispatch_async
adalah pilihan yang lebih baik.Dengan cepat saya melakukannya seperti berikut ini.
Saya membuat Subkelas
UIButton
dan menerapkan properti khususstate
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 } } }
Bekerja dengan sempurna untuk saya.
sumber
Saya memiliki masalah serupa di mana saya menginginkan tombol untuk tetap menyorotnya setelah diklik. Masalahnya adalah jika Anda mencoba menggunakan
setHighlighted:YES
tindakan klik di dalam Anda, tindakan itu akan disetel ulang tepat setelah Anda mengklik tindakan,- (IBAction)checkInButtonPushed
Saya menyelesaikan ini dengan menggunakan NSTimer seperti ini
NSTimer *timer; timer = [NSTimer scheduledTimerWithTimeInterval: 0.01 target: self selector: @selector(selectCurrentIndex) userInfo: nil repeats: NO];
dan kemudian memanggil
setHighlighted:YES
dariselectCurrentIndex
metode saya . Saya menggunakanUIButtonTypeRoundedRect
tombol biasa .sumber
Saya punya cara lain ... jika Anda tidak ingin menggunakan gambar, dan Anda ingin efek tombol yang ditekan, Anda dapat membuat subkelas Tombol dan inilah kode saya:
di File .h:
@interface reservasButton : UIButton { BOOL isPressed; } @end
Di File .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; } } `
sumber
Berikut adalah implementasi C # / MonoTouch (Xamarin.iOS) menggunakan pendekatan yang disajikan di atas. Ini mengasumsikan Anda telah menyetel status gambar yang Disorot, dan mengkonfigurasi status yang dipilih dan dipilih | yang disorot untuk menggunakan gambar yang sama.
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; }); }); };
sumber