У меня есть жест панорамирования на кнопке, который перемещает кнопку в направлении панорамирования. Когда перевод «достаточно далеко», кнопка поворачивается. При этом повороте видимая кнопка возвращается в исходное положение или закрывается, а затем возвращается туда, где она должна быть. Не могу понять, что происходит. Это мой код:

    @IBAction func didPanButton(_ sender: UIPanGestureRecognizer) {

    print("Did pan button", sender.translation(in: sender.view).x)

    answerButton.center.x = view.center.x + sender.translation(in: sender.view).x

    switch buttonPosition {
    case .left:
        print("Rotate button left")
        UIView.animate(withDuration: 0.5, animations: {
            self.rotateButtonLeft()
        })
    case .right:
        print("Rotate button right")
        UIView.animate(withDuration: 0.5, animations: {
            self.rotateButtonRight()
        })
    case .middle:
        print("Remove button rotation")
        UIView.animate(withDuration: 0.5, animations: {
            self.removeButtonRotation()
        })
    }

} 

var buttonPosition : ButtonPosition {
    let leftWidth = (view.frame.size.width - answerButton.frame.size.width) / 2

    if answerButton.frame.origin.x < leftWidth / 2 {
        return .left
    }

    if answerButton.frame.origin.x > leftWidth * 3 / 2 {
        return .right
    }

    return .middle
}

func rotateButtonLeft() {
    let degrees : CGFloat = -10; //the value in degrees
    answerButton.transform = CGAffineTransform(rotationAngle: degrees * CGFloat.pi/180);
    let image = UIImage(named: "item_no")
    answerButton.setImage(image, for: UIControlState.normal)
}

func rotateButtonRight() {
    let degrees : CGFloat = 10; //the value in degrees
    answerButton.transform = CGAffineTransform(rotationAngle: degrees * CGFloat.pi/180);
    let image = UIImage(named: "item_yes")
    answerButton.setImage(image, for: UIControlState.normal)
}

func removeButtonRotation() {
    let degrees : CGFloat = 0; //the value in degrees
    answerButton.transform = CGAffineTransform(rotationAngle: degrees * CGFloat.pi/180);
    let image = UIImage(named: "item_neutral")
    answerButton.setImage(image, for: UIControlState.normal)
}
1
surToTheW 14 Мар 2018 в 17:18

1 ответ

Лучший ответ

У вашей кнопки есть ограничения для установки ее положения. Когда запускается автоматический макет, он сбрасывает center кнопки в соответствии с этими ограничениями. Установка изображения кнопки запускает автоматический макет.

У вас есть три варианта исправить это:

  1. Измените положение кнопки, обновив ограничения, ИЛИ
  2. Измените положение кнопки, установив ее transform вместо изменения ее center, ИЛИ
  3. Не используйте ограничения для размещения кнопки.
2
rob mayoff 14 Мар 2018 в 17:24