2017-01-02 17 views
0

私は、RegistrationButtonというカスタムUIButtonを作成しました。私は現在、ユーザーが3つのボタンの中から選択できるようにしようとしています。ボタンを選択すると背景色とテキストが変わります。ここ はIBActionがどのように見えるかです:私は1つのボタンを上の選択した場合しかし、すべての背景がに変更されIBActionで登録されたカスタムUIButtonの色を変更するにはどうすればよいですか?

import UIKit 

class RegistrationButton: UIButton { 


override func awakeFromNib() { 
    super.awakeFromNib() 
    addBorder() 

} 

required init(coder:NSCoder) { 
    super.init(coder:coder)! 
} 

func addBorder(){ 
    self.layer.borderColor = UIColor.white.cgColor 
    self.layer.borderWidth = 1 
} 

func selected(){ 
    self.backgroundColor = .white 

    self.setTitleColor(UIColor(red:67,green:204,blue:144,alpha:1), for: .normal) 
} 
func notSelected(){ 

    self.backgroundColor = UIColor(red:67,green:204,blue:144,alpha:1) 


    self.setTitleColor(UIColor.white, for: .normal) 
} 

}

:ここ

@IBAction func didTapBUtton(_ sender: UIButton) { 


    switch sender { 
    case studentButton: 
     studentButton.selected() 
     professionalButton.notSelected() 
     entrepreneurhsip.notSelected() 
     break 
    case professionalButton: 
     studentButton.notSelected() 
     professionalButton.selected() 
     entrepreneurhsip.notSelected() 
     break 
    case entrepreneurhsipButton: 
     studentButton.notSelected() 
     professionalButton.notSelected() 
     entrepreneurhsip.selected() 
     break 
    default: 
     break 
    } 
} 

は、どのように私のカスタムUIButtonクラスです白。

enter image description here

答えて

6

RGB01間浮動小数点でなければなりません。あなたは、すべてのパラメータを255で除算するだけで動作させることができます。

したがって、たとえば

self.backgroundColor = UIColor(red:67,green:204,blue:144,alpha:1) 

self.backgroundColor = UIColor(red: 67.0/255, green: 204.0/255, blue:144.0/255, alpha:1) 

する必要があります(あなたはタイトルの色を適用すると同じことが明らかに適用される)

追記:スウィフトでswitchにはありませんデフォルトでは無効になるため、breakを省略することができます。明示的にこの動作が必要な場合は、そのためにfallthroughというキーワードがあります。

+2

var selectedButton: UIButton? @IBAction func didTapBUtton(_ sender: UIButton) { selectedButton?.isSelected = false sender.isSelected = true selectedButton = sender } 

またはあなたはスウィフトでdidSetメカニズムを利用することができます。物事のベースラインの理由が質問者であっても、UIButtonを使用する方法を理解できず、必要に応じてクラスを拡張することはほとんどありません。 – dfd

0

UIControlEventsを使用して表示されることがあります。

self.addTarget(target, action: action, for: .touchUpInside) 

これは簡単な例です。もちろん、あなたはawakeFromNibとそのすべての他のコードのようなものを必要としません.OSが動作するようにしてください。

public static var touchDown: UIControlEvents { get } // on all touch downs 
public static var touchDownRepeat: UIControlEvents { get } // on multiple touchdowns (tap count > 1) 
public static var touchDragInside: UIControlEvents { get } 
public static var touchDragOutside: UIControlEvents { get } 
public static var touchDragEnter: UIControlEvents { get } 
public static var touchDragExit: UIControlEvents { get } 
public static var touchUpInside: UIControlEvents { get } 
public static var touchUpOutside: UIControlEvents { get } 
public static var touchCancel: UIControlEvents { get } 

私の一番下の行:

ここ:)のためにあなたが** addTargetに対してコーディングすることができ、他のものを(ですか? OSはあなたのために仕事をしましょう!

0

あなたがをしたいすべてのは、ボタンのハイライトを変更している場合は、別のアプローチは、ビュー/コントローラに出口コレクション @IBOutlet var buttons: [UIButton]!にすべてのボタンを接続することです。それは少しだとしてこれは小規模で簡単なコードを保持しますが、多くのボタンを持つ非効率的になり

@IBAction func didTapBUtton(_ sender: UIButton) { 
    // Select the button that was tapped, unselect the other buttons 
    buttons.forEach { $0.isSelected = ($0 == sender) } 
} 

:次に、didTapButton(_ sender: UIButton)であなたは(このようなもの)タップされたボタンに基づくボタンの選択したプロパティを更新し 1つのボタンだけをループして、そのうちの1つを強調表示しないようにするのは無駄です。多くのボタンを管理する場合は、別のアプローチは、あなたのコントローラではオプションセレクテッドボタンのプロパティを使用することです:アップ投票

var selectedButton: UIButton? { 
    didSet { 
     oldValue?.isSelected = false 
     selectedButton.isSelected = true 
    } 
} 

/.../ 

@IBAction func didTapBUtton(_ sender: UIButton) { 
    selectedButton = sender 
} 
関連する問題