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 關注
- 1401 瀏覽
添加回答
舉報