追記されたコードでうまくいかないのは、present()
が二回呼び出されているためだと思います。
ここは少し自信がないのですが、iPad対策のコードは iPhone の場合でも問題なく使えるので、特に条件分けする必要はないかとおもいます。
条件分けを行い、また iPad の場合が画面の中央に表示されるようにするのであれば、追記されたコードから余計な present()
を除いた下記のようなコードで実行できそうです(iPhone 11 Pro Max, iPad 7thの各シミュレータで実験)。
Swift
1 @IBAction func share(_ sender: UIButton) {
2 let message = "abcdefg"
3
4 if let link = NSURL(string: "https://apps.apple.com/") {
5 let objectsToShare = [message, link] as [Any]
6 let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
7 activityVC.excludedActivityTypes = [.airDrop, .addToReadingList]
8
9 //
10 if UIDevice.current.userInterfaceIdiom == .pad {
11 activityVC.popoverPresentationController?.sourceView = view
12 let screenSize = UIScreen.main.bounds
13 activityVC.popoverPresentationController?.sourceRect = CGRect(x: screenSize.size.width/2, y: screenSize.size.height/2, width: 0, height: 0)
14 }
15 present(activityVC, animated: true, completion: nil)
16 }
17 }
あるいは、たとえば iPad の場合は選択したボタンから吹き出しのようにして表示するのであれば、 sourceView
に UIButton
のインスタンスを指定します。
Swift
1 @IBAction func shareButton(_ sender: UIButton) {
2 let message = "abcdefg"
3
4 if let link = NSURL(string: "https://apps.apple.com/") {
5 let objectsToShare = [message, link] as [Any]
6 let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
7 activityVC.excludedActivityTypes = [.airDrop, .addToReadingList]
8
9 if UIDevice.current.userInterfaceIdiom == .pad {
10 activityVC.popoverPresentationController?.sourceView = sender
11 }
12 present(activityVC, animated: true, completion: nil)
13 }
14 }
上記の場合、既にsender
が UIButton
として型が指定されていますが、Any
であれば代入時にダウンキャストすればいけるかと思います。
ボタンから吹き出しが出る。
設定に関係なく画面下部から出る。