Как использовать UIButton как Toggle Button?

Я пытаюсь создать кнопку переключения для каждой ячейки в моей таблице. При нажатии, это изменит изображение, и при повторном нажатии оно снова изменит изображение - Переключить.

В классе UIButton я не вижу состояния selected.

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

Вот как я делаю это в rubymotion прямо сейчас, используя rmq

@fav_button.on(:touch) do |sender|
  puts "pressed fav button for id: " + data[:id] + " and name: " + data[:name]
  #how do I change the state here?
end

Ответы

Ответ 1

Вы можете легко создать кнопку переключения, вам просто нужно установить соответствующие изображения для соответствующих состояний, после чего вы можете использовать свойство selected для переключения между этими изображениями.

Я сделал чистый objective-c код, чтобы показать, как вы можете это сделать, но вы также можете установить изображения в Storyboards ou Xibs, проверьте:

// First, set the images for normal state and selected state
[button setImage:normalImage forState:UIControlStateNormal];
[button setImage:selectedImage forState:UIControlStateSelected];


// Don't forget to add an action handler to toggle the selected property
[button addTarget:self action:@selector(buttonTouch:withEvent:) forControlEvents:UIControlEventTouchUpInside];


// Now, in your button action handler, you can do something like this:
- (void)buttonTouch:(UIButton *)aButton withEvent:(UIEvent *)event
{
  button.selected = !button.selected;
}

Надеюсь, это поможет вам.

Ответ 2

Решение Swift 4.0 (с использованием раскадровки)

Сначала убедитесь, что для параметра UIButton установлено значение Custom в инспекторе атрибутов.

Убедитесь, что для UIButton Type установлено значение

// Reference to UIButton in Storyboard
@IBOutlet weak var toggleButton: UIButton!

override func viewDidLoad() {
    super.viewDidLoad()

    // assumes you have two images in the bundle/project 
    // called normal.png and selected.png.
    let normalImage = UIImage(named: "normal.png")
    let selectedImage = UIImage(named: "selected.png")

    toggleButton.setImage(normalImage, for: .normal)
    toggleButton.setImage(selectedImage, for: .selected)
}

Ниже скриншот демонстрирует ссылку на toggleButton в Storyboard и Touch Up Inside Событие, то есть: пользователь нажимает кнопку, которая срабатывает ниже didPressButton.

введите описание изображения здесь

@IBAction func didPressButton(_ sender: Any) {

    // if the button was selected, then deselect it.
    // otherwise if it was not selected, then select it.
    toggleButton.isSelected = !trackingButton.isSelected

    if toggleButton.isSelected {
        print("I am selected.")

    } else {
        print("I am not selected.")
    }
}

Ответ 3

Поскольку в вашем вопросе упоминалось rmq, здесь можно использовать способ rmq:

В viewDidLoad:

@hello_world_label = rmq.append(UILabel, :hello_world).get
@button            = rmq.append(UIButton, :toggleable_button)

@button.on(:touch) do |sender|
  sender.selected = !sender.selected?
end

Обратите внимание, что переход осуществляется путем запроса фактического состояния кнопки. Если вам нужно запомнить это для последующего использования, вы можете сохранить его в переменной экземпляра.

В вашей таблице стилей:

def toggleable_button(st)
  st.frame = {t: 200, w: 100, h: 24}
  st.image_normal = image.resource('toggle_me')
  st.image_selected = image.resource('toggled')
end

Обратите внимание на использование image_selected. Ну, этого не существует в rmq, но вы можете сделать это довольно легко. Если это проект rmq, у вас будет каталог stylers/. Там вы увидите ui_button_styler.rb. Здесь код, чтобы сделать выделенное состояние первоклассным гражданином:

module RubyMotionQuery
  module Stylers
    class UIButtonStyler < UIControlStyler 

      def image_selected=(value)
        @view.setImage(value, forState:UIControlStateSelected)
      end
      def image_selected
        @view.imageForState UIControlStateSelected
      end

    end
  end
end

Как вы можете видеть, ваш код контроллера остается чистым, начальные настройки кнопки смещаются в таблицу стилей, и вы четко расширили rmq, чтобы понять выбранное состояние.

Ответ 4

Моя самая легкая логика для переключения изображения кнопки.:)

(IBAction)toggleButton:(id)sender {
       if (self.toggleButton.selected==YES) {
           [self.toggleButton setSelected:NO];
        }else{
       [self.toggleButton setSelected:YES];
       [self.toggleButton setImage:[UIImage imageNamed:@"favStar.png"]    forState:UIControlStateSelected];
       }

Ответ 5

Вы можете сделать это очень легко. Прежде всего, в тэге viewDidLoad для вашей кнопки. Скажем, self.toggleButton.tag = 111. Теперь в вашей функции действия кнопки вы можете переключить кнопку, например:

- (IBAction)toggling:(id)sender{
    if(self.toggleButton.tag == 111){
        //this is normal state
        [self.toggleButton setTitle:@"Less..." forState:UIControlStateNormal];
        self.toggleButton.tag = 222;
    }else{
        //selected state
        [self.toggleButton setTitle:@"More..." forState:UIControlStateNormal];
        self.toggleButton.tag = 111;
    }
}

Вы можете изменить изображение кнопки следующим образом [self.toggleButton setImage://some image forState:UIControlStateNormal];. Это самый простой способ, я думаю. Надеюсь, это поможет.