Ответ 1
Я считаю, что этот пост имеет лучшее решение: iPhone UIButton с функциональностью UISwitch
UIButton имеет встроенный механизм. Существует выбранное свойство, которое вы можете установить и изменить скины на основе состояния.
Я использую UIButton настраиваемого типа, и я хочу использовать его как тумблер с изменением образа. Например, когда он щелкнут, если ранее он не был выбран в выбранном режиме, он должен идти в выбранном режиме или наоборот наоборот. Также у него будет другое изображение, и когда он будет выбран, у него будет другое изображение, если оно не будет.
Я не могу сделать это программно, есть ли хороший простой способ сделать это.
Я считаю, что этот пост имеет лучшее решение: iPhone UIButton с функциональностью UISwitch
UIButton имеет встроенный механизм. Существует выбранное свойство, которое вы можете установить и изменить скины на основе состояния.
В файле заголовка добавьте:
IBOutlet UIButton *toggleButton;
BOOL toggleIsOn;
@property (nonatomic, retain) IBOutlet UIButton *toggleButton;
В реализации:
- (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];
}
затем свяжите свою кнопку с IBActions и IBOutlet и инициализируйте toggleIsOn
до NO.
В интерфейсе:
@interface TransportViewController : UIViewController {
UIButton *button;
}
@property(nonatomic, retain) UIButton *button;
В реализации:
- (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];
}
UIButton
поддерживает по умолчанию функцию переключения. Чтобы использовать это, вам нужно установить другое изображение или даже цвет текста в Interface Builder для State Configuration = Selected
и использовать выбранное свойство UIButton
для переключения его состояния.
код:
- (IBAction)yourButtonTouch:(UIButton *)sender {
sender.selected = !sender.selected;
if (sender.selected) {
//...
// Action to be performed when button is selected or
// the first touch
// ...
}
}
- (IBAction)buttonTapped:(UIButton *)sender {
//first time sender.selected is No
if (sender.selected) {
//code here
sender.selected=NO;
}
else{
//code here
sender.selected=YES;
}
}
Единственная проблема заключается в том, что для достижения переключения вы должны использовать 2 изображения. Также вы не можете использовать свойство выделенное, потому что UIButton (UIControl) автоматически устанавливает это свойство под капотом, а точнее в touchBegan:, touchMoved:сильные > и т.д. методы. Лучший способ, который я предлагаю, - простое использование подкласса:
@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
Этого достаточно, чтобы заставить ваш переключатель работать
Для Swift 3
@IBAction func playPause(sender : UIButton){
sender.isSelected = !sender.isSelected
if sender.isSelected {
player.pause()
}else{
player.play()
}
}
Изменить изображение кнопки не является трудной задачей. И вы можете использовать некоторое значение BOOL, чтобы определить, находится ли ваша кнопка переключения в состоянии "ON". и в вашем методе onBtnClk вы можете просто изменить состояние своего значения BOOL и установить изображение для текущего состояния.
Я сделал этот класс, изменив класс на PGToggleButton в построителе интерфейса, это сделает. Он использует изображения для состояния Default и Highlighted и имеет общедоступное свойство для получения/установки фактического состояния.
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