1

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

如果用户点击特定按钮,该 UIView 会显示一个包含 20 多个条目的 UIActionSheet。在 iPhone 上,操作表充满了屏幕,带有一个可滚动的“滚轮”式选项列表。然而,在 iPad 上,行为不正常:操作表再次呈现为轮式列表,但非常高;它将弹出框扩展到最大可能的高度,但操作表仍然高于弹出框。所以你最终得到的是一个高得离谱的弹出框,带有一个在顶部被部分切断的轮式列表,无法到达列表顶部的项目。请参阅下面的图片。

无论如何:理想情况下,我希望与您在 iPhone 中看到的完全相同的内容显示在该弹出框内,而无需更改弹出框的大小。那可行吗?

图片:展示操作表后的 iPhone 版本:

提交操作表后的 iPhone 版本

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

iPad 版本显示原始 UIview 与按钮按下

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

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

4

1 回答 1

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;
    }
于 2012-05-17T21:24:06.417 回答