14

iOS7で奇妙な問題が発生しUITabBarControllerましたが、回避策が見つからないようです。

シナリオ:

  • iPad で横向きを使用するナビゲーション ベースのアプリ。
  • アプリは、メイン ビューと、UITabBarController である 2 番目のビューで構成されます。
  • TabBarController には 2 つのタブがあります。
  • 最初のビューには 2 つのボタンがあります。各ボタンはタブ バー コントローラーへのセグエを実行し、別のタブを選択済みとして設定します。(つまり、button1 は最初のタブを選択し、button2 は 2 番目のタブを選択します)。
  • タブの設定は、タブ バー コントローラーprepareForSegueを呼び出すことによって行われます。setSelectedIndex

問題を示す簡単なストーリーボード

結果:

iOS 7 では、タブ バー コントローラーに表示されるビューが、ビューの右端に沿ってタッチ イベントを登録できないことがわかりました。そのため、上記のストーリーボードでは、画面の右側にある UISwitch をタップできません。

ビューにタップジェスチャレコグナイザーを添付し、それを使用して、タッチできる画面の領域をログに記録しました.x = 770ポイントまでのタッチイベントを登録しているようです. 画面の残りの 1/4 は「触れることはできません」!

セグエの後、手動で別のタブに切り替えて再び元に戻すと、タッチ イベントが「修正」され、フル ビューが再びタッチに応答します。

これは iOS 5 / 6 では問題ないようです。

次の点について、どんな助けでも大歓迎です。

  1. そもそも何が原因でこうなってしまうのか(iOS7のバグ・変更?)
  2. 他にどうすればこれを回避できますか? setSelectedViewController使用だけでなく呼び出しも試しましsetSelectedIndexたが、これは同じようです。

前もって感謝します。

4

5 に答える 5

10

この回答で説明されているように、

ビュー コントローラーを含むようにタブ バー コントローラーが設定するコンテナー ビューは、横向きのインターフェイスを考慮してサイズ変更されません。ビュー コントローラが表示されたときの寸法は、768 (幅) x 1024 (高さ) です。

TabBarController が元々縦長モードで表示されていたときに、この問題が発生していました。デバイスを横向きモードに回転すると、右側のビューが応答しなくなりました。

その回答で提案された解決策は、viewWillAppear:一度しか呼び出されないため、うまくいきませんでした。ただし、viewDidLayoutSubvews回転を含むビューが変更されるたびに呼び出されるため、私の解決策は UITabBarController をサブクラス化し、次の回避策を実行することでしたviewDidLayoutSubvews:

@implementation FixedIOS7TabBarController

- (void)viewDidLayoutSubviews
{
    // fix for iOS7 bug in UITabBarController
    self.selectedViewController.view.superview.frame = self.view.bounds;
}

@end
于 2013-10-16T15:19:51.810 に答える
1

ユーザーが向きを変更できるため、正しい答えはうまくいきませんでした。また、向きを変えると、一部の領域ではまだ触れられません。

だから私は独自の解決策を作成しますが、それが通常の解決策かどうかはわかりません。

@implementation FixedIOS7TabBarController
- (UIView*)findInSubview:(UIView*)view className:(NSString*)className
{
    for(UIView* v in view.subviews){
        if([NSStringFromClass(v.class) isEqualToString:className])
            return v;
        UIView* finded = [self findInSubview:v className:className];
        if(finded)
            return finded;
    }
    return nil;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    UIView* wraperView = [self findInSubview:self.view className:@"UIViewControllerWrapperView"];
    wraperView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}
@end

私にとって完璧に機能します!

于 2014-01-10T09:38:42.540 に答える
0

左側のビュー コントローラーのリストで、影響を受けるビュー/ビュー コントローラーに移動し、ビューをファーストレスポンダーの下にドラッグして、ビュー コントローラーのビューとの関連付けを解除します。

次に、右側のレイアウト タブに移動し、4 つのアンカーすべてとサイズ変更矢印の両方のセット (水平 + 垂直) を選択します。

次に、ビューをドラッグして元の場所 (View Controller のすぐ下) に戻します。

于 2013-10-09T19:03:09.613 に答える