1

ユニバーサル アプリでは、iPad の iPhone-Screen-Sized ポップオーバー コントローラー内に表示される UIView と、iPhone/Touch のモーダル ビュー コントローラーがあります。

その UIView は、ユーザーが特定のボタンをタップすると、20 以上のエントリを持つ UIActionSheet を提示します。iPhone では、アクション シートが画面いっぱいに表示され、スクロール可能な「ホイール」スタイルのオプション リストが表示されます。しかし、iPad での動作はおかしなものです。アクション シートは再びホイール スタイルのリストとして表示されますが、非常に背が高くなります。ポップオーバーを可能な限り最大の高さに拡張しますが、アクション シートは依然としてポップオーバーよりも高くなっています。そのため、上部が部分的に切り取られたホイール スタイルのリストを備えた途方もなく背の高いポップオーバーが表示され、リストの上部にあるアイテムに到達する方法はありません。以下の画像を参照してください。

とにかく、理想的には、ポップオーバーのサイズを変更せずに、iPhone で表示されるものとまったく同じものがそのポップオーバー内に表示されるようにしたいと考えています。それは可能ですか?

画像:アクションシート提示後のiPhone版:

アクションシート提示後のiPhone版

押すボタンがある元の UIview を表示する iPad バージョン:

押すボタンがある元の UIview を表示する iPad バージョン

ボタンを押した後の 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 に答える