개발/Swift
[Swift] 애니메이션 동작시 터치 이벤트가 동작 안하는 이유
덤벨로퍼
2025. 2. 26. 15:19
ㅌㅓ치가 안먹음
1.
애니메이션 다 적용해 놓으니 갑자기 잘먹던 터치 이벤트가 안들어옴
ContainerView → StackView → Items
구조로 되어있으며
Items 를 세팅할떄 addView, contraints 를 잡아줬었음
optionContainerView.addSubview(verticalOptionStackView)
verticalOptionStackView.snp.makeConstraints { make in
make.top.bottom.equalToSuperview()
make.leading.trailing.equalToSuperview().inset(40)
}
private func setMultipleQuizUI(options: [QuizEntity.Option]) {
options.forEach { option in
let optionView = MultipleQuizOptionView(id: option.id, text: option.text)
optionView.layer.opacity = 0
verticalOptionStackView.addArrangedSubview(optionView)
addEventToOptionView(optionView: optionView, id: option.id)
}
}
이후 애니메이션을 돌리는데 애니메이션에서 올라온 만큼 터치 이벤트가 안먹음
UIView.animateKeyframes(withDuration: withDuration, delay: 0, options: keyframeAnimationOptions) {
UIView.addKeyframe(withRelativeStartTime: 0, relativeDuration: 0.5 / withDuration) {
self.labelContainer.transform = CGAffineTransform(translationX: 0, y: -40)
self.labelContainer.layer.opacity = 1
}
optionViews.enumerated().forEach { index, view in
let startTime = index == 0 ? optionStartTime : optionStartTime + eachOptionDelay * Double(index)
UIView.addKeyframe(withRelativeStartTime: startTime / withDuration, relativeDuration: optionDuration / withDuration) {
view.transform = CGAffineTransform(translationX: 0, y: -50)
view.layer.opacity = 1
}
}
let labelStartTime = withDuration - participantLabelDuration
UIView.addKeyframe(withRelativeStartTime: labelStartTime / withDuration, relativeDuration: participantLabelDuration) {
self.participantsLabel.layer.opacity = 1
}
}
- CGAffineTransform 대신 origin.y 바꿔도 동일함
애니메이션을 통해 Items 이 올라온 만큼 StackView영역을 벗어나게 되는데
그 부분이 이벤트를 먹지 않음
- 해결
private let verticalOptionStackView: UIStackView = .init().then {
$0.axis = .vertical
$0.spacing = 12
$0.isLayoutMarginsRelativeArrangement = true
$0.layoutMargins = .init(top: 50, left: 0, bottom: 0, right: 0)
}
layoutMargins 설정을 넣어줘서 50만큼 올라와도 StackView 내부에 위치하게끔 수정함
2.
애니메이션이 이 repeat하면서 계속 도는게 있는데
이게 계속 돌고있어서 터치 이벤트가 안먹음
private func startOXRepeatAnimation(optionViews: [UIView]) {
guard optionViews.count > 1 else { return }
UIView.animate(withDuration: 0.4) {
optionViews[0].transform = CGAffineTransform(translationX: 0, y: -54)
optionViews[1].transform = CGAffineTransform(translationX: 0, y: -46)
} completion: { _ in
UIView.animate(withDuration: 0.8,
delay: 0,
options: [.autoreverse, .repeat, .curveEaseInOut],
animations: {
optionViews[0].transform = CGAffineTransform(translationX: 0, y: -46)
optionViews[1].transform = CGAffineTransform(translationX: 0, y: -54)
})
}
}
해당 애니메이션 제외했을떄 정상동작
→ options 에 allowUserInteraction 추가
options: [.autoreverse, .repeat, .curveEaseInOut, .allowUserInteraction],