先日SwiftUIに初めて触れてシンプルなコードでUIが実装できることにとても魅力を感じました。
SwiftUIについてもっと詳しく調べたくなったので、基礎的なことを組み合わせてどんな事ができるのかもう少し詳しく調べてみたいと思います。
環境
・MacOS Ventura 13.0
・Xcode 14.2
・Swift version 5.7.2


先日SwiftUIに初めて触れてシンプルなコードでUIが実装できることにとても魅力を感じました。
SwiftUIについてもっと詳しく調べたくなったので、基礎的なことを組み合わせてどんな事ができるのかもう少し詳しく調べてみたいと思います。
・MacOS Ventura 13.0
・Xcode 14.2
・Swift version 5.7.2
animal1~animal3画像を作成しました。これらを2列に並べて縦スクルロールしてみます。
GeometryReader { geometory in
}
ScrollView(.vertical, showsIndicators: false ) {
}
                VStack {
                    ForEach(1..<4) { i in
                        
                        HStack {
                            Image("animal\(i)").resizable().frame(width: geometory.size.width / 2)
                            Image("animal\(i)").resizable().frame(width: geometory.size.width / 2)
                        }.frame(height: UIDevice.current.orientation.isLandscape ? 300 : 150)
                    }
                }
レイアウトが完成しました。縦スクルロールもプレビューで確認できます。
func makeUIView(context: Context) -> UISearchBar {
        let searchbar = UISearchBar()
        searchbar.barStyle = .default
        searchbar.autocapitalizationType = .none
        searchbar.delegate = context.coordinator
        return searchbar
    }
func updateUIView(_ uiView: UISearchBar, context: Context) {
        
    }
@Binding var txt : String
func makeCoordinator() -> Coordinator {
        return Coordinator(parent: self)
    }
class Coordinator : NSObject,UISearchBarDelegate {
        var parent : SearchView!
        
        init(parent: SearchView!) {
            self.parent = parent
        }
        
        func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
            
            parent.txt = searchText
        }
    }


    @State var datas = ["A", "B", "C","D"]
    @State var txt = ""
    var body: some View {
        VStack {
            SearchView(txt: $txt)
            
            List(datas.filter{ txt == "" ? true : $0.localizedStandardContains(txt)},id: \.self){ i in
                Text(i).fontWeight(.heavy)
            }
        }
    }
ContextMenuはViewを長押ししたとにメニューを表示する機能です。
画像を長押ししたらメニューが表示されるサンプルを作ってみます。
        Image("animal1").resizable().frame(width: 100, height: 100).aspectRatio( contentMode: .fit)
            .contextMenu {
                
                VStack {
                    Button {
                        print("削除")
                    } label: {
                        Image(systemName: "trash")
                        Text("削除")
                    }
                    Button {
                        print("保存")
                    } label: {
                        Image(systemName: "folder")
                        Text("保存")
                    }
                }
            }
ImagePickerを使って、写真アプリから選択した写真を画面に表示する機能を作ってみます。
UIViewControllerRepresentableを参照してImagePickerと言う構造体を作ります。
func makeUIViewController(context: Context) -> UIImagePickerController {
        
        let controller = UIImagePickerController()
        controller.sourceType = .photoLibrary
        controller.delegate = context.coordinator
        return controller
    }
func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {
        
    }
class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
        
        @Binding var shown : Bool
        @Binding var imgData: Data
        
        init(imgData1: Binding, shown1: Binding) {
            _imgData = imgData1
            _shown = shown1
        }
        
        func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
            shown.toggle()
        }
        
        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
            let image = info[.originalImage] as! UIImage
            
            imgData = image.jpegData(compressionQuality: 80)!
            shown.toggle()
        }
    }
 @Binding var shown : Bool
    @Binding var imgData: Data
    
    func makeCoordinator() -> ImagePicker.Coordinator {
        return Coordinator(imgData1: $imgData, shown1: $shown)
    }
@State var imageData = Data.init(count: 0)
    @State var shown = false
    
    var body: some View {
        
        VStack {
            
            if imageData.count != 0 {
                Image(uiImage: UIImage(data: imageData)!).resizable().frame(height: 300).padding().cornerRadius(20)
            }
            
            Button("Sheetを開く") {
                self.shown.toggle()
            }
            .sheet(isPresented: $shown) {
                Imageいかがでしたでしょうか。
今回はSwiftUIの基礎を学びながら簡単なアプリを作ってみました。
UIkitとの連携が主な内容となりました。
UIKitとの連携部分はコードの量が増えてしまいますが、一回覚えてしまえばパターンは同じような感じで実装できるので、SwiftUIメインでアプリを作るのも良さそうに感じました。
参考になる部分があれば幸いです。