2009-11-09 26 views
31

Tôi đang sử dụng UIButton loại tùy chỉnh và những gì tôi muốn là sử dụng nút như nút chuyển đổi với thay đổi hình ảnh. Giống như khi nó được nhấp nếu trước đó nó không ở trong chế độ được chọn, nó sẽ đi trong chế độ được chọn hoặc ngược lại. Ngoài ra nó sẽ có một hình ảnh khác nhau và khi nó được chọn, nó sẽ có một hình ảnh khác khi nó không được.Cách sử dụng UIButton làm công tắc bật tắt

Tôi không thể làm điều đó theo chương trình, có cách nào dễ dàng để thực hiện việc này không.

+0

thể trùng lặp của [iPhone UIButton với chức năng UISwitch] (http://stackoverflow.com/questions/2255166/iphone-uibutton -with-uiswitch-chức năng) – QED

Trả lời

0

Thay đổi hình ảnh nút không phải là một nhiệm vụ khó khăn. Và bạn có thể sử dụng một số giá trị BOOL để phát hiện xem nút chuyển đổi của bạn có ở trạng thái "BẬT" hay không. và trong phương thức onBtnClk của bạn, bạn chỉ có thể thay đổi trạng thái giá trị BOOL của bạn và đặt hình ảnh cho trạng thái hiện tại.

+0

vâng, nhưng bằng cách này chúng tôi đang thay đổi hình ảnh mỗi lần. Có cách nào mà chúng tôi không phải thay đổi nó trên mỗi nhấp chuột và chỉ cần gán nó lúc bắt đầu. – rkb

+0

Tôi không thể hiểu tại sao lại khó thay đổi hình ảnh? và câu hỏi của bạn, nếu có cách nào để chỉ định hành vi này chỉ một lần, tôi không biết nó. – Morion

15

Trong tập tin tiêu đề của bạn add:

IBOutlet UIButton *toggleButton; 
BOOL toggleIsOn; 

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

Trong việc thực hiện:

- (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]; 
} 

sau đó liên kết nút của bạn với IBActions và IBOutlet và khởi toggleIsOn để NO.

38

Tôi tin rằng bài này có một giải pháp tốt hơn: iPhone UIButton with UISwitch functionality

UIButton đã không xoay được xây dựng trong có một thuộc tính được chọn mà bạn có thể thiết lập và thay đổi giao diện dựa trên tiểu bang..

+9

Bỏ qua tất cả nội dung bên dưới và sử dụng liên kết của Lee ở trên. – Shaolo

+1

+1 sử dụng chức năng tích hợp sẵn, dễ sử dụng. cảm ơn – Luvie

7

Trong giao diện:

@interface TransportViewController : UIViewController { 

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

Trong việc thực hiện:

- (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

Vấn đề duy nhất ở đây là bạn phải sử dụng 2 hình ảnh để đạt được toggling. Ngoài ra, bạn không thể sử dụng được đánh dấu thuộc tính vì UIButton (UIControl) tự động đặt thuộc tính này trong mui xe, chính xác trong touchBegan:, touchMoved:, v.v. Cách tốt nhất mà tôi cung cấp là để subclassing sử dụng đơn giản:

@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 

này là khá đủ để làm cho chuyển đổi của bạn làm việc

-1

tôi làm lớp này, thay đổi lớp để PGToggleButton trong xây dựng giao diện sẽ làm điều đó. Nó sử dụng các hình ảnh cho trạng thái Mặc định và Được đánh dấu, và có một thuộc tính công khai để nhận/thiết lập trạng thái thực tế.

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, chuyển đổi đi BOOL chuyển đổi (BOOL boolean) {return! boolean; } – Geri

+0

Một hàm trợ giúp để tạo mã có thể đọc được ... – Geri

+0

Tôi muốn viết lại điều này bằng cách sử dụng thuộc tính trạng thái riêng của UIButton. Đó là những gì nó cho. Xem các câu trả lời khác. – 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 không hỗ trợ "chuyển đổi" chức năng theo mặc định. Để sử dụng điều này, bạn cần phải đặt một hình ảnh khác hoặc thậm chí là màu văn bản trong Bộ dựng giao diện cho số State Configuration = Selected và sử dụng thuộc tính đã chọn là UIButton để chuyển đổi trạng thái của nó.

Code:

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

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

    } 
} 
1

Đối Swift 3

@IBAction func playPause(sender : UIButton){ 

    sender.isSelected = !sender.isSelected 
    if sender.isSelected { 
     player.pause() 
    }else{ 
     player.play() 
    } 
}