ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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],
                              
    

     

    댓글

Designed by Tistory.