Как узнать, какой вид в stackview подвергся анимации

#swift

#swift

Вопрос:

У меня есть представление, содержащее StackView. Просмотр запускается при распознавании длинных жестов. Затем я использую hittest для анимации содержимого StackView.

Мой вид с помощью stackview определяется следующим образом:

     lazy var starContainer : UIView = {
        let view = UIView(frame: CGRect(x: 0, y: 0, width: 182, height: 36))
        view.layer.cornerRadius = 8
        view.backgroundColor = .white
        
        view.addSubview(starStack)
        starStack.translatesAutoresizingMaskIntoConstraints = false
        starStack.topAnchor.constraint(equalTo: view.topAnchor, constant: 1).isActive = true
        starStack.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 1).isActive = true
        starStack.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -1).isActive = true
        starStack.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -1).isActive = true
        view.layer.cornerRadius = view.frame.height / 2
        
        // Set padding
        let padding : CGFloat = 2
        starStack.spacing = padding
        starStack.layoutMargins = UIEdgeInsets(top: padding, left: padding, bottom: padding, right: padding)
        starStack.isLayoutMarginsRelativeArrangement = true
        
        // Generate shadow
        view.layer.shadowColor = UIColor(white: 0.4, alpha: 0.4).cgColor
        view.layer.shadowRadius = 8
        view.layer.shadowOpacity = 0.5
        view.layer.shadowOffset = CGSize(width: 0, height: 4)

        for index in 0...4 {
            let imageView = UIImageView()
            imageView.isUserInteractionEnabled = true
            if index == 0 {
                imageView.tag = 5009
            }
            imageView.tag = index
            imageView.image = UIImage(named: "icon_starred")
            imageView.tintColor = UIColor(hex: Constants.Colors.secondary)
            starStack.addArrangedSubview(imageView)
            arrayStar.append(imageView)
        }
        
        return view
    }()
  

Затем я добавил распознаватель длинных жестов, и всякий раз, когда он обнаруживает изменение, я перемещаю представления в stackview по отдельности:

 @objc func showStars(gesture : UILongPressGestureRecognizer) {
      if gesture.state == .changed {
            let pressedLocation = gesture.location(in: self.starContainer)
            let fixedYLocation = CGPoint(x: pressedLocation.x, y: starContainer.frame.height / 2)
            let hitTestView = starContainer.hitTest(fixedYLocation, with: nil)

            if hitTestView is UIImageView {
                UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
                    let stackView = self.starContainer.subviews.first
                    stackView?.subviews.forEach({ (imageView) in
                        imageView.transform = .identity
                    })
                    hitTestView?.transform = CGAffineTransform(translationX: 0, y: -50)
                })

            }
        }
  

Мой вопрос в том, как мне получить тег ImageView, который был заполнен в stackview?

Примечание: Эта анимация похожа на смайлики для сообщения Facebook.

Ответ №1:

Вы думаете об этом неправильно. Ваш метод showStars использует вызов starContainer.hitTest() , чтобы выяснить, какой вид пользователь долго нажимал. На этом этапе вы знаете, какой вид собираетесь анимировать. Просто запомните это представление.

Комментарии:

1. Это верно. Итак, что я пытался сделать, это пометить вид изображения, а затем попытаться получить тег через: print(stackView?.subviews.first?.tag) но он продолжает отображаться как 0, несмотря на установку тега для изображения при размещении его в stackview.

2. Ах, неважно. Я понял, что вы имели в виду. Я новичок в тестировании. Спасибо.