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 多个选项的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个 UIPopover 控制器打开 UIPopover 控制器?

UIPopover 问题

键盘显示时 uipopover 隐藏

在 uipopover 中加载 uiwebview

UIPopover 防止摇晃撤消

UIPopOver 和方向改变