Как использовать UIButton в качестве тумблера - PullRequest
32 голосов
/ 09 ноября 2009

Я использую UIB-кнопку пользовательского типа, и я хочу использовать ее как тумблер с изменением изображения. Как и при нажатии на него, если ранее он не был в выбранном режиме, он должен переходить в выбранный режим или иным образом наоборот. Также у него будет другое изображение, и когда оно выбрано, у него будет другое изображение, когда его нет.

Я не могу сделать это программно, есть ли хороший простой способ сделать это.

Ответы [ 10 ]

39 голосов
/ 26 февраля 2010

Я считаю, что этот пост имеет лучшее решение: iPhone UIButton с функциональностью UISwitch

UIButton имеет встроенное переключение. Существует выбранное свойство, которое вы можете устанавливать и изменять скины в зависимости от состояния.

15 голосов
/ 28 ноября 2009

В вашем заголовочном файле добавьте:

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.

8 голосов
/ 11 апреля 2012

В интерфейсе:

@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];
}
6 голосов
/ 26 апреля 2015

UIButton поддерживает функцию «переключения» по умолчанию. Чтобы использовать это, вам нужно установить другое изображение или даже цвет текста в Интерфейсном Разработчике для 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
        // ... 

    }
}
4 голосов
/ 07 июня 2017

Для Swift 3

@IBAction func playPause(sender : UIButton){


   if sender.isSelected {
      player.pause()
   }else{
      player.play()
  }
  sender.isSelected = !sender.isSelected
}
3 голосов
/ 17 сентября 2014
- (IBAction)buttonTapped:(UIButton *)sender {


   //first time sender.selected is No
    if (sender.selected) {
        //code here
        sender.selected=NO;
    }
    else{
    //code here
        sender.selected=YES;
    }
}
1 голос
/ 18 июня 2012

Единственная проблема здесь в том, что вам нужно использовать 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

Этого вполне достаточно, чтобы ваш тумблер работал

0 голосов
/ 01 октября 2018

Для этого мы можем использовать UIButton Subclass:

class UIToggleButton: UIButton {
    fileprivate let onImage: UIImage
    fileprivate let offImage: UIImage
    fileprivate let target: AnyObject
    fileprivate let onAction: Selector
    fileprivate let offAction: Selector
    var isOn: Bool {
        didSet {
            let image = isOn ? onImage : offImage
            setImage(image, for: UIControlState())
        }
    }

    init(onImage: UIImage,
        offImage: UIImage,
        target: AnyObject,
        onAction: Selector,
        offAction: Selector)
    {
        isOn = false
        self.onImage = onImage
        self.offImage = offImage
        self.target = target
        self.onAction = onAction
        self.offAction = offAction
        super.init(frame: CGRect.zero)
        setImage(offImage, for: UIControlState())
        addTarget(self, action: #selector(UIToggleButton.tapAction), for: .touchUpInside)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    @objc func tapAction() {
        let sel = isOn ? onAction : offAction
        isOn = !isOn
        _ = target.perform(sel)
    }
}
0 голосов
/ 09 сентября 2012

Я создал этот класс, изменив класс на PGToggleButton в Интерфейсном компоновщике. Он использует изображения для состояния «По умолчанию» и «Выделенное» и имеет открытое свойство для получения / установки фактического состояния.

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 голосов
/ 09 ноября 2009

Изменить изображение кнопки не сложная задача. И вы можете использовать некоторое значение BOOL, чтобы определить, находится ли ваша кнопка включения в состоянии «ВКЛ». а в вашем методе onBtnClk вы можете просто изменить состояние значения BOOL и установить изображение для текущего состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...