📝

[SwiftUI]iOS14でTextをコピー可能にする

2022/04/20に公開

iOS15以上の場合はtextSelectionを使う

  • iOS15以上であれば textSelection が使えるので、enable をセットすれば良い
struct ContentView: View {
  var body: some View {
    Text("Hello, world!")
      .textSelection(.enabled)
      .padding()
  }
}

iOS14以下の場合はContextMenuでボタンを表示させる

struct CustomContextMenu: ViewModifier {
  let copyText: String
  func body(content: Content) -> some View {
    content
      .contextMenu(ContextMenu(menuItems: {
        Button(action: {
          UIPasteboard.general.string = copyText
        }) {
          Image(systemName: "doc.on.doc")
          Text("コピーする")
        }
      }))
  }
}

extension View {
  func customContextMenu(_ copyText: String) -> some View {
    modifier(CustomContextMenu(copyText: copyText))
  }
}
  • 利用する側は下記のように呼び出す
struct ContentView: View {
  var body: some View {
    Text("Hello, world!")
      .customContextMenu("Hello, world!")
      .padding()
  }
}

Discussion