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