🕊️
【SwiftUI】 CopyButton、 PasteButton
Copy Button (コピーボタン)
iOS3以上で使用可能
Buttonなどで UIPasteboard
を呼び出すことでコピーをすることができます。
iOS15以上で使用可能
Textなどのmodifierとして.textSelection
を呼び出し、.enabled
を指定してあげることでTextを長押しでシステムメニューが表示されコピーをすることができます。
使用例
struct ContentView: View {
@State private var isCopy: Bool = false
@State private var text: String = ""
var body: some View {
VStack {
// iOS15以上で使用可能
Text("↓長押しでCopy")
Text(text)
.textSelection(.enabled)
// iOS3以上で使用可能
Button {
UIPasteboard.general.string = text
isCopy.toggle()
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
isCopy.toggle()
}
} label: {
Image(systemName: isCopy ? "checkmark" : "doc.on.doc")
}
.padding()
TextField("text", text: $text)
.padding()
.multilineTextAlignment(TextAlignment.center)
}
}
}
PasteButton (ペーストボタン)
PasteButton は iOS16以降で使用できる機能です。
PasteButton
と呼び出してあげることで使用することができます。
引数として
supportedContentTypes: [UTType], payloadAction: ([NSItemProvider]) -> Void
payloadType: T.Type, onPaste: ([T]) -> Void
を指定することができます。
使用例1
struct PasteButtonView: View {
@State private var pastedImage: UIImage?
var body: some View {
VStack {
PasteButton(supportedContentTypes: [.image]) { images in
if let pasteImage = images.first {
_ = pasteImage.loadDataRepresentation(for: .image) { data, error in
if let data,
let image = UIImage(data: data) {
self.pastedImage = image
}
}
}
}
if let pastedImage {
Image(uiImage: pastedImage)
.resizable()
.aspectRatio(contentMode: .fit)
}
}
}
}
使用例 2
struct CopyButtonView: View {
@State private var text: String = ""
var body: some View {
VStack {
PasteButton(payloadType: String.self) { strings in
text = strings[0]
}
.padding()
TextField("text", text: $text)
.padding()
.multilineTextAlignment(TextAlignment.center)
}
}
}
PasteButtonの見た目を変える
PasteButtonでは
.buttonBorderShape
.labelStyle
.tint
などが見た目を変えるmodifierとして使用できます。
ほかにもいくつかありますが、今回は上記3つについて説明していきます。
.buttonBorderShape
角丸にするmodifierです。
-
.capcule
-
.roundedRectangle
-
.roundedRectangle(radius: CGFloat)
.labelStyle
-
.titleAndIcon
-
.titleOnly
-
.iconOnly
.tint
指定したViewのアクセントカラーをオーバーライドします。
Colorについてはこちらの方の記事がわかりやすいです。
Discussion