본문 바로가기
Project/ReceiptMind

✅ UIButton의 .menu를 이용해서 띄우는 UIMenu는 시스템이 자동으로 표시하고, 그동안 버튼의 백그라운드 UI (예: arrow 바꾸기)는 우리가 직접 제어할 수 없어!

by 밤새는 탐험가89 2025. 7. 11.
728x90
SMALL

🎯 핵심 문제

button.showsMenuAsPrimaryAction = true로 설정하면,

  • 버튼을 탭 → 시스템이 자동으로 메뉴를 띄움
  • 우리가 직접 화살표를 "열림 🔽"으로 바꾸는 타이밍을 잡기 어려움
  • 즉, menu가 뜨는 순간은 감지할 수 없고, 메뉴가 선택되고 나서만 동작할 수 있음

✅ 해결 방법: UIButton + 커스텀 메뉴 표시 방식으로 변경

👉 UIMenu를 직접 띄우지 않고, 우리가 버튼을 탭했을 때 UIAlertController나 UIPopoverPresentationController를 사용해서 직접 메뉴 UI를 만들어서 보여주는 방식으로 가면, 화살표를 자유롭게 조절할 수 있어.

@objc func showMonthMenu() {
    isMenuOpen = true
    updateMonthButtonTitle()
    
    let alert = UIAlertController(title: "월 선택", message: nil, preferredStyle: .actionSheet)
    
    for month in 1...12 {
        let action = UIAlertAction(title: "\(month)월", style: .default) { [weak self] _ in
            self?.selectedMonth = month
            self?.isMenuOpen = false
        }
        alert.addAction(action)
    }
    
    let cancel = UIAlertAction(title: "취소", style: .cancel) { [weak self] _ in
        self?.isMenuOpen = false
    }
    alert.addAction(cancel)
    
    present(alert, animated: true)
}

 

 

 

❌ 이전 방법 UIMenu 사용

@objc private func showMonthMenu() {
    isMenuOpen = true

    // 1월 ~ 12월 항목 만들기
    let actions = (1...12).map { month in
        UIAction(title: "\(month)월", state: month == selectedMonth ? .on : .off) { [weak self] _ in
            self?.selectedMonth = month
            self?.isMenuOpen = false
            // TODO: 여기서 선택된 월에 맞는 데이터 필터링 실행
        }
    }

    let menu = UIMenu(title: "월 선택", options: .displayInline, children: actions)
    monthButton.menu = menu
    monthButton.showsMenuAsPrimaryAction = true // 버튼 누르면 메뉴 바로 뜨게 함
}

 

 

728x90
LIST