🕊️

【SwiftUI】 CopyButton、 PasteButton

2022/12/07に公開

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 (ペーストボタン)

https://developer.apple.com/documentation/swiftui/pastebutton

PasteButton は iOS16以降で使用できる機能です。
PasteButton と呼び出してあげることで使用することができます。

引数として

  1. supportedContentTypes: [UTType], payloadAction: ([NSItemProvider]) -> Void
  2. 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では

  1. .buttonBorderShape
  2. .labelStyle
  3. .tint

などが見た目を変えるmodifierとして使用できます。
ほかにもいくつかありますが、今回は上記3つについて説明していきます。

.buttonBorderShape

角丸にするmodifierです。

  1. .capcule 

  2. .roundedRectangle

  3. .roundedRectangle(radius: CGFloat)

.labelStyle

  1. .titleAndIcon

  2. .titleOnly

  3. .iconOnly

.tint

指定したViewのアクセントカラーをオーバーライドします。

Colorについてはこちらの方の記事がわかりやすいです。
https://zenn.dev/ryodeveloper/articles/kame_ga_1_hiki

Discussion