Как переключаться между двумя цветами в UIView с помощью UITapGestureRecognizer


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

class ViewController: UIViewController {

    var squarView:UIView!;

    var squarIsBlue:Bool = true;

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        squarView = UIView(frame: CGRect(x: 130, y: 130, width: 150, height: 150));
        squarView.backgroundColor = UIColor.redColor();

        var squarTap = UITapGestureRecognizer(target: self, action: "tapMe:");

        squarView.addGestureRecognizer(squarTap);

        squarView.userInteractionEnabled = true;


        view.addSubview(squarView);
    }



    func tapMe(sender:UIGestureRecognizer){

        squarView.backgroundColor = UIColor.blueColor();
        if (squarIsBlue == false){
            squarView.backgroundColor = UIColor.yellowColor();
            if(squarIsBlue == true){
                squarView.backgroundColor = UIColor.redColor();

            }
            squarIsBlue = true

            }


            squarIsBlue = false;

            println("Squar Tapped!!!");

    }




    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

Что я делаю не так?

2   2   2015-04-19 15:54:46

2 ответа:

Вы можете установить переменную squarIsBlue как int вместо Bool, чтобы установить цвет, например, 0 = красный (по умолчанию), 1 = синий, 2= Желтый,

Итак, теперь, в viewdidLoad, установите что-то вроде

squarIsBlue=0
squarView.backgroundColor = UIColor.redColor();

Измените метод касания, например

func tapMe(sender:UIGestureRecognizer){

    squarView.backgroundColor = UIColor.blueColor();
    if (squarIsBlue == 0){
        squarView.backgroundColor = UIColor.blueColor();
        squarIsBlue=1;
    else if (squarIsBlue == 1) {
        squarView.backgroundColor = UIColor.yellowColor();
        squarIsBlue =2
    }
    else if (squarIsBlue==2) {
        squarView.backgroundColor = UIColor.redColor();
        squarIsBlue=0;
    } 
    println("Squar Tapped!!!");
}

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

HTH, наслаждайтесь кодированием !!

У вас есть ошибка в логике tapMe. В этом конкретном случае лучше использовать целочисленную переменную вместо логической, так как у вас есть 3 состояния (красный,синий,желтый)...

Попробуйте это :

    import UIKit

class ViewController: UIViewController {

    private var tapGesture : UITapGestureRecognizer!
    private var childView : UIView!

    private let colorPalette = [UIColor.redColor(),UIColor.blueColor(),UIColor.yellowColor()]
    private var currentColorIdx = 0 {
        didSet{
            childView.backgroundColor = colorPalette[currentColorIdx]
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        tapGesture = UITapGestureRecognizer(target: self, action: "didTap:")

        childView = UIView(frame: CGRect(x: 130, y: 130, width: 150, height: 150))
        childView.backgroundColor = colorPalette.first
        self.view.addSubview(childView)
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        childView.addGestureRecognizer(self.tapGesture)
    }

    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(true)
        childView.removeGestureRecognizer(self.tapGesture)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func didTap(gesture: UIGestureRecognizer){
        currentColorIdx = (currentColorIdx +  1 ) % colorPalette.count
    }

}