2009-11-09 15 views
31

Używam UIButton niestandardowego typu i to, czego chcę, to używać go jak przełącznika ze zmianą obrazu. Podobnie jak w przypadku kliknięcia, jeśli wcześniej nie był w wybranym trybie, powinien przejść w wybrany tryb lub w odwrotnym kierunku. Również będzie miał inny obraz, a po wybraniu będzie miał inny obraz, gdy nie jest.Jak używać Uibutton jako przełącznika

Nie jestem w stanie zrobić tego programowo, czy jest jakiś dobry prosty sposób na zrobienie tego.

+0

możliwe duplikat [iPhone UIButton z funkcją UISwitch] (http://stackoverflow.com/questions/2255166/iphone-uibutton -z funkcją-uiswitcha) – QED

Odpowiedz

0

Zmiana obrazu przycisku nie jest trudnym zadaniem. Możesz użyć pewnej wartości BOOL, aby wykryć, czy przycisk przełącznika jest w stanie "ON". iw swojej metodzie onBtnClk możesz po prostu zmienić stan swojej wartości BOOL i ustawić obraz dla bieżącego stanu.

+0

cóż, tak, ale w ten sposób zmieniamy obraz za każdym razem. Czy jest jakiś sposób, w którym nie musimy go zmieniać przy każdym kliknięciu i po prostu przypisać go na początku. – rkb

+0

Nie mogę zrozumieć, dlaczego tak trudno jest zmienić obraz? i na twoje pytanie, jeśli istnieje sposób, aby przypisać to zachowanie tylko raz, nie wiem. – Morion

15

w pliku nagłówka dodatku:

IBOutlet UIButton *toggleButton; 
BOOL toggleIsOn; 

@property (nonatomic, retain) IBOutlet UIButton *toggleButton; 

W realizacji:

- (IBACtion)toggle:(id)sender 
{ 
    if(toggleIsOn){ 
    //do anything else you want to do. 
    } 
    else { 
    //do anything you want to do. 
    } 
    toggleIsOn = !toggleIsOn; 
    [self.toggleButton setImage:[UIImage imageNamed:toggleIsOn ? @"on.png" :@"off.png"] forState:UIControlStateNormal]; 
} 

następnie połączyć przycisk z IBActions i IBOutlet i zainicjować toggleIsOn NO.

38

Uważam ten post ma lepsze rozwiązanie: iPhone UIButton with UISwitch functionality

UIButton został zbudowany w nieobrotowe Jest wybrany obiekt, który można ustawić i zmienić skórki na podstawie stanu..

+9

Zignoruj ​​wszystkie poniższe rzeczy i użyj linku Lee powyżej. – Shaolo

+1

+1 za pomocą wbudowanej funkcji, łatwy w użyciu. dzięki – Luvie

7

W interfejsie:

@interface TransportViewController : UIViewController { 

    UIButton *button; 
} 
@property(nonatomic, retain) UIButton *button; 

W realizacji:

- (void)loadView { 

[super loadView]; 

    ... 

    [self setButton:[UIButton buttonWithType:UIButtonTypeCustom]]; 
    [button addTarget:self action:@selector(onClick:) forControlEvents:UIControlEventTouchUpInside]; 
    [button setImage:[UIImage imageNamed:@"image1"] forState:UIControlStateNormal]; 
    [button setImage:[UIImage imageNamed:@"image2"] forState:UIControlStateSelected]; 
} 

- (void) onClick:(UIButton *)sender { 

    [sender setSelected:!sender.selected]; 
} 
1

Jedynym problemem jest to, że trzeba użyć 2 obrazy do osiągnięcia przełączanie. Ponadto nie można użyć opcji podświetlonej jako właściwość z powodu UIButton (UIControl) automatycznie ustawia tę właściwość pod maską, w celu dokładnego określenia metody touchBegan:, touchMoved: itp. Najlepszym sposobem Oferuję jest prosta obsługa podklasy:

@interface ToggleButton : UIButton 

@end 

@implementation ToggleButton 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [super touchesBegan:touches withEvent:event]; 
    self.highlighted = self.selected = !self.selected; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [super touchesMoved:touches withEvent:event]; 
    self.highlighted = self.selected; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [super touchesEnded:touches withEvent:event]; 
    self.highlighted = self.selected; 
} 

- (void)setSelected:(BOOL)selected{ 
    [super setSelected:selected]; 
    self.highlighted = selected; 
} 

@end 

Jest to dosyć, aby twój przełącznik pracy

-1

zrobiłem tej klasy, zmieniając klasę do PGToggleButton w konstruktora interfejsu to zrobi. Używa obrazów dla stanu Domyślny i Wyróżniony i ma właściwość publiczną do pobierania/ustawiania aktualnego stanu.

PGToggleButton.h

@interface PGToggleButton : UIButton 

@property (nonatomic, getter=isOn) BOOL on; 
-(void)toggle; 

@end 

PGToggleButton.m

#import "PGToggleButton.h" 


@interface PGToggleButton() 
@property (nonatomic, strong) UIImage *offStateImage; 
@property (nonatomic, strong) UIImage *onStateImage; 
-(void)touchedUpInside:(UIButton*) sender; 
@end 


@implementation PGToggleButton 
@synthesize on = _on; 
@synthesize offStateImage = _offStateImage; 
@synthesize onStateImage = _onStateImage; 

-(void)awakeFromNib 
{ 
    [super awakeFromNib]; 

    self.offStateImage = [self imageForState:UIControlStateNormal]; 
    self.onStateImage = [self imageForState:UIControlStateHighlighted]; 

    [self addTarget:self 
      action:@selector(touchedUpInside:) 
      forControlEvents:UIControlEventTouchUpInside]; 
} 

-(void)touchedUpInside:(UIButton*) sender 
{ [self toggle]; } 

-(void)toggle 
{ self.on = toggle(_on); } 

-(void)setOn:(BOOL) on 
{ 
    _on = on; 

    if (on) 
     [self setImage:self.onStateImage forState:(UIControlStateNormal)]; 
    else 
     [self setImage:self.offStateImage forState:(UIControlStateNormal)]; 
} 

@end 
+0

Oh, toggle goes BOOL toggle (BOOL boolean) {return! boolean; } – Geri

+0

Funkcja pomocnika umożliwiająca odczyt kodu ... – Geri

+0

Zapisałbym to ponownie, używając własności stanu UIButton. Po to jest to. Zobacz inne odpowiedzi. – n13

3
- (IBAction)buttonTapped:(UIButton *)sender { 


    //first time sender.selected is No 
    if (sender.selected) { 
     //code here 
     sender.selected=NO; 
    } 
    else{ 
    //code here 
     sender.selected=YES; 
    } 
} 
5

UIButton nie obsługuje funkcji "Przełącz" domyślnie. Aby tego użyć, musisz ustawić inny obraz, a nawet kolor tekstu w Konstruktorze interfejsu dla State Configuration = Selected i użyć wybranej właściwości UIButton, aby przełączyć jego stan.

Kod:

- (IBAction)yourButtonTouch:(UIButton *)sender { 

    sender.selected = !sender.selected; 
    if (sender.selected) { 
     //... 
     // Action to be performed when button is selected or 
     // the first touch 
     // ... 

    } 
} 
1

Swift 3

@IBAction func playPause(sender : UIButton){ 

    sender.isSelected = !sender.isSelected 
    if sender.isSelected { 
     player.pause() 
    }else{ 
     player.play() 
    } 
} 
Powiązane problemy