UIActivityViewController需要很长时间才能呈现

时间:2012-12-17 01:14:42

标签: ios objective-c uipopovercontroller uiactivityviewcontroller

我为iPhone制作了一款应用。现在,我正在为iPad重新创建它。

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

我尝试禁用弹出框,但仍需要大约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];    
}

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

我该如何解决这个问题?

4 个答案:

答案 0 :(得分: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];
        });
    });
}

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

答案 1 :(得分:14)

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

答案 2 :(得分:5)

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

dispatch_async(dispatch_get_main_queue(), ^{
    [self presentViewController:activityViewController animated:YES completion:nil];
});

答案 3 :(得分:3)

最近我自己这个问题。有时需要将近4或5秒钟弹出,这是一辈子的!但这是第一次。随后的电话很快。

几年前也出现了类似的问题,键盘出现的速度很慢,有人在appdelegate上添加了几行代码,预装了键盘来解决问题。

我在这里使用类似的方法通过在启动时将它放在AppDelegate中来预加载UIActivityViewController。它绝对是一个不应该是必要的黑客,但我找不到任何其他选择。

let lagfreeAVC:UIActivityViewController = UIActivityViewController(activityItems:  ["start"], applicationActivities: nil)
lagfreeAVC.becomeFirstResponder()
lagfreeAVC.resignFirstResponder()