swift] scrollview안에서 uibutton - 액션이(touchupInside) 먹히지 않음
노란색 / 초록색이 UI button이고
scrollView - systemRed 이고 스크롤뷰안에 있는 뷰가 viewInScroll 이고 viewInScroll 안에 버튼과 달력 UI가 있다.
viewInScroll의 높이가 높아지면 스크롤이 작동을 하도록 구현을 했다.
이 달력 UI를 만들면서 해당 버튼을 테스트해봤지만 버튼의 액션이 작동하지 않았다. UI를 그릴 때가 문제인가? addTarget을 잘못 선언했나? UIbutton을 lazy var 형태로 바꿔보며... 고생을 많이 했다...
이런저런 시도를 다 해봤지만 작동하지 않아 scrollView를 의심을 해봤다. 결론은 scrollView안에 존재하는 UIView인 viewInScroll의 높이, bottom제약이 걸려있지 않아 해당 버튼이 작동하지 않는 것이었다.
scrollView.topAnchor.constraint(equalTo: naviTopView.bottomAnchor).isActive = true
if #available(iOS 11.0, *) {
scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor ).isActive = true
scrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor ).isActive = true
scrollView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
} else {
scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor ).isActive = true
scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor ).isActive = true
scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
}
scrollView.addSubview(viewInScroll)
viewInScroll.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
viewInScroll.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
viewInScroll.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
viewInScroll.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
viewInScroll.widthAnchor.constraint(equalTo: scrollView.widthAnchor, multiplier: 1.0).isActive = true
addChildVC(superVC: self, superView: viewInScroll, vc: calenderVC)
calenderVC.view.topAnchor.constraint(equalTo: viewInScroll.topAnchor, constant: 16).isActive = true
if #available(iOS 11.0, *) {
calenderVC.view.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 16).isActive = true
calenderVC.view.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -16).isActive = true
} else {
calenderVC.view.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16).isActive = true
calenderVC.view.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16).isActive = true
}
// viewInScroll.addSubview(test)
// test.topAnchor.constraint(equalTo: calenderVC.view.bottomAnchor).isActive = true
// test.heightAnchor.constraint(equalToConstant: 300).isActive = true
// test.widthAnchor.constraint(equalToConstant: 300).isActive = true
// test.bottomAnchor.constraint(equalTo: viewInScroll.bottomAnchor).isActive = true
해당 코드의 주석 처리(테스트)를 풀면 위 화면과 같은 결과가 나온다. - viewInScroll가 활성화되면서 배경 색상이 스크롤 뷰(레드)에서 viewInScroll(시스템 블루)로 변경되었다.
test뷰를 viewInScroll안에 넣어주고 (viewInScroll안에는 달력과 testView가 존재)
test.bottomAnchor.constraint(equalTo: viewInScroll.bottomAnchor).isActive = true
test View의 bottomAnchor 제약을 viewInScroll.bottomAnchor와 같게 하여 활성화하게 만들었다. - 이 동작을 통해 viewInScroll의 heightAnchor가 정해지면서 레이아웃이 정상적으로 자리 잡고 해당 버튼도 눌리게 되었다.