我为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上进行了测试,两者都需要一段时间来呈现。
我该如何解决这个问题?
答案 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()