在通用应用程序中,我有一个UIView,它出现在iPad上的iPhone屏幕大小的弹出控制器中,以及iPhone / Touch上的模态视图控制器。
如果用户点击特定按钮,UIView会显示一个包含20多个条目的UIActionSheet。在iPhone上,操作表填充了屏幕,带有可滚动的“滚轮”式选项列表。但是,在iPad上,这种行为并不严重:动作表再次呈现轮式列表,但非常高;它将弹窗扩展到最大可能高度,但操作表仍然比弹出窗口更高。所以你最后得到的是一个可笑的高大的popover,有一个轮式列表,在顶部被部分切断,无法到达列表顶部的项目。见下图。
无论如何:我理想地喜欢你在iPhone中看到的同样的东西,以显示在popover中,而不改变popover的大小。那是可行的吗?
图片: 提交行动表后的iPhone版本:
iPad版本显示原始UIview,按下按钮:
按下按钮后的iPad版本,显示动作表:
答案 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;
}