在UIPopoverController中有20多个选项的UIActionSheet

时间:2012-05-17 19:39:20

标签: iphone ios ipad uipopovercontroller uiactionsheet

在通用应用程序中,我有一个UIView,它出现在iPad上的iPhone屏幕大小的弹出控制器中,以及iPhone / Touch上的模态视图控制器。

如果用户点击特定按钮,UIView会显示一个包含20多个条目的UIActionSheet。在iPhone上,操作表填充了屏幕,带有可滚动的“滚轮”式选项列表。但是,在iPad上,这种行为并不严重:动作表再次呈现轮式列表,但非常高;它将弹窗扩展到最大可能高度,但操作表仍然比弹出窗口更高。所以你最后得到的是一个可笑的高大的popover,有一个轮式列表,在顶部被部分切断,无法到达列表顶部的项目。见下图。

无论如何:我理想地喜欢你在iPhone中看到的同样的东西,以显示在popover中,而不改变popover的大小。那是可行的吗?

图片: 提交行动表后的iPhone版本:

iPhone version after presenting action sheet

iPad版本显示原始UIview,按下按钮:

iPad version showing original UIview with button to press

按下按钮后的iPad版本,显示动作表:

iPad version after pressing button, showing actionsheet

1 个答案:

答案 0 :(得分:0)

编辑:我在这里整理了一个更完整的解决方案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;
    }