개발/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],