3 回答
TA贡献1785条经验 获得超4个赞
在iPad上,活动视图控制器将使用新的UIPopoverPresentationController显示为弹出窗口,它要求您使用以下三个属性之一为弹出窗口的表示指定锚点:
为了指定锚点,您需要获取对UIActivityController的UIPopoverPresentationController的引用,并设置其中一个属性,如下所示:
if ( [activityViewController respondsToSelector:@selector(popoverPresentationController)] ) { // iOS8 activityViewController.popoverPresentationController.sourceView =parentView; }
TA贡献1784条经验 获得超2个赞
同样的问题来到我的项目然后我找到解决方案,在iPad中打开UIActivityViewController,我们必须使用UIPopoverController
这是一个在iPhone和iPad上使用它的代码
//to attach the image and text with sharing UIImage *image=[UIImage imageNamed:@"giraffe.png"];NSString *str=@"Image form My app";NSArray *postItems=@[str,image];UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:postItems applicationActivities:nil];//if iPhoneif (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { [self presentViewController:controller animated:YES completion:nil];}//if iPadelse { // Change Rect to position Popover UIPopoverController *popup = [[UIPopoverController alloc] initWithContentViewController:controller]; [popup presentPopoverFromRect:CGRectMake(self.view.frame.size.width/2, self.view.frame.size.height/4, 0, 0)inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];}
对于swift 4.2 / swift 5
func openShareDilog() { let text = "share text will goes here" // set up activity view controller let textToShare = [text] let activityViewController = UIActivityViewController(activityItems: textToShare, applicationActivities: nil) activityViewController.excludedActivityTypes = [.airDrop] if let popoverController = activityViewController.popoverPresentationController { popoverController.sourceRect = CGRect(x: UIScreen.main.bounds.width / 2, y: UIScreen.main.bounds.height / 2, width: 0, height: 0) popoverController.sourceView = self.view popoverController.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0) } self.present(activityViewController, animated: true, completion: nil)}
TA贡献1811条经验 获得超5个赞
我最近在Swift 2.0中遇到了这个确切的问题(原始问题),这UIActivityViewController
对于iPhone来说效果很好,但在模拟iPad时会导致崩溃。
我只想在这里添加这个答案的线程,至少在Swift 2.0中,你不需要if语句。你可以popoverPresentationController
选择。
快速地说,接受的答案似乎是说你可以只有一个sourceView,只是一个sourceRect,或者只是一个barButtonItem,但根据Apple的UIPopoverPresentationController文档,你需要以下之一:
barButtonItem
sourceView 和 sourceRect
我正在研究的特定示例如下所示,我正在创建一个函数,它接受一个UIView
(对于sourceView和sourceRect)和String
(UIActivityViewController唯一的activityItem)。
func presentActivityViewController(sourceView: UIView, activityItem: String ) { let activityViewController = UIActivityViewController(activityItems: [activityItem], applicationActivities: []) activityViewController.popoverPresentationController?.sourceView = sourceView activityViewController.popoverPresentationController?.sourceRect = sourceView.bounds self.presentViewController(activityViewController, animated: true, completion: nil)}
这段代码适用于iPhone和iPad(我认为甚至是tvOS) - 如果设备不支持popoverPresentationController
,提到它的两行代码基本上都被忽略了。
有点好,你需要做的就是让它适用于iPad只需要添加两行代码,或者如果你使用的是barButtonItem就可以添加一行代码!
- 3 回答
- 0 关注
- 1359 浏览
添加回答
举报