#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. Ах, неважно. Я понял, что вы имели в виду. Я новичок в тестировании. Спасибо.