Ios UIActivityViewController具有奇怪的大小和形状

Ios UIActivityViewController具有奇怪的大小和形状,ios,iphone,uiactivityviewcontroller,Ios,Iphone,Uiactivityviewcontroller,我刚刚收到了一个针对我的应用程序的错误报告……不管我是在实际的手机上还是在视图控制器上,活动视图控制器突然变成了一个奇怪的窄形 这是发生在一些几个月来从未接触过的普通代码上: UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[message] applicationActivities:nil]; [self presentVi

我刚刚收到了一个针对我的应用程序的错误报告……不管我是在实际的手机上还是在视图控制器上,活动视图控制器突然变成了一个奇怪的窄形

这是发生在一些几个月来从未接触过的普通代码上:

UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[message] applicationActivities:nil];
[self presentViewController:activityViewController animated:YES completion:nil];

出了什么问题?我甚至想不起从哪里开始解决这个问题

你应该检查你自己的视角。可能它的宽度小于activityViewController的宽度,您会遇到此错误。

可能是问题出在self.view.frame.size.width。您可以使用
NSLog
self.view
在框架中找到您的应用程序。简单的解决方法可以是:

[self.view.window.rootViewController presentViewController:activityViewController animated:YES completion:nil];

这类错误确实会发生,它们确实考验了你的耐心,给了你一个挑战。虽然我不能给出一个明确的答案,但我可以给你一些关于如何解决这个问题的提示

我建议您首先尝试在开发机器上重新创建它。然后试着玩一玩,看看是什么导致了这个问题。这里有一些东西可以尝试一下

  • 在具有不同操作系统的多个设备上运行此操作,以便您能够确定模式

  • 尝试更改“
    initWithActivityItems
    ”值,请参阅 问题是否发生

  • 如果尝试创建问题,请查看问题是否存在 ActivityViewController也来自不同的视图控制器

  • 检查您的代码,看看是否有任何您需要的警告 我们完全忽视了这一点。特别是当你使用故事板 创建视图

我知道这不是一个答案,但我不能发表这么长的评论


希望这有帮助

在某些情况下可能会发生。试试这个

NSArray *Items   = [NSArray arrayWithObjects:
                    @"Checking Test App", nil];
UIActivityViewController *activity=[[UIActivityViewController alloc]initWithActivityItems:Items applicationActivities:nil];
[self presentViewController:activity animated:YES completion:nil];


你有没有尝试过复制这个bug???如果我们没有关于这个bug是如何产生的确切场景,那么我们就无法找到解决方案!!!尝试更新数组中的项并检查错误是否仍然存在。。。这种情况有时会发生,但除非我们不重现这种情况,否则就不能称之为bug

如果您正在使用universal app,请在显示ActivityView之前添加以下代码行

ActivityViewController.popoverPresentationController.sourceView = self.view;
[self presentViewController:activityViewController animated:YES completion:nil];

我将建议,而不是寻找解决方案首先找出问题。在此之前,我从未见过ActivityView如此怪异的行为,如果我们知道为什么会发生这种情况,那么它将对每个iOS开发者都有帮助。

如果您在iPad上,请尝试设置
sourceRect的
popoverPresentationController
属性

NSString *string = NSLocalizedString(@"shareString", nil);
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:@[string] applicationActivities:nil];

activityVC.popoverPresentationController.sourceView = self.view;
activityVC.popoverPresentationController.sourceRect = CGRectMake(self.view.bounds.size.width / 2.0, self.view.bounds.size.height-50, 1.0, 1.0);

[self presentViewController:activityVC animated:YES completion:nil];

在以下情况下,我可以在iOS 12上复制此功能:

  • 显示activityViewController(本例中为self)的控制器本身会显示UIModalPresentationOverFullScreen
  • 在self下面的表示链中,有另一个UIActivityAlertViewController
    我的解决方案是将self切换回UIModalPresentationFullScreen。

    在iPadOS中,您必须设置PopoverPresentationController的源视图和源Rect属性。下面的代码将使ActivityViewController以默认大小显示在屏幕中央

    适用于Swift 5

    activityViewController.popoverPresentationController?.sourceView=self.view
    activityViewController.popoverPresentationController?.sourceRect=cRect(x:self.view.bounds.size.width/2.0,y:self.view.bounds.size.height-50,宽度:1.0,高度:1.0)
    
    您是否在应用程序代理中设置窗口大小这是1/3 ipad的屏幕截图吗?是否每次都可以复制,请提供用于测试的代码。您的第一个目标应该是尝试使错误重现。如果已通过UIModalPresentationOverFullScreen从UIModalPresentation中显示自己,并且还显示在另一个UIActivityViewControllerAgreed上,则需要报告步骤。刚刚在下面进一步发布了我自己的复制案例,发生在(self.modalPresentationStyle==UIModalPresentationOverFullScreen)
    NSString *string = NSLocalizedString(@"shareString", nil);
    UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:@[string] applicationActivities:nil];
    
    activityVC.popoverPresentationController.sourceView = self.view;
    activityVC.popoverPresentationController.sourceRect = CGRectMake(self.view.bounds.size.width / 2.0, self.view.bounds.size.height-50, 1.0, 1.0);
    
    [self presentViewController:activityVC animated:YES completion:nil];