iOS EKCalendarChooser移除Add Calendar按钮及修改相关按钮颜色问题
问题1:是否可以移除Add Calendar按钮?
- 苹果官方未提供公开API支持直接移除EKCalendarChooser自带的Add Calendar按钮,该按钮的显隐由系统组件内部控制。你尝试修改
hidesBottomBarWhenPushed、tabBarItem的方案不生效,是因为这个按钮不属于标签栏组件,是EKCalendarChooser自带的底部工具栏按钮。 - 若一定要强制移除,只能通过遍历视图层级查找对应按钮并隐藏的非公开方案实现,该方案存在系统版本适配风险,且可能导致App Store审核被拒,不推荐使用。
- 更稳妥的替代方案是自定义日历选择页面,自行读取
eventStore中的日历列表进行展示,可100%控制页面元素。
问题2:如何修改Add Calendar控制器上显示的Cancel按钮的颜色?
你可以通过临时修改UINavigationBar的全局外观实现该需求:在present日历选择器前设置全局导航栏tintColor为橙色,在日历选择器关闭后恢复原有的全局配置即可,代码示例如下:
- 首先在当前控制器声明属性保存原有全局色调:
var originalNavTintColor: UIColor?
- 弹出日历选择器前修改全局配置:
// 保存原有全局导航栏tintColor originalNavTintColor = UINavigationBar.appearance().tintColor // 临时设置全局导航栏tint为橙色 UINavigationBar.appearance().tintColor = .orange // 原有创建CalendarChooser逻辑 let calendarChooser = EKCalendarChooser(selectionStyle: .single, displayStyle: .writableCalendarsOnly, entityType: .event, eventStore: eventStore) calendarChooser.showsDoneButton = true calendarChooser.showsCancelButton = true calendarChooser.delegate = self // 绑定代理处理关闭事件 let navigationController = UINavigationController(rootViewController: calendarChooser) navigationController.view.tintColor = .orange self.present(navigationController, animated: true, completion: nil)
- 在EKCalendarChooserDelegate回调中恢复原有全局配置:
func calendarChooserDidFinish(_ calendarChooser: EKCalendarChooser) { // 恢复原有全局导航栏色调 UINavigationBar.appearance().tintColor = originalNavTintColor dismiss(animated: true) } func calendarChooserDidCancel(_ calendarChooser: EKCalendarChooser) { // 恢复原有全局导航栏色调 UINavigationBar.appearance().tintColor = originalNavTintColor dismiss(animated: true) }
该方案会作用于所有当前弹出的系统导航栏组件,包括Add Calendar弹窗的导航按钮,可将其Cancel按钮统一修改为橙色。
内容的提问来源于stack exchange,提问作者geohei
相关产品推荐
相关产品推荐

