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)
它就像一个魅力.当用户触摸按钮时,活动指示器开始动画,从而指示该过程将花费一些时间.
bmu*_*ler 15
我在iOS 7上遇到了同样的问题.UIActivityTypeAirDrop
然而,当我从允许的活动类型中删除时,控制器几乎立即出现.
尽管这些调用已经来自主线程,但是从iOS 7开始,将一些表示调用包装在一个调度块中似乎可以大大减少延迟
dispatch_async(dispatch_get_main_queue(), ^{
[self presentViewController:activityViewController animated:YES completion:nil];
});
Run Code Online (Sandbox Code Playgroud)