-
[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],
'개발 > Swift' 카테고리의 다른 글
[Swift] 페이지처럼 넘어가는 스크롤 레이아웃 (Carousel Effect) (0) 2025.02.26 SwiftUI + TCA 활용 액션 시트 구현 confirmationDialog (0) 2025.02.07 [SwiftUI + TCA] 에러 Perceptible state was accessed but is not being tracked (0) 2025.02.07 TCA에서 AsyncStream 사용해서 타이머 구현하기 (0) 2025.01.15 [Tuist] 모듈 생성 과 모듈 내 테스트 타겟 생성 (0) 2025.01.14