개발/아이오에스

swift] scrollview안에서 uibutton - 액션이(touchupInside) 먹히지 않음

dev.jake 2021. 7. 29. 11:04

노란색 / 초록색이 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가 정해지면서 레이아웃이 정상적으로 자리 잡고 해당 버튼도 눌리게 되었다.