Касание Жест не работает, когда кнопка имеет анимацию и градиентную маскировку - PullRequest
0 голосов
/ 20 января 2020

Я хочу добавить градиент к заголовку кнопки, а также кнопка должна иметь анимацию, такую ​​как мигание / мигание. Добавив это, жест касания не работает

Я создал представление с именем 'maskingView', а кнопка находится внутри этого представления с именем 'btnGradient' с использованием раскадровки

    let gradient = CAGradientLayer()
    gradient.colors = [UIColor.red.cgColor, UIColor.blue.cgColor]
    gradient.startPoint = CGPoint(x: 0.0, y: 0.5)
    gradient.endPoint = CGPoint(x: 1.0, y: 0.5)
    gradient.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 30)
    maskingView = btnGradient

    // function for animation
    blinkAnimation()

    let tap = UITapGestureRecognizer(target: self, action: #selector(self.goToOtherView(gesture:)))
    tap.delegate = self
    tap.numberOfTapsRequired = 1
    self. maskingView.isUserInteractionEnabled = true
    self. maskingView.addGestureRecognizer(tap)
    maskingView.layer.insertSublayer(gradient, at: 0)


    func blinkAnimation(){
    maskingView.alpha = 1.0
    UIView.animate(withDuration: 0.5, delay: 0.0, options: [.repeat, .autoreverse, .allowUserInteraction], animations: {
        self.maskingView.alpha = 0.0
    }, completion: nil)
    }

Ответы [ 3 ]

0 голосов
/ 20 января 2020

Apple описывает в своих документах по анимации:

"В iOS анимации широко используются для изменения положения видов, изменения их размера, удаления их из иерархий представлений и их скрытия."

Просмотр руководства по программированию - Apple

В статье продолжается довольно сильный акцент на использовании Core Animations, а не UIView Animations для более детальной анимации.

"В местах, где вы хотите выполнять более сложные анимации или анимации, не поддерживаемые классом UIView, вы можете использовать Core Animation и базовый слой представления для создания анимации. Поскольку объекты представления и слоя тесно связаны друг с другом, изменения в слое вида влияют на сам вид. "

Таким образом, по сути, вы манипулируете слоем вида, чтобы изменить вид. Я не думаю, что разумно манипулировать видом напрямую, когда для этой цели существуют основные анимации. Таким образом, вы не можете (и, вероятно, не должны) делать с UIView с UIAnimations то, что вы можете делать со слоем с Core Animations.

Вы должны сделать анимацию с CoreAnimation. Следовательно, ваш blinkAnimation() метод будет,

func blinkAnimation(){
    let fadein = CABasicAnimation(keyPath: "opacity")
    fadein.fromValue = 1.0
    fadein.toValue = 0.0
    fadein.duration = 0.5
    fadein.autoreverses = true
    fadein.repeatCount = HUGE
    maskingView.layer.add(fadein, forKey: "opacity")
}

Вот полный код,

    let gradient = CAGradientLayer()
    gradient.colors = [UIColor.red.cgColor, UIColor.blue.cgColor]
    gradient.startPoint = CGPoint(x: 0.0, y: 0.5)
    gradient.endPoint = CGPoint(x: 1.0, y: 0.5)
    gradient.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 30)
    maskingView = btnGradient

    // function for animation
    blinkAnimation()

    let tap = UITapGestureRecognizer(target: self, action: #selector(self.goToOtherView(gesture:)))
    tap.delegate = self as! UIGestureRecognizerDelegate
    tap.numberOfTapsRequired = 1
    self.maskingView.isUserInteractionEnabled = true
    self.maskingView.addGestureRecognizer(tap)
    maskingView.layer.insertSublayer(gradient, at: 0)

Метод выбора жестов касания:

@objc func goToOtherView(gesture: UITapGestureRecognizer) {
        print("tap gesture selector called")
    }
0 голосов
/ 20 января 2020

маскирование, анимация и нажатие кнопки Жест / нажатие кнопки (touchUpInside) не работают одновременно

, поэтому для добавления градиента используйте

btnGradient.setTitleColor(UIColor(patternImage: UIImage(named: "gradientImage")!), for: .normal)

сейчас добавить анимацию и использовать событие touchUpInside для кнопки

0 голосов
/ 20 января 2020

Это не работает, потому что вы устанавливаете self.maskingView.alpha = 0.0. Если вы установили альфа на 0, то система считает это скрытым представлением! Один раз попробуйте установить альфа-как,

self.maskingView.alpha = 0.1

Пример кода:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var maskingView: UIView!
    override func viewDidLoad() {
        super.viewDidLoad()

        let gradient = CAGradientLayer()
        gradient.colors = [UIColor.red.cgColor, UIColor.blue.cgColor]
        gradient.startPoint = CGPoint(x: 0.0, y: 0.5)
        gradient.endPoint = CGPoint(x: 1.0, y: 0.5)
        gradient.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 30)

        // function for animation
        blinkAnimation()

        let tap = UITapGestureRecognizer(target: self, action: #selector(self.goToOtherView(gesture:)))
        tap.numberOfTapsRequired = 1
        self.maskingView.isUserInteractionEnabled = true
        self.maskingView.addGestureRecognizer(tap)
        maskingView.layer.insertSublayer(gradient, at: 0)

        // Do any additional setup after loading the view.
    }

    func blinkAnimation(){
        maskingView.alpha = 1.0
        UIView.animate(withDuration: 0.5, delay: 0.0, options: [.repeat, .autoreverse, .allowUserInteraction], animations: {
            self.maskingView.alpha = 0.1
        }, completion: nil)
    }

    @objc func goToOtherView(gesture:Any) {
        print("tap")
    }
}
...