iOS7-设置UITabBarController的SELECTED索引会中断屏幕右边缘的触摸事件吗?

iOS7-设置UITabBarController的SELECTED索引会中断屏幕右边缘的触摸事件吗?,ios7,uitabbarcontroller,frame,selectedindex,Ios7,Uitabbarcontroller,Frame,Selectedindex,我在iOS7上遇到了一个关于UITabBarController的奇怪问题,似乎找不到解决办法,所以欢迎提供任何帮助 场景: 基于导航的应用程序在iPad上使用横向定位 应用程序由主视图和第二个视图组成,第二个视图是一个UIDABBARC控制器 TabBarController有两个选项卡 第一个视图有两个按钮-每个按钮执行到选项卡栏控制器的顺序,并将不同的选项卡设置为所选。(即按钮1选择第一个选项卡,按钮2选择第二个选项卡) 通过调用选项卡栏控制器上的setSelectedIndex,在pr

我在iOS7上遇到了一个关于
UITabBarController
的奇怪问题,似乎找不到解决办法,所以欢迎提供任何帮助

场景:

  • 基于导航的应用程序在iPad上使用横向定位
  • 应用程序由主视图和第二个视图组成,第二个视图是一个UIDABBARC控制器
  • TabBarController有两个选项卡
  • 第一个视图有两个按钮-每个按钮执行到选项卡栏控制器的顺序,并将不同的选项卡设置为所选。(即按钮1选择第一个选项卡,按钮2选择第二个选项卡)
  • 通过调用选项卡栏控制器上的
    setSelectedIndex
    ,在
    prepareforsgue
    中设置选项卡

结果:

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

我甚至在视图上附加了一个点击手势识别器,并用它记录屏幕上可以触摸的区域——它似乎记录了大约x=770点的触摸事件。屏幕剩余的1/4是“不可触摸的”

结束后,如果手动切换到另一个选项卡并再次切换回,触摸事件将“修复”,全视图将再次响应触摸

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

非常感谢您在以下方面的帮助:

  • 首先是什么导致了这种情况(iOS7错误/更改?)
  • 我还可以如何解决这个问题?我试着调用
    setSelectedViewController
    以及使用
    setSelectedIndex
    ,结果似乎是一样的

  • 提前感谢。

    最终找到了解决方法:


    最后我向开发人员技术支持提出了这个问题,它看起来像一个bug。这是我从苹果得到的回应:

    选项卡栏控制器设置为包含视图控制器的容器视图的大小未调整为横向界面。显示视图控制器时的尺寸为768(宽)x 1024(高)

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

    UIWindow
        /* Navigation Controller */
        UILayoutContainerView
            UINavigationTransitionView
                UIViewControllerWrapperView
                    /* Tab bar controller */
                    UILayoutContainerView
                        UITransitionView
                            UIViewControllerWrapperView <-- Incorrectly sized.
                                /* MyViewController */
                                MyViewController.view
    

    希望这有助于其他人……

    在左侧的视图控制器列表中,导航到受影响的视图/视图控制器,将视图拖动到第一响应器下方,以便它与视图控制器的视图断开关联

    然后转到右侧的布局选项卡,选择所有4个定位点和两组调整大小箭头(水平+垂直)

    然后将视图拖回原来的位置(视图控制器正下方)。

    如中所述

    选项卡栏控制器设置的容器视图,用于包含 未调整视图控制器的大小以考虑接口 以景观为导向。它在您查看时的尺寸 控制器显示为768(宽)x 1024(高)

    当TabBarController最初以纵向模式显示时,我遇到了这个问题。当设备旋转到横向模式时,右侧的视图没有响应

    该答案中提出的解决方案对我不起作用,因为
    视图将出现:
    仅被调用一次。但是,只要视图发生更改(包括旋转),就会调用
    viewdilayoutsubvews
    ,因此我的解决方案是将UITabBarController子类化,并在
    viewdilayoutsubvews
    中执行变通方法:

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

    正确答案不适合我,因为用户可以改变方向;当改变方向时,它在某些区域仍然不可触摸

    所以我创建了自己的解决方案,我不确定这是正常的解决方案

    @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
    

    非常适合我

    你有没有试过使用类似于Reveal App或Spark Inspector的工具来查看视图层次结构中是否存在任何奇怪的情况?我在这里看到了相同的问题。我的猜测是,这与帧/边界在方向上设置不正确有关。这里的问题相同:我无法让它工作。您将此代码放在哪个视图控制器/方法中?我将此代码放在根视图控制器中选项卡栏项目之一,或者特别是显示错误帧/边界问题的项目之一。我在方法
    viewDidLoad
    中的
    TabController
    中只放了第二行,效果很好。我有奇怪的行为,我的观点也被提升了124点。我更喜欢这个解决方案,因为它比改变超级视图的框架更具侵入性。我也有同样的问题。尝试了你的解决方法,但对我不起作用。这对我来说非常有用:+1诊断问题并给出如此清晰的解释。在我的情况下,您的解决方案不起作用,但有一点修改:这明确表明您被授予了正确答案的标志。谢谢。它不应该也调用super吗?@JimRoepcke:根据UIViewController文档,调用super是不必要的。IMO
    viewdilayoutsubview
    和设置super视图的框架是危险的。如果苹果在未来改变某些事情,这可能会导致递归或创建事件的无限循环。
    @implementation FixedIOS7TabBarController
    
    - (void)viewDidLayoutSubviews
    {
        // fix for iOS7 bug in UITabBarController
        self.selectedViewController.view.superview.frame = self.view.bounds;
    }
    
    @end
    
    @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