23

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 でテストしましたが、どちらもこれを表示するには時間がかかります。

どうすれば問題を解決できますか?

4

4 に答える 4

21

良い質問です。私はちょうど同じ問題を抱えていました。それは本当に解決可能ではありません。ただし、アクティビティ インジケーターを作成し、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];
        });
    });
}

それは魅力のように機能します。ユーザーがボタンに触れると、アクティビティ インジケーターのアニメーションが開始され、処理に時間がかかることが示されます。

于 2013-11-23T16:25:19.137 に答える
15

iOS 7 でも同じ問題が発生していました。UIActivityTypeAirDropしかし、許可されたアクティビティ タイプから削除すると、コントローラーがほぼ瞬時に表示されます。

于 2014-03-20T05:29:19.263 に答える
5

これらの呼び出しはすでにメイン スレッドからのものですが、iOS 7 以降、それらのプレゼンテーション呼び出しの一部をディスパッチ ブロックでラップすると、遅延が大幅に短縮されるようです。

dispatch_async(dispatch_get_main_queue(), ^{
    [self presentViewController:activityViewController animated:YES completion:nil];
});
于 2015-01-15T16:40:15.027 に答える