UISplitViewController 中的 ActionSheet 在纵向模式与横向模式下的行为不同
Posted
技术标签:
【中文标题】UISplitViewController 中的 ActionSheet 在纵向模式与横向模式下的行为不同【英文标题】:ActionSheet within UISplitViewController acts different in Portrait Mode than Landscape Mode 【发布时间】:2011-10-01 14:55:45 【问题描述】:我使用基于拆分视图的应用程序模板创建了一个新应用程序。
然后我向 rootViewController 导航控制器添加了一个名为 actionButton 的操作按钮。
按下按钮时,我会显示如下所示的 ActionSheet:
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil
delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil
otherButtonTitles:@"Admin Functions", @"Refresh Data", nil];
[actionSheet showFromBarButtonItem:actionButton animated:YES];
[actionSheet release];
在横向模式下按下按钮后,它会在指向按钮的弹出窗口中显示操作表(正如我所期望的那样):
但是,在纵向模式下,它看起来完全不同,菜单从 rootViewController 弹出框的底部出现,就像在 iPhone 上一样:
我的问题是,如何让 ActionSheet 在纵向模式下显示在顶部,就像在横向模式下一样?
由于这是一个“实用菜单”,它并没有真正直接与正在显示的数据相关联,因此它不应该是弹出框的一部分。
【问题讨论】:
【参考方案1】:此行为是设计使然,如果它是纵向模式下的弹出框,则您将有 2 级弹出框。
这在技术上可以通过实现您自己的 UIPopover 版本或使用某人已经编写的版本 (WEPopover) 来实现。
但是,这是一个糟糕的设计选择。您说这些功能与数据无关,但是一个是“刷新数据”。我会用刷新图标替换操作按钮,例如 Apple 在“查找我的朋友”中使用的图标:
另一个,“管理功能”,如果与列表中的数据没有直接关系,也许需要一个新家,也许与您的应用程序的主视图有关?如果不了解更多结构,很难说最好把它放在哪里。
【讨论】:
感谢您的回复!不幸的是,我展示的图片只是模型,只是为了简单地展示它在做什么,具体的动作是不同的。实际应用程序与邮件应用程序非常相似,左视图显示列表,右视图显示详细信息。由于菜单项指的是整个应用程序(而不是详细项),我觉得它属于左视图。这个页面是我的应用程序的主视图,所以我需要找到一个放置菜单项的地方。菜单上有5-6个项目,由于空间有限,确实需要一个下拉菜单。 问题仍然存在,您有两个级别的 UIPopover(列表和菜单)。如果您愿意避免列表处于纵向模式的弹出窗口中并且仅存在于左侧,我建议使用MSSplitViewController 而不是使用 UISplitViewController。然而,如果不了解更多应用细节,就很难设计出更好的行动方案。【参考方案2】:另一种可能性是您可以将操作按钮从根视图控制器栏的右边缘移动到详细视图控制器栏的左边缘。
例如,如果操作按钮在您的第一个屏幕截图中位于垂直条的右侧(意味着它位于详细视图控制器栏的左边缘),那么当您旋转到纵向模式时,它会出现就在第二个屏幕截图中“事件”按钮的右侧。您仍然可以调用 UIActionSheet 的 showFromBarButtonItem:animated
方法,它会以弹出模式显示您的操作表。
还有一个问题是您是否真的希望同时在屏幕上显示两个弹出框。但如果你这样做了,这就是如何做到的。
【讨论】:
来自 ios 的视图控制器编程指南:“注意:在模态显示另一个视图控制器之前,您应该始终关闭可见的弹出框。有关何时以及如何在应用程序中使用弹出框的具体指南,请参阅“ iOS 人机界面指南中的 Popover(仅限 iPad)”。”以上是关于UISplitViewController 中的 ActionSheet 在纵向模式与横向模式下的行为不同的主要内容,如果未能解决你的问题,请参考以下文章
UISplitViewController 可以成为 UITabViewController 中的选项卡吗?
UIScrollView 作为 UISplitViewController 中的根视图
关闭uisplitviewcontroller中的NavigationController后如何重新加载tableView?
presentViewController 正在禁用 UISplitViewController 中的所有 removeFromSuperview 消息