6

これは一見バグのようですが、誰かが回避策を考えられるかどうか疑問に思っています。

iPad では、View Controller を UIModalPresentationFormSheet として提示します。このビュー コントローラーは UITabBarController を拡張しており、「詳細」タブ バー ボタンを自動的に表示するのに十分なコントローラーを備えています。[詳細] ボタンをタップするとリストが正しく表示されますが、[編集] をタップするとすぐに編集ビューが実際のフォーム シート (フォーム シート内で切り取られたもの) よりも大きく表示され、コンテンツが表示されなくなります。 「完了」ボタンのあるツールバーを含むビュー。閉じる唯一の方法は、アプリを強制終了することです。

それが私のアプリに固有のものではないことを確認するために、単一のビュー プロジェクトを開始し、単純なモーダル ビューを提示しました。このモーダル ビュー コントローラーは UITabBarController を拡張し、次の init メソッドを持ちます。

- (id)init {
    self = [super init];
    if (self) {
        self.modalPresentationStyle = UIModalPresentationFormSheet;
        NSMutableArray *controllers = [NSMutableArray array];
        for (int i = 0; i< 15; i++) {
            UIViewController *vc = [[UIViewController alloc] init];
            UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
            vc.title = [NSString stringWithFormat:@"view %i", i];
            [controllers addObject:nav];
        }
        self.viewControllers = controllers;
    }
    return self;
}

また、 modalPresentationStyle を moreNavigationController に変更なしで追加してみました。

4

2 に答える 2

3

こんばんは、めまい。

あなたがした素晴らしい挑戦。ここに解決策があります。少しハードコアかもしれませんが、うまくいきます。

私はあなたが書いたようにしました - UITabBarController をサブクラス化し、それをモーダル ビュー コントローラーとして提示しました。そして、同じ問題に遭遇します。「詳細」画面で「編集」ボタンをタップすると UITabBarCustomizeView が表示され、フレームが不適切です。

だから私は次のことをしました。MyModalTabBarVC をそれ自体のデリゲートにして、tabBarController:willBeginCustomizingViewControllers:メソッドを実装しました。

- (void)tabBarController:(UITabBarController *)tabBarController     
willBeginCustomizingViewControllers:(NSArray *)viewControllers
{
    UIView *modalView = self.view;
    CGRect bounds = modalView.bounds;

    UIView *customizationView   = [[modalView subviews] objectAtIndex:1];
    UIView *customizationNavBar = [[customizationView subviews] objectAtIndex:0];

    CGRect navBarFrame = [customizationNavBar frame];
    navBarFrame.size.width = bounds.size.width;
    customizationNavBar.frame = navBarFrame;
    customizationView.frame   = bounds;
}

したがって、このメソッドが呼び出されるUITabBarCustomizeViewと、すでに作成されています。また、間違ったフレームは手動で変更できます。最初にログインpo [self.view subviews]すると、次のようになります。

(id) $1 = 0x06c6a940 <__NSArrayM 0x6c6a940>(
<UITransitionView: 0xd744ab0; frame = (0 0; 540 571); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0xd744b50>>,
<UITabBarCustomizeView: 0x6c5e570; frame = (0 -384; 768 1004); animations = { position=<CABasicAnimation: 0x6c569a0>; }; layer = <CALayer: 0x6c618d0>>,
<UITabBar: 0xd744110; frame = (0 571; 540 49); autoresize = W+TM; layer = <CALayer: 0xd742b80>>,
)

PS。この解決策では、アニメーションは修正されません。ログからわかるように、破損したアニメーションは既に作成され、課金されています。キャンセルして新しいものを適切に追加しても問題ないことを願っています。

于 2012-09-17T01:07:16.687 に答える
0

モーダル ビューの viewController が不具合の原因である必要があります。

次のことを試みることができます。

  1. 編集中にタブバーを非表示にし、完了ボタンが押されたときに非表示にします。
  2. ビュー コントローラー用のカスタム ツールバーを作成します。これは UIView で行うことができるため、常にビューの上に配置されます。
  3. 個々のタブのサイズを変更します。これを行う最善の方法は、UIViewController を使用して独自のカスタム タブ バーを作成し、IBOutlets を使用して UIButtons に接続された IBActions を作成することです。

modalPresentationStyle にこれほど多くのタブがあるのはなぜですか? 個人的には、代わりにプッシュ セグエを使用します。

独自のナビゲーション コントローラーの下にあるビュー コントローラーの新しいセットにプッシュしてみてください。タブバー用のスペースが増えます。戻るには、ツールバーに戻るボタンを配置して、プッシュをポップするか、元に戻します。

于 2012-09-17T00:47:23.097 に答える