先日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メインでアプリを作るのも良さそうに感じました。
参考になる部分があれば幸いです。