在 iOS 8 UIActivityViewController 和/或 UIPopoverController 之外单击时不会关闭它们

Posted

技术标签:

【中文标题】在 iOS 8 UIActivityViewController 和/或 UIPopoverController 之外单击时不会关闭它们【英文标题】:iOS 8 UIActivityViewController and/or UIPopoverController are not dissmissed when clicked outside of them 【发布时间】:2014-10-22 11:54:58 【问题描述】:

我已经阅读了UIPopoverController docs 和超过 10 个 *** 解决方案,这些解决方案在 ios 8.0.2 ipad 设备中均无效。

目标:

我想展示一个共享视图,当在外部单击时会关闭。

问题:

代码在 iOS 8.0 下运行良好。

代码(尝试了很多版本...):

 NSArray *dataToShare = @[url];  // ...or whatever pieces of data you want to share.
            UIActivityViewController* activityViewController =
            [[UIActivityViewController alloc] initWithActivityItems:dataToShare
                                              applicationActivities:nil];
            activityViewController.modalInPopover = YES;


            self.act = [[UIPopoverController alloc] initWithContentViewController:activityViewController];
            [self.act presentPopoverFromRect:CGRectMake(self.view.bounds.size.width/2, self.view.bounds.size.height/2, self.view.bounds.size.width/2, self.view.bounds.size.width/2) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
            self.act.delegate = self;

我已经添加了:

UIPopoverControllerDelegate

我已经尝试过:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

尽快

UIPopoverController

显示视图失去焦点并且不注册触摸。因此,我无法处理 self.act rect 空间之外的触摸以强制解雇。

还有……

NSArray *dataToShare = @[url];  // ...or whatever pieces of data you want to share.
            UIActivityViewController* activityViewController =
            [[UIActivityViewController alloc] initWithActivityItems:dataToShare
                                              applicationActivities:nil];
            activityViewController.modalInPopover = YES;

            UIPopoverPresentationController *presentationController = [activityViewController popoverPresentationController];
            presentationController.sourceView = self.view; // if button or change to self.view.

            [self.parentViewController  presentViewController:activityViewController animated:YES completion:nil];

我尝试从父母那里展示 UIActivityViewController 和 UIPopoverController,但也没有成功。

请帮忙,我在这个适用于 iOS 7.1 而不适用于 iOS 8+ 的愚蠢的东西上浪费了半天时间,这很荒谬,我仍然不知道为什么。

我会尝试添加在iOS8+中也消失的取消按钮。

更新1:

在 UIBarButtonItem 中添加 UIButton 并没有帮助...

UIButton *control = (UIButton *) sender;
                [control setFrame:CGRectMake(300, 300, 100, 100)];
                [control setBackgroundColor:[UIColor redColor]];
                UIBarButtonItem *barButtonItemView = [[UIBarButtonItem alloc] init];
                [barButtonItemView setCustomView:control];
                [self.popup presentPopoverFromBarButtonItem:barButtonItemView permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES];

更新 2 - 2014 年 12 月 19 日。 (iOS 7.1. - 8.1.2):

接受的答案适用于 iOS 8.1。我在使用 iOS 7.1 时遇到了一些错误。所以我修改它以适用于 iOS 7.1。我已经在答案下方的 cmets 中说明了代码适用于哪些设备。

// publish - sharing
        NSArray *dataToShare = @[url];  // ...or whatever pieces of data you want to share.
        UIActivityViewController* activityViewController =
        [[UIActivityViewController alloc] initWithActivityItems:dataToShare
                                          applicationActivities:nil];

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    
        NSLog(@" SHARING - 1 - ");
        [self presentViewController:activityViewController animated:YES completion:^];
    
    else
    
        // Change Rect to position Popover
        NSLog(@" SHARING - 2 - ");
        self.popup = [[UIPopoverController alloc] initWithContentViewController:activityViewController];

        [self.popup presentPopoverFromRect:CGRectMake(self.view.frame.size.width * 3 / 5 ,
                                                      self.view.frame.size.width/2,
                                                      self.view.frame.size.width/10,
                                                      self.view.frame.size.width/10) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    

【问题讨论】:

【参考方案1】:

添加这个怎么样。

UIActivityViewController* activityViewController =
            [[UIActivityViewController alloc] initWithActivityItems:dataToShare
                                              applicationActivities:nil];
            activityViewController.modalInPopover = YES;

activityViewController.popoverPresentationController.sourceView = self.view;

【讨论】:

我在 iOS 8.1.2 (iPad) 上测试了这段代码,但它仍然不能正常工作。在共享视图之外单击不会将其关闭。仅使用此代码根本不起作用:( 分享的触发条件是什么? (例如,按下共享按钮)我将展示在我的程序中工作的部分代码。 - (IBAction)shareButton:(id)sender NSArray *items = @[something you want to share]; UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:applicationActivities]; activityViewController.popoverPresentationController.sourceView = self.view; [self presentViewController:activityViewController animated:YES completion:nil]; 您写的注释代码是正确的,适用于iOS 8.1.2。泰 m8 :)。我已经编辑了你的帖子,审核后我会接受答案。问题出在“activityViewController.modalInPopover = YES;”中行代码。删除它解决了这个问题。我添加了一些修改,以便代码适用于 iOS 7.1.0 - iOS 8.1.2。完整的修改将在问题的更新代码中可见。该代码已在(设备)上测试过:iPod & iPad 2 (iOS 8.1.2) 和所有模拟器 (iOS 7.1. & 8.1)。

以上是关于在 iOS 8 UIActivityViewController 和/或 UIPopoverController 之外单击时不会关闭它们的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 UIActivityViewController 创建用户交互式推文或 Facebook 帖子

在 ios 8 中以横向模式隐藏并在 xCode 6 中发布 ios 8 后尝试在 ios 7 中正常工作的状态栏问题

如何在 iOS 8 中从 iOS 9 实现 UIUserNotificationActionBehavior.TextInput?

在 iOS8-iOS9 中设置提醒/警报

在 socket.io-client 中调用 IO 时出错,角度 8

在iOS上播放.m3u8文件