在 iOS 7 上以横向模式处理 UIActivityViewController 后视图边界发生变化

Posted

技术标签:

【中文标题】在 iOS 7 上以横向模式处理 UIActivityViewController 后视图边界发生变化【英文标题】:view bounds change after disposing UIActivityViewController on iOS 7 in landscape mode 【发布时间】:2013-11-28 13:38:03 【问题描述】:

我在使用 UIActivityViewController 时遇到了一个奇怪的行为:

我有一个带有分享按钮的 UIViewController (768x704)。当我点击分享按钮时,会打开一个 UIActivityView。关闭 ActivityView 后,我的导航栏(或视图控制器本身)会更改其大小。

代码如下:

NSLog(@"Old bounds: %@",NSStringFromCGRect(self.view.bounds));

UIActivityViewController* activityViewController = [[UIActivityViewController alloc] initWithActivityItems:[NSArray arrayWithObject:shareText] applicationActivities:nil];
[activityViewController setCompletionHandler:^(NSString *activityType, BOOL completed)
    NSLog(@"New bounds: %@",NSStringFromCGRect(self.view.bounds));
];

[self presentViewController:activityViewController animated:YES completion:^]; 

输出:

Old Bounds: 0, 0, 768, 704
New Bounds: 0, 0, 768, 724

好像是状态栏的高度。

这只发生在 ios 7 上,在 iPad 上的横向模式下。任何其他场景都运行良好 - 没有任何故障。

这可能是 iOS7 中的错误吗?还是只有我做错了什么?

【问题讨论】:

【参考方案1】:

根据UIActivityViewController Class Reference UIActivityViews 应该出现在popovers中:

讨论

[...] 在 iPad 上,您必须在弹出窗口中显示视图控制器。在其他设备上,您必须以模态方式呈现。

当我将UIActivityViewController 放入弹出框时,我的问题似乎得到了解决。

经验教训:我应该更频繁地阅读类引用;)

【讨论】:

【参考方案2】:

在 iOS7 中,您的控制器通常与导航栏重叠。 尝试将此方法添加到您的控制器:

- (UIRectEdge) edgesForExtendedLayout

    return UIRectEdgeNone;

您的导航控制器也与 satatusbar 重叠。 最近使用系统控制器会导致大量未记录的行为。

附:为什么要从 self.navigationController 呈现活动控制器,而不是从 self 呈现?

【讨论】:

感谢您的回答。可悲的是,edgesForExendedLayout 也不起作用。从 self.navigationController 展示它只是为了测试这是否与我的问题有关 - 我在我的问题中更改了它。

以上是关于在 iOS 7 上以横向模式处理 UIActivityViewController 后视图边界发生变化的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 - 在横向模式下设置导航栏的背景

在 iOS 7 横向模式下播放视频

在 iPhone 的 iOS 7 中打开相机时横向模式下的方向问题

在 ios 8 中以横向模式隐藏并在 xCode 6 中发布 ios 8 后尝试在 ios 7 中正常工作的状态栏问题

没有正文内容的 iPad 横向上的额外正文高度 (iOS7)

iOS:处理方向更改而不在视图控制器上启用横向模式