iPhone用のアプリを作りました。今はiPad用に作り直しています。
ユーザーがツールバーのアクション ボタンを選択すると、ポップオーバーが表示されますがUIActivityViewController
、何らかの理由で、最初に表示されるまでに約 10 秒かかります。iPhone では、約 1 秒かかります。ポップオーバーを除いて、コードは同じです。
ポップオーバーを無効にしてみましたが、それでも表示されるまでに約 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 でテストしましたが、どちらもこれが表示されるまでに少し時間がかかります。
どうすれば問題を解決できますか?
ベストアンサー1
いい質問ですね。私もちょうど同じ問題を抱えていました。本当に解決できるものではありません。ただし、アクティビティ インジケーターを作成し、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];
});
});
}
これはうまく機能します。ユーザーがボタンをタッチすると、アクティビティ インジケーターがアニメーションを開始し、プロセスに時間がかかることを示します。