編集:ここでより完全なソリューションをまとめました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;
}