3

我正在将一个应用程序移植到 iOS 6,我发现一个解决方案在 iOS 6 上不再适用于在拆分视图控制器中触发和关闭主视图控制器的显示。

这是我用来触发 iOS6 上的操作的一段代码,如果设备旋转则该操作才有效:

- (void)hideMaster:(BOOL)hide {

[self clearOverlay];

UISplitViewController* spv = appDelegate.splitViewController;

NSLog(@"hidemaster: I do %@show the master", (hide?@"not ":@""));

self.hiddenMaster= hide;

NSLog(@"delegate=%@", spv.delegate);

[spv.view setNeedsLayout];
spv.delegate=nil;

spv.delegate=self;

}

- (BOOL)splitViewController:(UISplitViewController*)svc shouldHideViewController: (UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation {

NSLog(@"Spv: I do %@show the master", (self.hiddenMaster?@"not ":@""));

return self.hiddenMaster;
}

如何在用户不旋转设备的情况下强制触发 shouldHideViewController 回调?

谢谢,法布里齐奥·巴托洛穆奇

4

4 回答 4

5

比预期容易:我把 [spv.view setNeedsLayout]; 调用您的函数后不久,它就完美地完成了这项工作。这是为了其他用户的利益的完整代码:

- (void)hideMaster:(BOOL)hide {
   NSLog(@"hide-unhide master");
   UISplitViewController* spv = appDelegate.splitViewController;
   spv.delegate=self;
   self.hiddenMaster= hide;
   [spv willRotateToInterfaceOrientation:self.interfaceOrientation duration:0];
   [spv.view setNeedsLayout];
}

- (BOOL)splitViewController:(UISplitViewController*)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation {
   NSLog(@"Spv: I do %@ show the master", (self.hiddenMaster?@"not ":@""));
   return self.hiddenMaster;  
}
于 2012-09-28T16:04:56.677 回答
1

代替

spv.delegate=nil;
spv.delegate=self;

你需要做

[spv willRotateToInterfaceOrientation:self.interfaceOrientation duration:0];

你会很开心。

于 2012-09-24T16:42:36.163 回答
0

没有办法解决这个问题。甚至苹果公司也展示了一面白旗。我更改了架构以将所有视图都作为弹出窗口,并完全摆脱了拆分视图控制器。我不能再推迟引入自动布局了。

于 2014-05-26T09:25:14.210 回答
0

我最终通过遵循 Apple 文档建议仅根据用户的指示打开它来摆脱它。现在我只为用户手动打开的辅助面板恢复了它,而不是在 iPhone 版本上由展开的 segue 管理。

于 2015-08-11T13:57:16.987 回答