web-dev-qa-db-fra.com

Comment utiliser UIButton comme bouton bascule?

J'essaie de créer un bouton bascule pour chaque cellule de mon tableau. Si vous appuyez dessus, l'image changera et, une nouvelle fois, changera encore l'image - Basculer. 

Dans la classe UIButton, je ne vois pas d'état selected

Je cherche un moyen de créer un bouton bascule avec UIButton afin de pouvoir changer l'état de chaque clic. 

Voici comment je le fais dans rubymotion en utilisant maintenant 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
20
Anthony

Vous pouvez facilement créer un bouton bascule. Il vous suffit de définir les images respectives pour les états respectifs. Vous pouvez ensuite utiliser la propriété selected pour basculer entre ces images.

J'ai créé un code objectif-c pur pour montrer comment vous pouvez le faire, mais vous pouvez aussi définir les images dans Storyboards ou Xibs également, consultez:

// 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
{
  aButton.selected = !aButton.selected;
}

J'espère que cela pourra vous aider.

37
Jan Cássio

Solution Swift 4.0 (à l'aide de Storyboards)

Premièrement, assurez-vous que le type UIButton est défini sur Custom dans l'inspecteur d'attributs.

 Ensure UIButton Type is set to Custom

// 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)
}

La capture d'écran ci-dessous illustre les références à toggleButton dans Storyboard et à Touch Up Inside Event, c'est-à-dire qu'un utilisateur appuie sur le bouton qui déclenche didPressButton ci-dessous.

 enter image description here

@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
JaredH

Puisque votre question a effectivement mentionné rmq, voici une façon de le faire:

Dans 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

Notez que le basculement est réalisé en interrogeant l'état actuel du bouton. Si vous devez vous en souvenir pour une utilisation ultérieure, vous pouvez enregistrer cette information dans une variable d'instance.

Dans votre feuille de style:

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

Notez l'utilisation de image_selected. Cela n’existe pas dans rmq, mais vous pouvez y arriver assez facilement. S'il s'agit d'un projet rmq, vous aurez un répertoire stylers /. Vous devriez y voir ui_button_styler.rb. Voici le code pour faire de l’état mis en surbrillance un citoyen de première classe:

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

Comme vous pouvez le constater, le code de votre contrôleur reste propre, les paramètres initiaux du bouton sont décalés vers la feuille de style et vous avez nettement étendu rmq pour comprendre l'état sélectionné.

1
Steve Ross

Vous pouvez le faire dans une approche très facile. Tout d’abord, dans votre balise viewDidLoad pour votre bouton. Disons self.toggleButton.tag = 111. Maintenant, dans votre fonction d'action de bouton, vous pouvez basculer le bouton comme suit:

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

Vous pouvez changer l'image du bouton comme ceci: [self.toggleButton setImage://some image forState:UIControlStateNormal];. C'est le moyen le plus simple, à mon avis. J'espère que ça va aider. 

0

Ma logique la plus simple pour basculer l'image du bouton. :) 

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