Swift 3 - CGAffineTransform не работает

Я создаю кнопку программно, и CGAffineTransform не работает в моем проекте при добавлении addTarget, почему?

ИЗМЕНИТЬ:

func createButtonPuzzle(id: Int) {

     for i in 1...14 {

            let btnButton = UIButton(type: .roundedRect)
            btnButton.frame = CGRect(x: self.view.frame.size.width / 2, y: self.view.frame.size.height / 2, width: 100, height: 100)
            btnButton.backgroundColor = .blue
            btnButton.setTitle("iButton", for: .normal)
            btnButton.addTarget(self, action: #selector(moveButton(sender:)), for: .touchUpInside)

            view.addSubview(btnButton)   
     }
}


func moveButton(sender: UIButton) {

    if sender.tag == 1 {

        if sender.transform == CGAffineTransform.identity {

            UIView.animate(withDuration: 0.5, animations: 
            sender.transform = CGAffineTransform(translationX: 50, y: 100)

            })
        }                
    }
}

person Ameen MK    schedule 31.07.2017    source источник
comment
Позиционируется ли вид с помощью автомакета или автоматического изменения размера? Это, вероятно, не будет работать с autolayout.   -  person Sulthan    schedule 31.07.2017
comment
Без использования автоматического макета или автоматического изменения размера, это уже работало, но теперь это не работает! @Султан   -  person Ameen MK    schedule 31.07.2017
comment
Вы установили точку останова? Вы знаете, действительно ли он достигает трансформации? Почему вам требуется имя параметра для moveButton?   -  person dfd    schedule 31.07.2017
comment
Я не устанавливаю точку останова и создаю функцию moveButton, потому что btnButton создан в другой функции @dfd   -  person Ameen MK    schedule 31.07.2017
comment
Ни одна из созданных вами кнопок не имеет .tag = 1, поэтому вы никогда не будете выполнять код внутри оператора if sender.tag == 1.   -  person Alexey Tyurnin    schedule 01.08.2017
comment
Извините, не могли бы вы помочь мне в этом вопросе ?? @Султан   -  person Ameen MK    schedule 06.08.2017
comment
Извините, не могли бы вы помочь мне в этом вопросе ?? @dfd   -  person Ameen MK    schedule 06.08.2017


Ответы (1)


В функции вместо использования sender.transform используйте btnButton.transform, это вызвано тем, что вы находитесь вне области действия, и отправитель может быть отклонен, что приводит к отклонению анимации.

Другой вариант — сильно удерживать объект:

let tappedButton : UIButton = sender

а затем используйте tappedButton

ИЗМЕНИТЬ

Я имею в виду что-то вроде этого:

func moveButton(sender: UIButton) {

    if ((sender.tag == 1) && (sender == self.btnButton)) {

        if self.btnButton.transform == CGAffineTransform.identity {

            UIView.animate(withDuration: 0.5, animations: 
                self.btnButton.transform = CGAffineTransform(translationX: 50, y: 100)

            })
        }                
    }
}

ИЗМЕНИТЬ – 2

Согласно вашему коду есть 2 проблемы:

  1. Все 14 кнопок расположены по 1 над другой, то есть кнопка 14 будет самой верхней кнопкой, а не кнопкой 1.
  2. Вы не устанавливаете тег, и тогда он не проходит проверку в moveButton:

    func createButtonPuzzle (id: Int) {

     for i in 1...14 {
    
            let btnButton = UIButton(type: .roundedRect)
            btnButton.frame = CGRect(x: self.view.frame.size.width / 2, y: self.view.frame.size.height / 2, width: 100, height: 100)
            btnButton.backgroundColor = .blue
            btnButton.setTitle("iButton", for: .normal)
            btnButton.addTarget(self, action: #selector(moveButton(sender:)), for: .touchUpInside)
    
            **btnButton.tag = i // This is missing **
    
            view.addSubview(btnButton)   
     }
    

    }

И тогда это терпит неудачу: if sender.tag == 1 {

Итак, чтобы протестировать его и увидеть, как он работает, сначала вам нужно либо перейти с 14 на 1 и только с 1..‹2, либо переставить кнопки в разные положения, чтобы он действительно работал.

Затем теги будут установлены, и при нажатии кнопки с тегом 1 она будет работать.

person unkgd    schedule 31.07.2017
comment
Я создаю btnButton в другой функции и добавляю эту функцию в btnButton @unkgd - person Ameen MK; 31.07.2017
comment
Вы проверили, что вы действительно попали в анимацию? как предложил @dfd? Если вы туда доберетесь, и все кажется в порядке, добавьте свою кнопку в качестве члена данных в контроллер и используйте эту ссылку, потому что это означает, что она игнорируется из-за слабой ссылки. - person unkgd; 31.07.2017
comment
Да, я проверил это и добавил данные в контроллер, вроде все в порядке @unkgd - person Ameen MK; 31.07.2017
comment
Я имею в виду, создайте кнопку как член данных: fileprivate var btnButton : UIButton, и в самом методе вместо использования sender просто проверьте, если (self.btnButton == sender), и с этого момента вместо этого используйте self.btnButton отправителя - отредактировал мой ответ с тем, что я имел в виду - person unkgd; 31.07.2017
comment
btnButton, созданный в функции, а не в классе, просто подождите, редактируя мой код и добавляя весь код @unkgd - person Ameen MK; 31.07.2017
comment
Давайте продолжим обсуждение в чате. - person Ameen MK; 31.07.2017
comment
Извините, не могли бы вы помочь мне в этом вопросе ?? @unkgd - person Ameen MK; 06.08.2017