iOS7 - 设置UITabBarController的selectedIndex会破坏屏幕右边缘的触摸事件?

Joh*_*tin 14 selectedindex frame uitabbarcontroller ios7

UITabBarController在iOS7上遇到了一个奇怪的问题,似乎无法找到解决方法,所以欢迎任何帮助!

场景:

  • 基于导航的应用程序在iPad上使用横向方向.
  • App包含一个主视图,第二个视图是一个UITabBarController.
  • TabBarController有两个选项卡.
  • 第一个视图有两个按钮 - 每个按钮对标签栏控制器执行一个segue,并设置一个不同的选项卡.(即button1选择第一个选项卡,button2选择第二个选项卡).
  • prepareForSegue通过调用setSelectedIndex选项卡栏控制器来完成设置选项卡.

简单的故事板,演示了这个问题

结果:

在iOS 7上,我发现标签栏控制器中显示的视图无法在视图的右侧边缘注册任何触摸事件!因此,在上面显示的故事板中,屏幕右侧的UISwitch无法点击.

我甚至在视图中附加了一个轻敲手势识别器,并用它来记录可以触摸的屏幕区域 - 它似乎记录了大约x = 770点的触摸事件.剩下的1/4屏幕是"不可触摸的"!

在segue之后,如果您手动切换到另一个选项卡并再次切换回来,则触摸事件将"固定"并且完整视图会再次响应触摸.

这似乎不是iOS 5/6上的问题.

任何帮助非常感谢:

  1. 是什么导致这种情况首先发生(iOS7错误/更改?)
  2. 我还能怎样解决这个问题?我试过调用setSelectedViewController以及使用setSelectedIndex,这似乎是一样的.

提前致谢.

Joh*_*tin 12

我最终通过开发者技术支持提出这个问题,它看起来像一个bug.这是我从Apple那里得到的回应:

标签栏控制器设置为包含视图控制器的容器视图未调整大小以考虑横向方向的界面.显示视图控制器时的尺寸为768(宽度)x 1024(高度).

显示所选选项卡的视图时,视图层次结构如下所示:

UIWindow
    /* Navigation Controller */
    UILayoutContainerView
        UINavigationTransitionView
            UIViewControllerWrapperView
                /* Tab bar controller */
                UILayoutContainerView
                    UITransitionView
                        UIViewControllerWrapperView <-- Incorrectly sized.
                            /* MyViewController */
                            MyViewController.view
Run Code Online (Sandbox Code Playgroud)

UIViewControllerWrapperView的大小不正确不会导致显示问题,因为即使子视图超出其超视图的范围,它们仍会显示.但是,事件路由要严格得多.屏幕右侧四分之一的事件永远不会路由到视图控制器的视图,因为命中测试在错误大小的UIViewControllerWrapperView中失败,其中事件落在UIViewControllerWrapperView的边界之外.

作为一种解决方法,我将UITabBarController子类化,并在viewWillAppear中添加了以下内容:

@implementation FixedIOS7TabBarController

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    // Fix the frame of the UIViewControllerWrapperView
    self.selectedViewController.view.superview.frame = self.view.bounds;
}

@end
Run Code Online (Sandbox Code Playgroud)

希望能帮助别人......


bra*_*jam 10

本回答所述,

标签栏控制器设置为包含视图控制器的容器视图未调整大小以考虑横向方向的界面.显示视图控制器时的尺寸为768(宽度)×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
Run Code Online (Sandbox Code Playgroud)