UIActionSheet 在 UIPopoverController 中有 20 多个选项
Posted
技术标签:
【中文标题】UIActionSheet 在 UIPopoverController 中有 20 多个选项【英文标题】:UIActionSheet with 20+ options inside UIPopoverController 【发布时间】:2012-05-17 19:39:19 【问题描述】:在一个通用应用程序中,我有一个 UIView,它显示在 iPad 上的 iPhone 屏幕大小的弹出框控制器中,以及 iPhone/Touch 上的模态视图控制器中。
如果用户点击特定按钮,该 UIView 会显示一个包含 20 多个条目的 UIActionSheet。在 iPhone 上,操作表充满了屏幕,带有一个可滚动的“滚轮”式选项列表。然而,在 iPad 上,行为不正常:操作表再次呈现为轮式列表,但非常高;它将弹出框扩展到最大可能的高度,但操作表仍然高于弹出框。所以你最终得到的是一个高得离谱的弹出框,带有一个在顶部被部分切断的轮式列表,无法到达列表顶部的项目。请参阅下面的图片。
无论如何:理想情况下,我希望与您在 iPhone 中看到的完全一样的内容显示在弹出框内,而无需更改弹出框的大小。这可行吗?
图片: 提交操作表后的 iPhone 版本:
iPad 版本显示原始 UIview 和按钮:
iPad版本按下按钮后,显示actionsheet:
【问题讨论】:
套用一下,“如果你的 UIActionSheet 有 20 个选项,你可能错过了一些” 哈!它基本上只是一个视觉主题列表;这是一个静态列表,因此使用表格视图似乎很愚蠢。 【参考方案1】:编辑:我在这里整理了一个更完整的解决方案https://github.com/brandonschlenker/BSActionSheet
这有点痛苦,老实说,我不确定这是否值得。如果 Apple 更改 UIActionSheet,所有这些都可能会中断。无论如何,这可能是一个解决方案......
您将需要继承 UIActionSheet 并根据其调整所有子视图和父视图的大小。
在布局子视图中,我们将遍历视图并开始调整元素的大小以满足我们的需求。我首先注销了子视图列表以查找哪个元素是哪个元素。到目前为止,我已经找到了表格视图、圆角的表格视图框架、弹出框等。您仍然需要找到取消按钮并移动它。
- (void)layoutSubviews
CGRect tableViewFrame = CGRectZero;
for (id item in [self subviews])
if ([item isKindOfClass:[UIView class]])
UIView *v = (UIView *)item;
v.frame = CGRectMake(v.frame.origin.x, v.frame.origin.y, self.frame.size.width, 320);
for (UIView *subItem in [v subviews])
//table view of options
if ([subItem isKindOfClass:[UITableView class]])
subItem.frame = CGRectMake(subItem.frame.origin.x, subItem.frame.origin.y, subItem.frame.size.width, someNewHeightHere);
tableViewFrame = subItem.frame;
//table view image frame. this rounds the bottom corners
if ([subItem isKindOfClass:[UIView class]] && subItem.tag == 3334)
subItem.frame = CGRectMake(subItem.frame.origin.x, tableViewFrame.origin.y, subItem.frame.size.width, someNewHeightHere);
//this is the cancel buttons label. never could get this to do anything
if ([subItem isKindOfClass:NSClassFromString(@"UIButtonLabel")])
if (subItem.frame.size.width == 66)
UIViewController *v = [self viewController];
v.contentSizeForViewInPopover = CGSizeMake(self.frame.size.width, someNewHeightHere);
我还有一个方便的方法来获取视图父视图控制器。
- (UIViewController *)viewController
UIResponder *responder = self;
while (![responder isKindOfClass:[UIViewController class]])
responder = [responder nextResponder];
if (nil == responder)
break;
return (UIViewController *)responder;
【讨论】:
感谢您的链接。我最终可能只是创建了一个自定义视图,因为 Apple 可能会更改 UIActionSheet 并破坏它的问题......不太吸引人。然而,这绝对是坚持使用操作表的最佳方式。以上是关于UIActionSheet 在 UIPopoverController 中有 20 多个选项的主要内容,如果未能解决你的问题,请参考以下文章