📝
[SwiftUI]iOS14でTextをコピー可能にする
iOS15以上の場合はtextSelectionを使う
- iOS15以上であれば
textSelection
が使えるので、enable
をセットすれば良い
struct ContentView: View {
var body: some View {
Text("Hello, world!")
.textSelection(.enabled)
.padding()
}
}
iOS14以下の場合はContextMenuでボタンを表示させる
- iOS14以下も対応する場合、いくつかアプローチはあるが、
ContextMenu
でボタンを表示させる方法が手軽だった
参考: https://stackoverflow.com/questions/58005434/how-do-i-allow-text-selection-on-a-text-label-in-swiftui - 下記のような
ViewModifier
とextention
を準備する - ボタンのアクションの中で
UIPasteboard.general.string
を呼び出し、対象のテキストをクリップボードに保存している
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