Project/ReceiptMind
✅ UIButton의 .menu를 이용해서 띄우는 UIMenu는 시스템이 자동으로 표시하고, 그동안 버튼의 백그라운드 UI (예: arrow 바꾸기)는 우리가 직접 제어할 수 없어!
밤새는 탐험가89
2025. 7. 11. 03:17
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