はじめに
iOS16からSWiftUIに新しいUIコンポーネントが追加されました。
その中にShareLink
というものがあったので使ってみたら驚きの簡単さだったので紹介します。
以前の実装方法
このようにUIKitをうまく使わないと使用できませんでした。
import SwiftUI
struct ContentView: View {
@State var isSharePopover: Bool = false
var body: some View {
Button("シェア") {
share()
}
.popover(isPresented: $isSharePopover) {
ShareView()
}
}
// iPhone: ハーフモーダル
// iPad: ポップアップ
func share() {
if UIDevice.current.userInterfaceIdiom == .pad {
isSharePopover = true
} else {
let link = URL(string: "https://qiita.com/SNQ-2001/items/86646b661ccc4a7a9034")!
let activityViewController = UIActivityViewController(activityItems: [link], applicationActivities: nil)
let scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene
let viewController = scene?.keyWindow?.rootViewController
viewController?.present(activityViewController, animated: true, completion: nil)
}
}
}
struct ShareView: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> UIActivityViewController {
let link = URL(string: "https://qiita.com/SNQ-2001/items/86646b661ccc4a7a9034")!
let activityViewController = UIActivityViewController( activityItems: [link], applicationActivities: nil)
return activityViewController
}
func updateUIViewController(_ vc: UIActivityViewController, context: Context) {
}
}
ShareLinkを使用すると...
1行で書くことができました!
import SwiftUI
struct ContentView: View {
var body: some View {
ShareLink(item: URL(string: "https://qiita.com/SNQ-2001/items/45f30b8b757e3e4fae5a")!)
}
}
ラベルをカスタマイズする
import SwiftUI
struct ContentView: View {
var body: some View {
ShareLink(item: URL(string: "https://qiita.com/SNQ-2001/items/45f30b8b757e3e4fae5a")!) {
Text("シェアボタン")
}
}
}
SharePreviewをカスタマイズする
import SwiftUI
struct ContentView: View {
var body: some View {
ShareLink(item: URL(string: "https://qiita.com/SNQ-2001/items/45f30b8b757e3e4fae5a")!, preview: SharePreview("ここがシェアプレビューです", icon: Image(systemName: "wind.snow")))
}
}
おわり
SwiftUIがどんどん便利になってますね
次はWebViewあたりを対応して欲しいですね〜