【问题标题】:UIActivityViewController has a weird size and shapeUIActivityViewController 有一个奇怪的大小和形状
【发布时间】:2016-03-04 20:24:41
【问题描述】:

我刚刚收到了我的应用程序的这个错误报告...无论我是在实际手机上还是视图控制器上,活动视图控制器突然变成了这种奇怪的狭窄形状。

这发生在一些几个月未触及的普通代码中:

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

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

【问题讨论】:

  • 您是否在应用程序委托中设置窗口大小
  • 这是1/3 ipad的截图吗?
  • 是否每次都能重现,请提供代码进行测试
  • 您的第一个目标应该是尝试使错误可重现
  • 如果自我已经从 UIModalPresentationOverFullScreen 呈现并且还呈现在另一个 UIActivityViewController 之上,我可以在 iOS12 上可靠地重现

标签: ios iphone uiactivityviewcontroller


【解决方案1】:

您是否尝试过重现此错误?尝试更新数组中的项目并检查错误是否仍然存在......这种类型的事情有时会发生,但除非我们不重现这种情况,否则它不能被称为错误。

如果您在通用应用程序中工作,请在呈现 ActivityView 之前添加以下代码行

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

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

【讨论】:

  • 同意,需要报告步骤。刚刚在下面发布了我自己的复制案例,发生在 (self.modalPresentationStyle == UIModalPresentationOverFullScreen)
【解决方案2】:

如果您使用的是 iPad,请尝试设置 sourceRectpopoverPresentationController 属性

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];

【讨论】:

    【解决方案3】:

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

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

    NSString *string = NSLocalizedString(@"shareString", nil);
    UIActivityViewController *activityViewController = [[UIActivityViewController alloc]
                                                        initWithActivityItems:@[string] applicationActivities:nil];
    
    [activityViewController setCompletionWithItemsHandler:
     ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *error)
     {
         if ( completed ) {
             NSLog(@"sharing complete");
         } else
         {
             NSLog(@"cancelled");
         }
     }];
    
    [self presentViewController:activityViewController animated:YES completion:^{
    }];
    

    【讨论】:

      【解决方案4】:

      您应该检查框架以查看自己的视图。可能它的宽度小于 activityViewController 的宽度,你就会得到这个错误。

      【讨论】:

        【解决方案5】:

        也许self.view.frame.size.width 是问题所在。您可以通过NSLogself.view 找到您的相框。简单的解决方法可能是:

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

        【讨论】:

          【解决方案6】:

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

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

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

          • 尝试更改“initWithActivityItems”值并查看 是否出现问题。

          • 如果您尝试创建 ActivityViewController 也来自不同的视图控制器。

          • 检查您的代码,看看是否有任何警告您 干脆忽略了。特别是如果您使用故事板 创建视图。

          我知道这不是一个答案,但我不能发布这么长的回复作为评论。

          希望这会有所帮助!

          【讨论】:

            【解决方案7】:

            我可以在以下情况下在 iOS 12 上重现此内容:

            1. 呈现 activityViewController(在本例中为 self)的控制器本身会使用 UIModalPresentationOverFullScreen 呈现
            2. 在自我下方的展示链中的某个地方,还有另一个 UIActivityAlertViewController。

            在我的情况下,解决方案是将自己切换回 UIModalPresentationFullScreen。

            【讨论】:

              【解决方案8】:

              在 iPadOS 中,您必须设置 PopoverPresentationController 的 Source ViewSource Rect 属性。下面的代码将使 ActivityViewController 以默认大小从屏幕中心出现

              对于 Swift 5

              activityViewController.popoverPresentationController?.sourceView = self.view
              activityViewController.popoverPresentationController?.sourceRect = CGRect(x: self.view.bounds.size.width / 2.0, y: self.view.bounds.size.height-50, width: 1.0, height: 1.0)
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2020-04-25
                • 2023-01-17
                • 1970-01-01
                • 2016-02-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多