UIActivityViewController需要很长时间才能呈现

Max*_*ral 17 objective-c uipopovercontroller ios uiactivityviewcontroller

我为iPhone制作了一个应用程序.现在,我正在为iPad重新创建它.

当用户选择工具栏中的操作按钮时,弹出窗口应显示a UIActivityViewController,但由于某种原因,它需要大约10秒才能显示第一次.在iPhone上,它需要大约一秒钟.除了弹出框之外,它是相同的代码.

我尝试禁用弹出窗口,但仍需要大约10秒才能显示.

这是代码:

-(IBAction)Actions:(UIBarButtonItem*)sender 
{
    if ([activityPopover isPopoverVisible] == YES) 
    {
        [activityPopover dismissPopoverAnimated:YES];
        return;
    }
    UIWebView *currentWebView = ((TabView *)self.tabs[self.currentTabIndex]).webViewObject;

    NSString *currentURL = (NSString*)[currentWebView request].mainDocumentURL;
    if (currentURL == NULL) return;

    BookmarkActivity *bookmarkActivity = [[BookmarkActivity alloc] init];

    UIActivityViewController *sharing = [[UIActivityViewController alloc] initWithActivityItems:[NSArray arrayWithObject:currentURL] applicationActivities:@[bookmarkActivity]];

    activityPopover = [[UIPopoverController alloc] initWithContentViewController:sharing];
    [activityPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];    
}
Run Code Online (Sandbox Code Playgroud)

我已经在我的iPad 3和我的iPad mini上进行了测试,两者都需要一段时间来呈现.

我该如何解决这个问题?

Mat*_*tič 19

好问题,我只是遇到了同样的问题.它不是真的可以解决.但是,您可以通过创建活动指示器然后将UIActivityViewController的初始化发送到后台来改善用户体验:

-(void)openIn:(id)sender
{
    // start activity indicator
    [self.activityIndicator startAnimating];

    // create new dispatch queue in background
    dispatch_queue_t queue = dispatch_queue_create("openActivityIndicatorQueue", NULL);

    // send initialization of UIActivityViewController in background
    dispatch_async(queue, ^{
        NSArray *dataToShare = @[@"MyData"];
        UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:dataToShare applicationActivities:nil];

        // when UIActivityViewController is finally initialized, 
        // hide indicator and present it on main thread
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.activityIndicator stopAnimating];
            [self presentViewController:activityViewController animated:YES completion:nil];
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

它就像一个魅力.当用户触摸按钮时,活动指示器开始动画,从而指示该过程将花费一些时间.

  • 我建议相同,但更优雅的方式.将`UIBarButtonItem`属性`customView`设置为动态创建的`UIActivityIndi​​cator`.这会将按钮图标替换为活动指示器.然后,在演示动画的completition块上调用`[button setCustomView:nil]`,它将恢复为原始样式.=) (3认同)

bmu*_*ler 15

我在iOS 7上遇到了同样的问题.UIActivityTypeAirDrop然而,当我从允许的活动类型中删除时,控制器几乎立即出现.

  • 它比以前更快,但仍然很慢 (5认同)
  • 对应代码:UIActivityViewController*activityController = [[UIActivityViewController alloc] initWithActivityItems:sharingItems applicationActivities:nil]; activityController.excludedActivityTypes = @ [UIActivityTypeAirDrop]; (3认同)

JP *_*sek 5

尽管这些调用已经来自主线程,但是从iOS 7开始,将一些表示调用包装在一个调度块中似乎可以大大减少延迟

dispatch_async(dispatch_get_main_queue(), ^{
    [self presentViewController:activityViewController animated:YES completion:nil];
});
Run Code Online (Sandbox Code Playgroud)