SwiftUIで画像をピンチで拡大する(UIImageView + UIScrollView)
SwiftUIで画像をピンチで拡大する(UIImageView + UIScrollView)方法です。
iOSのファイルアプリ(UIDocumentPickerViewController)を開いてドキュメントフォルダに保存したファイルを開く
iOSのファイルアプリ(UIDocumentPickerViewController)を開いてドキュメントフォルダに保存したファイルを開く方法です。
SwiftUIでObservableObjectの@publishedなプロパティとBindingする
SwiftUIでObservableObjectの@publishedなプロパティとBindingする方法です。
GithubのAPIを叩き、リポジトリの情報をリストに表示する。一番下までスクロールされたら追加で取得し、Indicatorも表示する
GithubのAPIを叩き、リポジトリの情報をリストに表示する。一番下までスクロールされたら追加で取得し、Indicatorも表示する方法です。
GithubのAPIを叩き、リポジトリの情報をリストに表示する。一番下までスクロールされたら追加で取得する
GithubのAPIを叩き、リポジトリの情報をリストに表示する。一番下までスクロールされたら追加で取得する方法です。
SwiftUIでViewModifierを使ってViewに影をつける
SwiftUIでViewModifierを使ってViewに影をつける方法です。 ViewModifierを使ってViewに影をつけています。
SwiftUIでFunctionBuilderを使ってViewに影をつける
SwiftUIでFunctionBuilderを使ってViewに影をつける方法です。 FunctionBuilderを使ってViewに影をつけています。
SwiftUIでText中の文字の太さや色を変える
SwiftUIで画像を丸く切り取り枠を付ける方法です。 150×200サイズに画像をリサイズして表示させています。 アスペクト比が異なる場合ははみ出た箇所を切り取って表示しています。
NavigationLinkを使用せずにプッシュ遷移する(.navigationDestination)
NavigationLinkを使用せずにプッシュ遷移する(.navigationDestination)方法です。
SwiftUIでButton内の画像やテキストの色を変えない
SwiftUIでButton内の画像やテキストの色を変えない方法です。 .buttonStyle(PlainButtonStyle()) を設定することでボタンを押した時の色を変えずに済みます。
SwiftUIでNavigationViewの戻るボタンを非表示にする
SwiftUIでNavigationViewの戻るボタンを非表示にする方法です。 navigationBarBackButtonHidden を false にすることで非表示にすることができます。
SwiftUIでNavigationViewを使いラージタイトルを表示する
SwiftUIでNavigationViewを使いラージタイトルを表示する方法です。 navigationTitle でタイトルを設定し、navigationBarTitleDisplayMode でサイズを指定しています。
SwiftUIで画像を丸く切り取り枠を付ける
SwiftUIで画像を丸く切り取り枠を付ける方法です。 150×200サイズに画像をリサイズして表示させています。 アスペクト比が異なる場合ははみ出た箇所を切り取って表示しています。
SwiftUIで画像をリサイズして表示する(clip)
SwiftUIで画像をリサイズして表示させる方法です。 150×200サイズに画像をリサイズして表示させています。 アスペクト比が異なる場合ははみ出た箇所を切り取って表示しています。
SwiftUIで画像を画像を丸く切り取る
SwiftUIで画像を画像を丸く切り取る方法です。 150✖︎150サイズに画像をリサイズし、丸く切り取って表示させています。 アスペクト比が異なる場合ははみ出た箇所を切り取って表示しています。
SwiftUIで画像をリサイズして表示する(fit)
SwiftUIで画像をリサイズして表示させる方法です。 150×200サイズに画像をリサイズして表示させています。 アスペクト比が異なる場合は余白を赤色で表示しています。
SwiftUIでマークダウンを表示する
SwiftUIでマークダウンを表示する方法です。 マークダウンのパースには swift-markdown を使用しています。 また Header(#) と テキストのみに対応しています。
SwiftUIでImageの色を反転させる
SwiftUIでImageの色を反転させる方法です。 .colorInvert() を追加することで色を反転させることができます。 SDWebImage/SDWebImageSwiftUI
SwiftでJSONをDictonaryでDecodeする
SwiftでJSONをDictonaryでDecodeする方法です。 Mapのような辞書配列をDictionaryのプロパティを持つstructでDecodeしています。
UserDefaultsで複数の値をセットで保存する
UserDefaultsで複数の値をセットで保存する方法です。 辞書型配列を使う方法と保存用のstructを作成する方法でサンプルコードを作成しました。 Set ボタンを押すと UserDefaults にカビゴンの情報が保存され、Get ボタンを押すとカビゴンの情報をコンソールに出力します。 辞書型配列を使う方法
Swiftでモーダル表示時にviewWillDisappearが呼ばれない
Swiftでモーダル表示時にviewWillDisappearが呼ばれないということが起きました。 以下のようにボタンを押したタイミングでフルスクリーンのモーダルが表示されるとします。 modalPresentationStyle を .fullScreen にすると viewWillDisappear と viewDidAppear がモーダル表示のタイミングで呼ばれますが、.overFullScreen にすると viewDidAppear しか呼ばれませんでした。 参考: iOSにおけるモーダル表示まとめ
SwiftでUICalendarViewを使ってカレンダーを表示する
SwiftでUICalendarViewを使ってカレンダーを表示する方法です。 iOS16からUICalendarViewというすごく便利なものが使えるようになりました。 参考: How to use UICalendarView in iOS
SwiftUIでUICalendarViewを使ってカレンダーを表示する
SwiftUIでUICalendarViewを使ってカレンダーを表示する。 iOS16からUICalendarViewというすごく便利なものが使えるようになりました。 今回はSwiftUIでUICalendarViewを使用し、数字をタップすると日付がコンソールに出力されます。 参考: How to use UICalendarView in iOS
SwiftUIでTODOアプリを作成する
SwiftUIでTODOアプリのサンプルを作成してみました。 Add Scheduleボタンを押すと予定入力画面が表示されます。 日付を押すと予定一覧画面が表示され、予定の一覧を確認することができます。
SwiftUIでカレンダーを作成する
SwiftUIでカレンダーを作成する方法です。 VStack と HStack を組み合わせて作成しました。 2023年2月24日追記 iOS16からUICalendarViewという便利なものが用意されたのでそれを使った方が良いかもしれません。 こちら の記事です。
SwiftUIでローカル通知を送信する
SwiftUIでローカル通知を送信する方法です。 ローカル通知であればサーバーを用意しなくてもプッシュ通知を送信することができます。 参考: 【SwiftUI】通知機能の実装方法!ローカル通知とリモート通知の違い
UICollectionViewでContextMenuを使う
UICollectionViewでContextMenuを使う方法です。 セルを長押しするとContextMenuを表示します。 参考: iOS13から追加されるContext Menusについて
Swiftのasync,awaitを使ってAPIをフェッチする
Swiftのasync,awaitを使ってAPIをフェッチする方法です。 従来のClosureを使った方法とasyncを使った方法です。
SwiftUIでObservableObjectの@publishedなプロパティとBindingをする
SwiftUIでObservableObjectの@publishedなプロパティとBindingをする方法です。 ここでは AddItemViewState まで ContentView の items をバケツリレーしています。
iOSのファイルアプリ(UIDocumentPickerViewController)を開いてドキュメントフォルダに保存したファイルを開く
iOSのファイルアプリ(UIDocumentPickerViewController)を開いてドキュメントフォルダに保存したファイルを開く方法です。 info.plist にファイルアプリでドキュメントディレクトリを開けるように Supports opening documents in place と Application supports iTunes file sharing を追加し、どちらも YES に設定します。
Swiftで複数のViewをドラッグで移動する
Swiftで複数のViewをドラッグで移動する方法です。 ViewController でタッチのイベントを検出し、PokemonViewであればViewを移動させています。 同時にContextMenuのinteractionも設定しています。
Swiftでドラッグで移動し、長押しでContextMenuを表示する
Swiftでドラッグで移動し、長押しでContextMenuを表示する方法です。 ViewController でタッチのイベントを検出し、その箇所にViewを移動させています。 同時にContextMenuのinteractionも設定しています。
Swiftでタップ、ドラッグした箇所にViewを移動させる
Swiftでタップ、ドラッグした箇所にViewを移動させる方法です。 ViewController でタッチのイベントを検出し、その箇所にViewを移動させています。
Swiftで配列からランダムに要素を取り出す
Swiftで配列からランダムに要素を取り出す方法です。 配列をシャッフルした後に先頭の要素を取得しています。 // 0, 1, 2, ... 9 の配列からランダムに5要素抽出する var numbers: [Int] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(numbers) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] // 配列をシャッフルする numbers.shuffle() print(numbers) // [1, 7, 9, 4, 6, 2, 0, 3, 8, 5] // .prefix を使い先頭の5要素を取得する。prefix の戻り値の型は Array<T> ではなく、ArraySlice<T> なので変換する必要がある。 let arraySlicedNumbers: ArraySlice<Int> = numbers.prefix(5) let slicedNumbers: [Int] = Array(arraySlicedNumbers) print(slicedNumbers) // [1, 7, 9, 4, 6]
Swiftで16進数を使う
Swiftで16進数を使う方法です。 0x を使うことで16進数を表現できます。(1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, 10, 11, 12, …, 19, 1a, 1b) 0x12 は10進数で18です。 let number: Int = 0x12 print(number) // 18
Swiftで桁数を指定する
e の後ろに桁数を指定することができます。 let number: Double = 123e2 print(number) // 12300.0 負の値にすると小数点にできます。 let number: Double = 123e-4 print(number) // 0.0123
Swiftで関数の引数にジェネリクスを使う
Swiftで関数の引数にジェネリクスを使う方法です。 以下のように記述することで、引数に Int でも String でも受け取ることが可能になります。 func createTuple<T>(a: T, b: T) -> (T, T) { return (a, b) } let stringTuple: (String, String) = createTuple(a: "Snorlax", b: "Ditto") print(stringTuple) // ("Snorlax", "Ditto") let intTuple: (Int, Int) = createTuple(a: 143, b: 132) print(intTuple) // (143, 132)
PlaygroundでViewのプレビューを表示する
PlaygroundでViewのプレビューを表示する方法です。 PlaygroundPage.current.liveView に表示したいViewを設定することでプレビューを表示できます。
SwiftでSetから要素を削除する
SwiftでSetから要素を削除する方法です。 remove を使うことで要素を削除することができます。 var mySet: Set = [1, 2, 3, 4] mySet.remove(3) print(mySet) // [1, 2, 4] 存在しない要素に対して remove しても例外は発生しません。 var mySet: Set = [1, 2, 3, 4] mySet.remove(6) print(mySet) // [4, 2, 3, 1]
SwiftUIで画像をピンチで拡大する(UIImageView + UIScrollView)
SwiftUIで画像をピンチで拡大する方法です。 UIImageViewとUIScrollViewを使って画像をピンチで拡大します。 他にはこのような方法があります。 SwiftUIで画像をピンチで拡大する(MagnificationGesture) SwiftUIで画像をピンチで拡大する(PDFView)
SwiftUIで画像をピンチで拡大する(PDFView)
SwiftUIで画像をピンチで拡大する方法です。 画像をピンチで拡大します。 他にはこのような方法があります。 SwiftUIで画像をピンチで拡大する(MagnificationGesture) SwiftUIで画像をピンチで拡大する(UIImageView + UIScrollView) 参考: Isn’t there an easy way to pinch to zoom in an image in Swiftui?
SwiftUIで画像をピンチで拡大する(MagnificationGesture)
SwiftUIで画像をピンチで拡大する方法です。 MagnificationGestureを使った方法で画像をピンチで拡大します。 ただこの方法ではドラッグすることができないので、他の方法にする必要があります。 他にはこのような方法があります。 SwiftUIで画像をピンチで拡大する(PDFView) SwiftUIで画像をピンチで拡大する(UIImageView + UIScrollView)
SwiftUIでMapViewを使い複数の位置情報を選択する
SwiftUIでMapViewを使い複数の位置情報を選択する方法です。 addボタンを押した位置情報を記録します。listボタンを押すとその位置情報の一覧を表示します。
MKMapViewで経路を表示する
MKMapViewで経路を表示する方法です。 新宿駅から秋葉原駅への経路を表示しています。 参考: 【Swift】MapKitで経由地点を含めたルートディレクションの表示方法
MKMapViewの表示範囲を設定する
MKMapViewの表示範囲を設定する方法です。 秋葉原駅(35.6984, 139.7731)を中心として緯度経度が±0.1となるように表示されます。 参考: 【Swift】MapKitで経由地点を含めたルートディレクションの表示方法
CollectionViewに区切り線を追加する
CollectionViewに区切り線を追加する方法です。 参考: UICollectionView の Layout で悩んだら Decoration Viewを用いてCollection Viewに区切り線と背景を追加する
CollectionViewの背景にスクロールする画像を設定する
CollectionViewの背景にスクロールする画像を設定する方法です。 よくわかっていないのですが、backgroundColor に画像を設定すると背景にスクロールする画像を設定できます。
UICollectionViewのサンプル
UICollectionViewのサンプルです。 makeColor() 関数でランダムに生成した色をセルに入れています。 スクロールするたびに色が変わります。
CollectionViewで並び替え時に選択されたセルにアニメーションを付与する
CollectionViewで並び替え時に選択されたセルにアニメーションを付与する方法です。 長押しすると移動できるようになります。 参考: iOS – Longpress drag and drop using UICollectionView with Animation
UICollectionViewのセルを並び替える
UICollectionViewのセルを並び替える方法です。 長押しすると移動できるようになります。 参考: CollectionViewの並び替えを実装する | RE:ENGINES
Xcodeで左側のファイル一覧のナビゲーションが隠れてしまって出てこない
Xcodeで左側のファイル一覧のナビゲーションが隠れてしまって出てこないときの方法です。 command + 0 で出したり引っ込めたりすることができます。
SwiftUIでさまざまなデバイスのプレビューを確認する
SwiftUIでさまざまなデバイスのプレビューを確認する方法です。 まず以下のコマンドでデバイスの一覧を確認します。 デバイス名は正確に入力する必要があります。 $ xcrun simctl list devicetypes == Device Types == iPhone 4s (com.apple.CoreSimulator.SimDeviceType.iPhone-4s) iPhone 5 (com.apple.CoreSimulator.SimDeviceType.iPhone-5) iPhone 5s (com.apple.CoreSimulator.SimDeviceType.iPhone-5s) iPhone 6 Plus (com.apple.CoreSimulator.SimDeviceType.iPhone-6-Plus) iPhone 6 (com.apple.CoreSimulator.SimDeviceType.iPhone-6) iPhone 6s (com.apple.CoreSimulator.SimDeviceType.iPhone-6s) iPhone 6s Plus (com.apple.CoreSimulator.SimDeviceType.iPhone-6s-Plus) iPhone SE (1st generation) (com.apple.CoreSimulator.SimDeviceType.iPhone-SE) iPhone 7 (com.apple.CoreSimulator.SimDeviceType.iPhone-7) iPhone 7 Plus (com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus) iPhone 8 (com.apple.CoreSimulator.SimDeviceType.iPhone-8) iPhone 8 Plus (com.apple.CoreSimulator.SimDeviceType.iPhone-8-Plus) iPhone X (com.apple.CoreSimulator.SimDeviceType.iPhone-X) iPhone Xs (com.apple.CoreSimulator.SimDeviceType.iPhone-XS) iPhone Xs Max (com.apple.CoreSimulator.SimDeviceType.iPhone-XS-Max) iPhone Xʀ (com.apple.CoreSimulator.SimDeviceType.iPhone-XR) iPhone 11 (com.apple.CoreSimulator.SimDeviceType.iPhone-11) iPhone 11 Pro (com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro) iPhone 11 Pro Max (com.apple.CoreSimulator.SimDeviceType.iPhone-11-Pro-Max) iPhone SE (2nd generation) (com.apple.CoreSimulator.SimDeviceType.iPhone-SE--2nd-generation-) iPhone 12 mini (com.apple.CoreSimulator.SimDeviceType.iPhone-12-mini) iPhone 12 (com.apple.CoreSimulator.SimDeviceType.iPhone-12) iPhone 12 Pro (com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro) iPhone 12 Pro Max (com.apple.CoreSimulator.SimDeviceType.iPhone-12-Pro-Max) iPhone 13 Pro (com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro) iPhone 13 Pro Max (com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro-Max) iPhone 13 mini (com.apple.CoreSimulator.SimDeviceType.iPhone-13-mini) iPhone 13 (com.apple.CoreSimulator.SimDeviceType.iPhone-13) ... 参考: previewDevice(_:)
iOS15でPickerを横に並べるとタップ領域が重なってしまう
iOS15でPickerを横に並べるとタップ領域が重なってしまう不具合に悩まされたのでその忘備録です。 以下の様なコードをiOS15の実機で実行し、左側の行を動かそうとすると右側の行が動いてしまいます。iOS14やシミュレーターでは問題なく動作します。 Pickerを複数並べると.clip()を使ってもタップ領域が広がってしまうって問題です!
SwiftUIでMapViewの中央に十字を用意し、その中央の座標を取得する
SwiftUIでMapViewの中央に十字を用意し、その中央の座標を取得する方法です。 MapViewが動いたタイミングでラベルの文字列が更新されます。
SwiftでMapViewの中央に十字を用意し、その中央の座標を取得する
SwiftでMapViewの中央に十字を用意し、その中央の座標を取得する方法です。 スクロールしたりピンチしたタイミングで regionDidChangeAnimated が呼ばれるので、その時の中心の座標を取得しています。
SwiftUIでPHPickerViewControllerを使って画像を選択する
SwiftUIでPHPickerViewControllerを使って画像を選択する方法です。 ImagePickerというクラスを使って実現しました。
SwiftでJSONエンコードするときに数字の桁数を指定する
SwiftでJSONデコードするときに数字の桁数を指定する方法です。 文字列になってしまいましたが、以下のように encode メソッドを書くことで桁数を指定します。 import Foundation struct MyStruct: Encodable { let number: Double enum CodingKeys: String, CodingKey { case number } func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(String(format: "%05f", number), forKey: .number) } } let myStruct = MyStruct(number: 1.0 / 3.0) let data = try! JSONEncoder().encode(myStruct) print(String(data: data, encoding: String.Encoding.utf8)!) {"number":"0.333333"}
Swiftの細かい文法のメモ
関数の引数は呼び出し側で省略したり、別名をつけたりすることができる。 func buyA(product: Int, price: Int, quantity: Int) { print(product, price, quantity) } buyA(product: 1200, price: 1500, quantity: 1) func buyB(_ product: Int, _ price: Int, _ quantity: Int) { print(product, price, quantity) } buyB(123, 123, 123) func buyC(a product: Int, b price: Int, c quantity: Int) { print(product, price, quantity) } buyC(a: 123, b: 123, c: 123) 関数が1行の場合は return を省略できる。 func messageA() -> String { return "Hello" } func messageB() -> String { "Hello" } return と同じ行に書いたコードは実行される。もちろんそれよりも下の行は実行されない。 func sayHello() { print("Hello") return print("XXX") print("YYY") } sayHello() Hello XXX Swift で GOTO 的なことをする。
Swiftで引数を参照渡しをする
Swiftで引数を参照渡しをする方法です。 まず普通に書いた場合です。 プログラム実行後 x = 2, y = 4 となります。 import UIKit let x: Int = 2 func double(num: Int) -> Int { return x * 2 } let y: Int = double(num: 2) print("x = \(x), y = \(y)") // x = 2, y = 4 Swiftで引数を参照渡しをする方法です。 inout で引数を参照私にすることができます。 プログラム実行後 x = 4, y = 4 となります。 import UIKit var x: Int = 2 func inoutDouble ( num: inout Int) -> Int{ num = num * 2 return num } let y = inoutDouble(num: &x) print("x = \(x), y = \(y)") // x = 4, y = 4
PHPickerViewControllerを使って画像を選択する
PHPickerViewController を使って画像を選択する方法です。 UIImagePickerController が将来的に非推奨になり PHPickerViewController に置き換わっていくみたいです。 参考: Meet the new Photos picker
SwiftUIでカメラを使う
SwiftUIでカメラを使う方法です。 録画を可能にする CameraView を作成しそれを SwiftUI 側で呼び出すようにします。 SwiftUIでカメラを使ったり、写真を保存するには色々とプライバシーの許可を Info.plist に設定する必要があります。 [Swift] AVFoundation による動画撮影の設定: カメラ種類 / ズーム / 録画時間 / 画質](https://superhahnah.com/swift-avcapture-settings/)
MapViewのタップした箇所に黒丸を描画する
MapViewのタップした箇所に黒丸を描画する方法です。 タップした箇所に黒丸を描画しています。黒丸のサイズは地図に対して相対的ではなく絶対的(地図を拡大すると黒丸も大きくなる)になります。 相対的なものにしたいときはMKPointAnnotationを使うと良いかもしれません。
複数の型を持つJSONをemumでDecodeする
複数の型を持つ JSON を enum を使って Decode する方法です。 とある API を叩くと JSON が返ってきますが、その中身がポケモンなのかトレーナーなのかジムリーダーなのかわかりません。 以下のコードのように enum の Character の中に Pokemon, GymLeader, Trainer を定義することで、どのような JSON が来ても Decode できるようになります。
自分で定義したStructをUserDefaultsに保存する
自分で定義したStructをUserDefaultsに保存する方法です。 そのままでは保存することができないので、一度 JSONEncoder で Data に保存してから保存します。
Identifiableに適合していないStructでListを使う
Identifiableに適合していないStructでListを使う方法です。 id でプロパティユニークとなるプロパティを指定することで List で使うことができます。
SwiftUIのTabViewのタブをコードから動的に切り替える
SwiftUIのTabViewのタブをコードから動的に切り替える方法です。 コードで動的にタブを切り替える方法です 参考: Programmatically change to another tab in SwiftUI
iOSでバージョンとビルド番号を取得する
iOSでバージョンとビルド番号を取得する方法です。 バージョンとビルド番号を文字列で取得します。 オプショナルで取得することになるので、if let でアンラップしてます。
SwiftUIでListにButtonを設定してパラメーターの違う画面に遷移する
SwiftUIでListにButtonを設定してパラメーターの違う画面に遷移する方法です。 詳細ページに遷移するような使い方を想定しています。
SwiftUIで少しカスタマイズしたActivityIndicatorを表示する
SwiftUIで少しカスタマイズしたActivityIndicatorを表示する方法です。背景色をつけたActivityIndicatorを表示したり隠したりしています。
Swiftでデフォルト引数を使う
Swiftでデフォルト引数を使う方法です。 favorite 関数に引数を渡さず呼び出すと "I love Snorlax が返り、任意の名前を渡すとその値が使われます。
SwiftUIでUIActivityViewControllerを表示する
SwiftUIでUIActivityViewControllerを表示する方法です。 ボタンを押すと URL を共有するシートを表示します。 参考: Showing ‘UIActivityViewController’ in SwiftUI
SwiftUIでSearchBar(TextField)にクリアボタンをつける
SwiftUIでSearchBar(TextField)にクリアボタンをつける方法です。 TextFiled に文字を入力するとポケモンを検索します。 そして右側のボタンを押すと TextField がクリアされます。 参考サイト SwiftUI: Add ClearButton to TextField
SwiftUIでSearchBar(TextField)を使って検索する
SwiftUIでSearchBar(TextField)を使って検索する方法です。 TextFiled に文字を入力するとポケモンを検索します。
SwiftUIのListの中にボタンを複数設置する
SwiftUIのListの中にボタンを複数設置する方法です。 buttonStyle(PlainButtonStyle()) を設定することできました。 参考サイト SwiftUI pick a value from a list with ontap gesture
SwiftUIのListでSpacerの部分にもタップ判定をつける
SwiftUIのListでSpacerの部分にもタップ判定をつける方法です。 .contentShape(Rectangle()) を設定することでタップ範囲を広げています。 参考サイト SwiftUI pick a value from a list with ontap gesture
SwiftUIでListをEditModeにして並び替える
SwiftUIでListをEditModeにして並び替える方法です。 UITableViewのEditModeのようにして並び替えることができます。 Listの中にforを定義する必要があります。最初ハマりました。
Swiftでプロジェクトの中に含まれるJSONファイルを読み込む
Swiftでプロジェクトの中に含まれるJSONファイルを読み込む方法です。 まずプロジェクトに読み込みたい JSON ファイルを追加します。 画像のように追加します。 追加した JSON ファイルの中身は以下です。 { "number": 143, "name": "Snorlax" } 次に追加した JSON ファイルをデコードするためのstructをJSON の中身に合わせて作成します。 ボタンを押すとプロジェクト中の pokemon.json を読み込み、Pokemon構造体にデコードし、State を更新させて文字列を表示しています。
SwiftUIでシートを表示し、プッシュ遷移後にシートを閉じる
SwiftUIでシートを表示し、プッシュ遷移後にシートを閉じる方法です。 遷移後のシートでもisPresentedの情報を保持するのがポイントです。
SwiftUIで初めの画面に遷移する(popToRootViewController)
SwiftUIで初めの画面に遷移する(popToRootViewController)方法です。 isDetailLink がポイントです。
SwiftUIのTextFieldで表示するキーボードを指定する
SwiftUIのTextFieldで表示するキーボードを指定する方法です。 keyboardType を指定することで表示するキーボードの種類を設定することができます。
QGridを使ってCollectionViewを実装する
QGridを使ってCollectionViewを実装する方法です。 iOS13のSwiftUIではCollectionViewに相当するものがありません。 QGridを使うことでCollectionViewに似たものを実装することができます。
SwiftUIでアラートを入れ子にして使うことができない
SwiftUIでアラートを入れ子にして使うことができなかったのでそのメモです。 以下のコードの様に HStack の中に VStack を入れ、それぞれに .alert を使うと内側の .alert がうまく動かなかったです。 .alert は入れ子にしない方が良さそうです。
SwiftUIでBMIを計算し、結果を別のViewで表示する
SwiftUIでBMIを計算し、結果を別のViewで表示する方法です。 身長と体重を入力し、計算ボタンを押すことで計算したBMIを表示しています。
@Stateと@Bindingの使い分け
@Stateと@Bindingの使い分けについです。 @State のついた変数を変更することでViewにその変更が反映されます。 以下の例ではボタンを押すことで 変数textの値を変えています。 変数textの値を変えることでその変更が反映され、文字列が変わります。
TableViewのセルを長押しでContextMenuを表示する
TableViewのセルを長押しでContextMenuを表示する方法です。 手軽にメニューが表示することができ、とても使い勝手が良いので積極的に使っていきたいです。
SwiftUIで複数のモーダルをEnumで出し分ける
SwiftUIで複数のモーダルをEnumで出し分ける方法です。 enumを使うことでスッキリと書くことができました。 iOS13では使えないので気をつけてください。
SwiftUIでフルスクリーンモーダルを表示する(iOS14以上)
SwiftUIでフルスクリーンモーダルを表示する方法です。(iOS14以上) いままでSwiftUIでフルスクリーンのモーダルを表示するのは大変でしたが、iOS14からはこの方法で表示することができるようになります。お手軽ですね。 iOS13でフルスクリーンモーダルを表示させたい場合はこの記事をご参照ください。 SwiftUIでフルスクリーンモーダルを表示する 参考: How to present a full screen modal view using fullScreenCover()
SwiftUIでモーダルを表示する時に値を渡す
SwiftUIでモーダルを表示する時に値を渡す方法です。 TextFieldでname変数に文字列を入力します。その入力した文字列をPokemonView に渡して表示しています。
Swiftで文字列を圧縮して保存し、そのデータを読み取る
Swiftで文字列を圧縮して保存し、そのデータを読み取る方法です。 zlib というアルゴリズムで文字列を圧縮し、保存しています。 Java の Deflater, Inflater に相当する方法ですが、header、チェックサムの情報が抜けている生のデータが保存されるので気をつける必要があります。 static void saveCompressedData() { try { // Encode a String into bytes String text = "hello"; byte[] data = text.getBytes(StandardCharsets.UTF_8); // Compress the bytes ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); DeflaterOutputStream outputStream = new DeflaterOutputStream(byteArrayOutputStream); outputStream.write(data); outputStream.finish() String path = "/Users/kabigon/Desktop/data.data"; try (FileOutputStream fos = new FileOutputStream(path)) { fos.write(byteArrayOutputStream.toByteArray()); } System.out.println("----------------------"); System.out.println("Save Completed!!"); System.out.println(String.format("Path: %s", path)); System.out.println("----------------------"); } catch (Exception e) { e.printStackTrace(); } } ---------------------- Java: [120, -100, -53, 72, -51, -55, -55, 7, 0, 6, 44, 2, 21] Swift: [-53, 72, -51, -55, -55, 7, 0] ---------------------- 参考: NSData > compressed(using:)
SwiftUIでAVAudioPlayerNodeで音楽を再生し、再生終了を検知する
SwiftUIでAVAudioPlayerNodeで音楽を再生し、再生終了を検知する方法です。 AVAudioPlayer は Delegate で再生終了を検知しますが、AVAudioPlayerNodeは再生終了時に呼ばれるハンドラーが用意されているのでそちらを使います。 参考: AVAudioEngine & AVAudioPlayerNode didFinish method like AVAudioPlayer
SwiftUIでAVAudioPlayerで音楽を再生し、再生終了を検知する
SwiftUIでAVAudioPlayerで音楽を再生し、再生終了を検知する方法です。 SwiftUIは struct を使うので AVAudioPlayerDelegate に準拠することができません。 そのため、ViewModel を作成し、SwiftUI(View)から呼び出してあげるます。 参考: AVAudioPlayerDelegate SwiftUI
AVAudioPlayerNodeを使って音楽の再生、一時停止、再生速度変更、ピッチ変更、ボリューム変更を行う
AVAudioPlayerNodeを使って音楽の再生、一時停止、再生速度変更、ピッチ変更、ボリューム変更を行う方法です。 AVAudioPlayerNodeはAVAudioPlayerではできないようなことができます。 たとえばピッチの変更などAVAudioPlayerでは実現することはできないので、AVAudioPlayerNodeを使う必要があります。
AVAudioPlayerを使って音楽の再生、一時停止、停止、ボリューム変更、再生速度変更を行う
AVAudioPlayerを使って音楽の再生、一時停止、停止、ボリューム変更、再生速度変更を行う方法です。 AVAudioPlayerを使うと簡単に音楽の再生などに関することするができます。 ただ AVAudioPlayer にできることは限られており、より複雑な操作をするためには AVAudioPlayerNode を使う必要があります。
SwiftUIでImageを長押しするとContextMenuを表示する
SwiftUIでImageを長押しするとContextMenuを表示する方法です。 アイコンが表示されているImageを長押しするとContextMenuが表示されます。 少しのコードを書くだけでリッチなUIが実現できて便利です。
ImageViewを長押しするとContextMenuを表示する
ImageViewを長押しするとUIMenuを表示する方法です。 アイコンが表示されているImageViewを長押しするとContextMenuが表示されます。 少しのコードを書くだけでリッチなUIが実現できて便利です。
SwiftUIでMapを表示してアノテーションを表示する
SwiftUIでMapを表示してアノテーションを表示する方法です。 iOS14からSwiftUIでMapKitを使えるようになりました。地図を表示するとかだけならSiwftUIで完結します。
Xcodeでプロジェクトを作成してGithubにプッシュする
Xcodeでプロジェクトを作成してGithubにプッシュする忘備録です。 まずプロジェクトを作成します。 作成したプロジェクトのフォルダを SourceTree にドラッグアンドドロップします。 gitignore.ioにアクセスして .gitignore を作成します。生成された .gitignore をリポジトリ限定無視リストに貼り付けます。 新しいリポジトリを作ります。 矢印のURIをコピーします。 SourceTreeの設定からリモートリポジトリを追加します。コピーしたURIを貼り付けます。
SwiftでSpringBootで作られたAPIに文字列を渡す
SwiftでSpringBootで作られたAPIに文字列を渡した時にちょっと詰まったのでそれの忘備録です。 @RequestMapping(value = "", method = RequestMethod.POST, produces = "application/json;charset=UTF-8") public SampleBean request(@RequestBody String text) { SampleBean sampleBean = new SampleBean(); sampleBean.setText(text); return sampleBean; } @Data public class SampleBean implements Serializable { private String text; } このような Bean を返すエンドポイントを作りました。curl コマンドでエンドポイントを叩くと以下のようなレスポンスが返ってきます。想定通りの挙動です。 curl "http://localhost:8080/sample" \ -X POST \ -H 'Content-Type: application/json' \ -d 'Kabigon' \ | jq { "text": "Kabigon" } 次にこのエンドポイントを Swift から叩きます。
UIAlertControllerの中でTextFieldを使い、文字数を制限する
UIAlertControllerの中でTextFieldを使い、文字数を制限する方法です。 このサンプルでは6文字以上入力できないようにしています。
SwiftUIでMapを使う。Mapにピンを立てる
SwiftUIでMapを使う。Mapにピンを立てる方法です。 UIViewRepresentableを使って MKMapViewをSwiftUIで表示しています。
画面内にPageViewControllerがあるウォークスルー画面を実装する
画面内にPageViewControllerがあるウォークスルー画面を実装する方法です。 一番最後のページを開くとボタンの色が変わります。
SwiftUIで端末のシェイクを検知する
SwiftUIで端末のシェイクを検知する方法です。 端末をシェイクすると Text 内の文字が変わります。 ReactNativeは端末をシェイクするとデバッグメニューが出てくるのが面白いです。
SwiftUIでAppStorageを使ってUserDefaultの値を監視する
SwiftUIでAppStorageを使ってUserDefaultの値を監視する方法です。 UserDefaultが変更されると画面が再描画されます。
SwiftUIでListの中に複数のNavigationLinkを設置する
SwiftUIでListの中に複数のNavigationLinkを設置する方法です。 素直に実装すると画面遷移が暴発してしまいます。 それを修正するために List のタップジェスチャーを無効化したりする必要がありました。
ディレクトリにあるwavファイルをcafに変換する
ディレクトリにあるwavファイルをcafに変換する方法です。ディレクトリに存在する全ての.wavファイルをcafファイルに変換したいときによく使います。
SwiftUIでVStackの周りに影をつける
SwiftでUIViewの周りに影をつける方法です。 ImageのViewの周りに影をつけています。 shadowOffset で影の位置を移動させることができ、サンプルコードでは影を右下に移動させています。
UIPageViewControllerでウォークスルー画面を実装する
UIPageViewControllerでウォークスルー画面を実装する方法です。 ウォークスルー画面はチュートリアルなどでよくありますね。
SwiftUIでViewの周りに影をつける
SwiftでUIViewの周りに影をつける方法です。 ImageのViewの周りに影をつけています。 shadowOffset で影の位置を移動させることができ、サンプルコードでは影を右下に移動させています。
Swiftで文章を読み上げる(音声合成)
Swiftで文章を読み上げる(音声合成)方法です。 AVFoundation を import し、以下のコードを書くことで iPhone に文字列を読み上げてもらうことができます。
SwiftUIでButton内の画像やテキストの色を変えない
SwiftUIでButton内の画像やテキストの色を変えない方法です。 .buttonStyle(PlainButtonStyle()) ではフルーツの一覧を表示しています。 フルーツが表示されたセルを押すと SecondView を設定することで実現できました。
SwiftUIで画面遷移時に値を渡す
SwiftUIで画面遷移時に値を渡す方法です。 ContentView ではフルーツの一覧を表示しています。 フルーツが表示されたセルを押すと SecondView に遷移し、選択されたセルのフルーツ名が表示されます。
GithubのAPIを叩き、SwiftUIでリポジトリを取得する。一番最後までいくと追加で取得しIndicator を表示する
GithubのAPIを叩き、リポジトリを取得する。一番最後までいくと追加で取得しIndicator を表示する方法です。 Infinite List Scroll with SwiftUI and Combine を参考にさせていただきました。
GithubのAPIを叩き、SwiftUIでリポジトリの情報をリストに表示する。一番下までスクロールされたら追加する
GithubのAPIを叩き、リポジトリの情報をリストに表示する。一番下までスクロールされたら追加する方法です。 Infinite List Scroll with SwiftUI and Combine を参考にさせていただきました。
GithubのAPIを叩き、SwiftUIでリポジトリの情報をリストに表示する(Combine)
GithubのAPIを叩き、リポジトリの情報をリストに表示する方法です。 Infinite List Scroll with SwiftUI and Combine を参考にさせていただきました。
GithubのAPIを叩き、SwiftUIでリポジトリの情報をリストに表示する(Closure)
GithubのAPIを叩き、SwiftUIでリポジトリの情報をリストに表示する方法です。 Infinite List Scroll with SwiftUI and Combine を参考にさせていただきました。
SwiftUIでアラートとシートを出し分ける
SwiftUIでアラートとシートを出し分ける方法です。 TextField に入力された文字列が Double に変換できるかチェックします。 もし Double に変換できるのであればシートを表示し、もし Double に変換できないのであればアラートを表示します。
curl で iOSにVoIPプッシュを送る
curl で iOSにVoIPプッシュを送る方法です。 まず VoIPプッシュ通知用の .p12 ファイルを .pem に変換します。 openssl pkcs12 -in file-name.p12 -out file-name.pem -nodes -clcerts .pem ファイルを使ってプッシュ通知を送ります。apple の URL は配布方法によって異なるので気をつけてください。 たとえば Xcode から実機に送ると以下の URL で良いですが、TestFlightやストアから配布する場合は URL 中の develop は不要です。 curl --http2 \ -E file-name.pem \ --header "apns-topic: {YOUR_BUNDLE_ID}.voip" \ -d "{\"message\":\"Hello\"}" \ https://api.development.push.apple.com/3/device/{YOUR_TOKEN}
SwiftUIでプログラムで前の画面に戻る
SwiftUI でプログラムで前の画面に戻る方法です。 NavigationView と NavigationLink を使うと画面遷移することができます。 戻るボタンは自動で付与されますが、戻るボタン意外の方法で前の画面に戻りたいときは、PresentationMode を使うことで実現できます。
Swiftで仮引数を持つイニシャライザをスマートに書く
Swiftで仮引数を持つイニシャライザをスマートに書く方法です。 仮引数がついたイニシャライザをもち、イニシャライズ時の値を定数として保持する Struct を作る時、private(set) var name = “snorlax” を使うと短くスマートに書くことができます。 プロパティが増えてもイニシャライザを編集する必要が無くなります。
UIAlertControllerでアラートを表示する
UIAlertControllerを使ってアラートを出すサンプルです。 UIAlertControllerStyle.alert を UIAlertControllerStyle.actionSheet にするとニュッと下から出るタイプのアラートになります。
SwiftUIのPreviewを横向きにする
SwiftUIのPreviewを横向きにする方法です。 Previewのサイズを変更することで実現しました。 Landscape Right, Landscape Left にチェックを入れアプリを横向きにします。 Previewのサイズを端末のサイズに変更します。
Buttonからプッシュ遷移をする(NavigationLinkを無効にする)
Buttonからプッシュ遷移をする方法です。 この方法であれば、NavigationLink を擬似的に無効にすることができます。
SwiftUIでNavigationBarを隠す
SwiftUI で NavigationBar を隠す方法です。 .navigationBarHidden(true) を設定すると隠すことができます。 理由は不明ですが、空文字で仮のタイトルを設定する必要がありました。
UIGestureRecognizer でジェスチャーイベントを取得する
UIGestureRecognizer でジェスチャーイベントを取得する方法です。 UITapGestureRecognizer, UIPinchGestureRecognizer, UILongPressGestureRecognizer, UISwipeGestureRecognizer などを使ってスワイプ、ピンチなどのイベントを取得することができます。
UIPickerViewを使って値を選択する
UIPickerViewを使って値を取得するサンプルコードです。 PIPickerViewは選択肢の中から要素を選ぶときによく使いますね。 今回は食べ物とドリンクとフードを選ぶアプリを作ってみました。
削除、セルの移動が可能なUITableViewを作る
削除、セルの移動が可能なUITableViewを作る方法です。 TableViewを使うと簡単に編集可能なTableViewを作ることができます。
よくあるチュートリアル画面をUIPageViewControllerとSwiftUIで作る
UIPageViewControllerとSwiftUIでよくあるチュートリアル画面を作ります。 画面をスワイプすると次の画面が表示されます。
UserDefaults に配列を保存してTableViewに表示する
UserDefaults に配列を保存してTableViewに表示する方法です。 FirstViewController のボタンを押すと UserDefaults に現在の時刻が文字列として保存されます。 SecondViewController を表示すると UserDefaults のデータが読み込まれ、テーブルに表示されます。
UINavigationBar, UITabBar の色を変える
iOSでUINavigationBar, UITabBar の色を変える方法です。 エヴァンゲリオンをイメージしたカラーリングです。今度のエヴァの映画が楽しみです。
UITabBarControllerにUINavigationControllerを入れ子で実装する
UITabBarControllerにUINavigationControllerを入れ子で実装する方法です。 ついでに色もカラフルにしてみました。
SwiftUIでUITestを動かす
SwiftUIでUITestを動かす方法です。 UIKit の時と違って sleep を入れないと良い感じに動かなかったです。 State が変わると際レンダリングが走るせいでしょうか?
SwiftUIで続きを読む。。。ボタンがあるViewを実装する
SwiftUIで続きを読む。。。ボタンがあるViewを実装する方法です。 背景を透明色にし、そのサイズを PreferenceKey で取得することで実現しています。
Swiftで録画開始とスクリーンショットが取られたことを検知する
Swiftで録画開始とスクリーンショットが取られたことを検知する方法です。 画面録画開始前に captureStatusDidChange を実行させることができるのですが、スクリーンショット撮影前に captureStatusDidChange を実行させることはできませんでした。 もしスクリーンショットを取られてしまっては不味いものがある場合、動画であれば DRM を使用したり、サードパーティーの ScreenShieldKit を使用する必要があります。
SwiftUIで閉じることができないモーダルを表示する
SwiftUIで閉じることができないモーダルを表示する方法です。 以下の記事の応用です、UIKit を使わないでもできるようになって欲しいです。 SwiftUIでフルスクリーンモーダルを表示する
SwiftUIでアプリ起動時に画面を遷移させる
SwiftUIでアプリ起動時に画面を遷移させる方法です。 登録の導線で途中離脱したらその途中から再開させるようなUXを実現させようとしました。 NavigationLink の isActive を使って遷移していますが、遅延時間を設定しないとアプリの挙動がおかしくなってしまうので気をつけてください。
FunctionBuilderを使ってViewに影をつける
FunctionBuilderを使ってViewに影をつける方法です。 FunctionBuilderとViewModifier、どっちを使うか迷う時が良くあります。 関連してこちらもどうぞ。 ViewModifierを使ってViewに影をつける
ViewModifierを使ってViewに影をつける
ViewModifierを使ってViewに影をつける方法です。 FunctionBuilderとViewModifier、どっちを使うか迷う時が良くあります。 関連してこちらもどうぞ。 FunctionBuilderを使ってViewに影をつける
SwiftUIでNavigationViewのタイトルやテーブルビューの背景を変える
SwiftUIでNavigationViewのタイトルやテーブルビューの背景を変える方法です。 TableView と UITextView の appearance を変更しました。
SwiftUI で文字列中にタップ可能なリンクを追加する
SwiftUI で文字列中にタップ可能なリンクを追加するを作成する方法です。 UIViewRepresentable と UITextView を使って実現しました。 Reference: UITextViewにタップ可能なリンクを挿入する
SwiftでPDFを作成する
Swift で PDF を作成する方法です。 PDFKit で簡単に PDF を作ることができました、素敵ですね。 参考: Creating a PDF in Swift with PDFKit
UIActivityViewControllerでText, JSON, PDFを共有する
UIActivityViewControllerでText, JSON, PDFを共有する方法です。 簡単にファイルが共有できて実装が簡単なので重宝しています。 画像、PDFなどは Data を渡しても認識しますが、JSON などは Data を渡しても認識しないので、ファイルパスを指定しています。
SwiftUIでListの要素を削除した入り増やしたりする
SwiftUIでListの要素を削除した入り増やしたりする方法です。 Closure で渡すのはあまりよくない気がします。 もっと良い方法がありましたら教えてください。
SwiftUIでキーボードをボタンで隠す
SwiftUIでキーボードをボタンで隠す方法です。 UIApplicationを拡張して実現しています。 SwiftUIでキーボードを下げる(非表示にする)方法
SwiftUIで複数行の文字列を入力する
SwiftUIで複数行の文字列を入力する方法です。 UIKitのTextViewを使って実現しています。 早く公式でTextView 相当のものが出て欲しいです。
SwiftUIで下からPickerを出す
SwiftUIで下から Picker を出す方法です。 下からモーダルのように表示させています。 Importing an image into SwiftUI using UIImagePickerController
SwiftUIでUIImagePickerControllerを使う
SwiftUIでSwiftUIでUIImagePickerControllerを使う方法です。 UIKit と同じように任意の画像を取得することができました。 Importing an image into SwiftUI using UIImagePickerController
SwiftUIでButton内の画像の色を変えない
SwiftUIでButton内の画像の色を変えない方法です。 デフォルトのままだと以下の画像のように色が青く変わってしまいます。 renderingMode(.original) と設定することで、元の画像の色が表示されました。
iOS13のModalPresentationStyleを全部試してみた
iOS13のModalPresentationStyleを全部試してみました。 PopPage モーダルのことを弊社弊部所では「おしゃれモーダル」と呼んでいます。
Swiftで動画の終了を検知する
Swiftで動画の終了を検知するサンプルです。 動画はこちらのサイトからお借りしました。 Hybrid Creative Movies SAKURA こちらのサイトを参考にさせて頂きました。 動画の再生 How to detect when AVPlayer video ends playing?
Swiftで動画を再生する
Swiftで動画を再生するサンプルです。 動画はこちらのサイトからお借りしました。 Hybrid Creative Movies SAKURA こちらのサイトを参考にさせて頂きました。 動画の再生
SwiftUIでSwiftUIでサイドメニュー(ハンバーガーメニュー)を表示する
SwiftUIでサイドメニュー(ハンバーガーメニュー)を表示するサンプルです。 ドラッグで消す箇所などいくつか妥協しました。もっと良いサイドメニューをかけたら再度記事を投稿します。 How To Create A Side Menu (Hamburger Menu) In SwiftUI
SwiftUIのListのSectionの色を変える
SwiftUIのListのSectionの色を変えるサンプルです。 Appearanceを使って背景色を変えている記事がいくつかありますが、以下の方法でもできました。 Remove/change section header background color in SwiftUI List
タップでセクション区切りのListViewにチェックを入れる
タップでセクション区切りのListViewにチェックを入れるサンプルです。 タップすることで State が変化し、✔︎を描画するようになります。
SwiftでCSVを集計する
Swift で CSV を集計する方法です。 まず前処理として、CSV ファイルを utf8 に変換する必要があります。 Mac の場合は Numbers で開き、CSV で保存すると上手く行きました。 $ swift main.swift
UIViewの背景をグリッドにしたり、ドットにしたりする
UIView の背景をグリッドにしたり、ドットにしたりする方法です。 今回は GridView という UIView のサブクラスを作り、ボタンを押すことでドットが切り替わるようにしました。
ReplayKitを使って画面を録音する
ReplayKit を使うと画面を録画することができます。 凄く簡単に使うことができる上に、マイクで実況?をしたりすることができます。 今回は動画として保存しましたが、WebRTC と組み合わせたりと、いろいろなことに使うことができます。
SwiftUIでUICollectionViewのようにViewを並べる
SwiftUI で UICollectionView のように表示する方法です。 Q-Mobile/QGrid というライブラリを使うと簡単です。 QGrid を参考にしながら書いてみました。 参考: Q-Mobile/QGrid
SwiftUIでFirestoreの画像を表示する
SwiftUI で Firestore の画像を表示する方法です。 UIImage は SDWebImage を使えば簡単に表示できますが、SwiftUI ではそれができません。 SDWebImage/SDWebImageSwiftUIを使って以下のように書いてみました。 もっと良い書き方がある気がします、これだとトークンも含めてキャッシュされちゃうような。。。 参考: iOS でファイルをダウンロードする SDWebImage/SDWebImageSwiftUI
SwiftUIのToggleの変更を検知する
SwiftUIのToggleの変更を検知し、print 文を実行します。 参考: How can I trigger an action when a swiftUI toggle() is toggled?
SwiftUIで複数行のPickerを作成する
UIPickerView のような複数行の Picker を作成する方法です。 UIPickerView と使い勝手がかなり異なり、戸惑いました。 参考: Multi-Component Picker (UIPickerView) in SwiftUI 追記 iOS15では compositingGroup を追記する必要があります。
SwiftUIのPickerでLabelを表示しない
SwiftUIのPickerでLabelを表示しない方法です。 labelsHidden を設定することで可能です。 参考: How to hide the label of a Picker, Stepper, Toggle, and more using labelsHidden()
SwiftUIでPicker を表示する
SwiftUI で Picker を表示するサンプルです。 複数行の場合はこちらです。 SwiftUIで複数行のPickerを作成する 参考: Is there a way to call a function when a SwiftUI Picker selection changes?
SwiftUI で画面遷移先の View から遷移元のメソッドを呼び出す
SwiftUI で画面遷移先の View から遷移元のメソッドを呼び出すサンプルです。 delegate を使ったのですが、Combine で書いた方がよいかもしれません。
MVPアーキテクチャを使ったサンプルアプリ
MVPアーキテクチャを使ったサンプルアプリです。 Unitテスト、UIテストも書きました。 以下のような数字を足し合わせるアプリです。 リポジトリはこちら↓ MVP-Sample
StoryboardsをiOS13以上のプロジェクトから削除する
Swift & Storyboard でファイルを作成します。 Main.storyboard を削除します。 Main storyboard file base name の項を削除する。 Application Scene Manifest -> Application Session Role -> Item0 -> Storyboard Name を削除する。 SceneDelegate.swift で表示する ViewController を設定します。 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } window = UIWindow(frame: UIScreen.main.bounds) let viewController = ViewController() window?.rootViewController = viewController window?.makeKeyAndVisible() window?.windowScene = windowScene } 参考 Creating Apps Without Storyboards in iOS 13
SwiftUI でアラートを表示する
SwiftUI でアラートを表示する方法です。 UIAlertController とはかなり書き方が異なります。 Property Wrapper の @State がまだ慣れません。
Swift5.1で追加されたFunctionBuilderを使ってStructを作る
Swift5.1で追加されたFunctionBuilderを使ってStructを作る方法です。 SwiftUI でも活躍していますね。
SwiftUIでリストを編集する
SwiftUIでリストを編集する方法です。 UITableView よりも短いコードで書くことができました。 参考: How to enable editing on a list using EditButton
TabViewを使って画面を切り替える(SwiftUI)
TabViewを使って画面を切り替えるサンプルです。 かなり簡単に書くことができますね。 TabView - SwiftUI | Apple Developer Documentation
Alamofireで受け取ったJsonをCodableを使ってパースする
お天気Webサービス(Livedoor Weather Web Service) の API を Alamofire から叩き、帰ってきた JSON を struct にパースする方法です。
SwiftUIでStructが使いまわされる
画面遷移をするたびに異なる ID を表示させたかったのですが、それができませんでした。(毎回同じ ID が表示される) onDisappear で id を再生成することで回避しました。 @State に変化が無い場合はキャッシュを使い回したりするということでしょうか? 勉強していきます!!
TableViewのセルの高さを変更する(Swift5.0.1)
TableView のセルの高さを変更する方法です。 一括で帰るときは .rowHeight を使い、個別に変えたいときは heightForRowAt を使うと実現できました。 サンプルコードはこちら。 https://github.com/takoikatakotako/swiswiswift-ios
iOSでUITest(E2Eテスト)を行う(Swift5.0)
Swift でUITest を行うサンプルコードです。 左右のテキストフィールドに数字を入れ、ボタンを押すとその積を計算するアプリを作りました。 そしてそのアプリのUITest を実装しました。 参考: 【Swift】初めてのUITest導入
RootViewController をアニメーション付きで切り替える(Swift4.2)
RootViewController をアニメーション付きで切り替えるサンプルコードです。 チュートリアルの後とかでの使用を想定しています。
ローカルのJsonファイルをParseしてテーブルビューに表示する(Swift4.2)
ローカルに追加したJsonファイルをパースし、TableViewに表示するサンプルコードです。 SwiftyJsonなどを使うともっと良い感じにかけますが、今回は使わないで書いてみました。
SwiftでUITestを導入(Swift4.2)
プロジェクトにUITestを追加します。 プロジェクト作成時に作らなかった場合は以下の画像の手順で追加することができます。 @testable import Swiswiswift(Swiswiswiftはプロジェクト名) と書くことで、テストクラスの中から参照できるようになります。 関数名の頭にtestと付けることで、テストとして実行できるようになります。
UITableViewでテーブルにアイテムを表示(Swift4.2)
UITableViewはリストのような形でテキストを表示するクラスです。データ一覧などを表示する時などに役立ちます。 UITableViewのクラス階層 NSObject ↑ UIResponder ↑ UIView ↑ UIScrollView ↑ UITableView AppleDeveloperリファレンスUITableView
NavigationControllerで画面遷移を行う(Swift4.2)
#Swift4.2 NavigationContorollerのサンプルコードです。 NavigationContorollerは横にニュッと動いて画面遷移をします。
NavigationControllerのRootを切り替える(Swift4.2)
`# Swift4.2` `setViewControllers`でNavigationControllerのRootを切り替えています。
ImagePickerControllerで画像を選択する(Swift4.2)
# Swift 4.2 Swift3の記事はこちら UIImagePickerControllerで画像の選択 iPhoneのフォトライブラリから画像を取得するサンプルプログラムです。 フォトライブラリから画像を選択するために、プロジェクトの info.plistにフォトライブラリを使用する旨を記述します。 これを書いておかないとUIImagePickerControllerは使えません。 キーの値は以下の値を使います。 NSPhotoLibraryUsageDescription TypeはStringでValueの中に使用理由を書きます。 使用理由を書かないと審査の時に落とされるらしいです。
UITableViewの中身をUISearchBarで検索する(Swift4)
#Swift4.2 UITableViewとUISearchBarを組み合わせたサンプルです。 ナビゲーションバーにある虫眼鏡を押すとSearchBarが現れ、そこに文字を入力することで検索結果が表示されます。 Swift3 での記事はこちら
アプリ使用中に位置情報を取得する
#Swift 4.2 アプリ使用中に緯度と経度を取得するサンプルコードです。 端末の緯度と経度が変わるとラベル文字列が更新されます。 参考 [iOS] 位置情報の取得 (Swift3編) 【CoreLocation】位置情報を取得する LocationManagerを使用する場合は、「位置情報を利用する目的」をInfo.plistに記載する必要があります。 起動中のみ位置情報を取得する場合 NSLocationWhenInUseUsageDescription このアプリは、マップで道案内するため、位置情報を取得します 常に位置情報を取得する場合 NSLocationAlwaysUsageDescription åこのアプリは、移動距離取得のため、常に位置情報を取得します 位置情報が変更されるとラベルに文字が表示されます。
Lifesumアプリのインタラクションが素敵だったので再現してみた
#Swift4.2 Lifesumというアプリの登録導線のインタラクションがとても素敵だったので再現してみました。 インタラクションの凄さと登録導線離脱率の相関が気になりますね。
押すとクニュっとするボタンを実装する
#Swift 4.2 押すとクニュっとするボタンのサンプルコードです。 iOSでよくあるマイクロインタラクションです。 僕はマイクロインタラクション大好きなんですが、エンジニアやデザイナーの自己満なんでしょうかね? わからんとです。
Alamofireを使ってAPIからJSONを取得する(Swift4.2)
古い記事(Swift3)は こちら Alamofireを使ってAPIからJSONを取得する #Xcode 10.1 #Swift 4.2 swiftの有名な通信ライブラリであるAlamofireとこれまたSwiftで有名なJSONを扱うライブラリであるSwiftyJSONを使って、 お天気APIから情報を取得するサンプルです。 今回のサンプルでは非同期でJSONを取得し、アラートを表示します。 ATS の設定も必要なのでお忘れなく。
SafeAreaを取得する
iPhoneXが登場したことで、iPhoneXのレイアウト(SafeAreaの取得)には気を使うようになりました。 SafeAreaはviewDidLayoutSubviews メソッド内で、safeAreaInsets プロパティを参照することで取得することができます。
iOSでバーコードを読み取る
Swiftでバーコードを読み取るサンプルコードです。 Swift 4.1 // 参考にさせて頂いたサイトです Swift 4でQRコードを読み取る AVFoundation(AVCaptureMetadataOutput)でバーコードリーダーを作ってみた まず、info.plistに Privacy - Camera Usage Description のキーを追加し、使用理由を記述します。 「バーコードリーダー読み込みます」などなど。 この文言は使用許可を求める時に表示されます。
流れるように動く背景を実装する
私が作っている4択化学というアプリの背景の実装方法をたまに聞かれるので、それのサンプルコードを書きました。 アプリのアイコン画像がViewの背景を流れます。 またviewDidLoadにアニメーション関係のメソッドを書くと、NavigationBarの遷移によりアニメーションが止まってしまうことがあります。 その場合はアニメーション関係のメソッドをviewWillAppearに書き出すことで解決します。
UITabBarControllerにUINavigationControllerを入れ子で実装する
UITabBarControllerにUINavigationControllerを入れるコードです。 UITabBarControllerにUINavigationBarControllerを入れて実装しています。 新しい記事があります。 UITabBarControllerにUINavigationControllerを入れ子で実装する
UITabBarControllerを実装する
Viewの切り替えに使われるUITabBarControllerを実装サンプルです。 UITabBarControllerのアイコンは30×30の透過pngです。
Asset CatalogでColor Setを使って色を管理する
Xcode9(iOS 11)から、色をAssetで管理することができるようになりました。 UIColorのExtensionを作って色を登録して関数作ったりしてごにょごにょしなくて良くなりました。 色の管理がしやすくなりましたし、デザイナーさんとの連携もちょっとしやすくなったのかな?って思いました。 とても良い機能なんですが、iOS11以上でしか動かないので注意が必要です。 Deployment Targetを11.0以上にしないと警告が出ます。 Assetを開いて右クリック -> 「New Color Set」を選択 ここでは「original」という名前で濃い緑色を登録
UIViewの背景をグラデーションさせる
UIViewの背景をグラデーションさせるサンプルコードです。 参考にさせていただいたページ 【Swift x iOSアプリ開発】Viewの背景色にグラデーションを設定する方法 Swift UIViewの背景をグラデーションさせる方法 -iPhoneアプリ開発-
カスタムボタンクラスを実装する
UIButtonを拡張したカスタムボタンクラスを作成して貼り付けるサンプルコードです。 見た目を別ファイルに切り分けることでViewControllerがすっきりします。
TableViewを編集してCellを削除する(横スライド)
TableViewを編集してCellを削除するサンプルコードです。 以下の関数を追加することで、セルを横スライドで削除できる機能を付けることができます。 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath)
TableViewを編集してCellを削除する
TableViewを編集してCellを削除するサンプルコードです。 NavigationBarに編集ボタンを追加し、そのボタンを押すことでセルを削除することができます。 NavigationControllerについてはこの記事を参考にしてください。 NavigationControllerを実装する
数字を三桁ごとにカンマ区切りにする(日本円の表示)
日本円を表示するときのように3桁ごと,で区切る方法を調べてみました。 123,456,789円 みたいな感じです。 参考に指せて頂いた記事 [Swift]数字を三桁ごとにカンマ区切りにする
現在の日付と曜日、現在時間を取得する
Swift4.1で現在の日付と曜日、現在時間を取得するサンプルコードです。 以下の形式の文字列で取得してくれます。 2018/04/03 (木) 19:03:34 上のような形式で取得するサンプルコードです。 Calendar.currentで取得すると、設定によっては和暦(平成〇〇年)で取得してしまう可能性があるので(2018/04/03が欲しいのに30/04/03が帰ってくる)、グレゴリオ暦で取得する方が無難です。 逆に和暦が欲しいときは和暦で取得する方法もあります。 このサイトが詳しいです。 Swift 3 の日時操作チートシート その他参考にさせていただいたサイト Swift3での日時に関する処理 【Swift3】現在時刻の取得とDataFormatterでの文字列化
CustomTableViewCellとaccessoryViewを使ってTableVIewのレイアウトをカスタマイズ
CustomTableViewCellを作ると好きなレイアウトのCellをTableViewで使うことができます。 そしてTableViewCellのアクセサリービューにはUISwitchやチェックマークなどのアクセサリをつけることができます。 今回はその両方を使ったサンプルコードです。 参考にさせて頂いたウェブサイト [Swift]UITableViewCellのaccessoryViewでaccessoryButtonTappedForRowWithIndexPathが来ない件の対応
文字列やURLからQRコードを生成する
文字列やURLからQRコードを生成するサンプルコードです。 This is a sample code that generates a QR code from a character string or URL. これらの記事を参考にさせていただきました。 CIImageをData型に変換したときにハマった時の対処法(Swift3.0) SwiftでQRコードを生成してみた 生成したQRコードはこちらです。
UIAlertControllerでアラートを表示する
UIAlertControllerを使ってアラートを出すサンプルです。 UIAlertControllerStyle.alert をUIAlertControllerStyle.actionSheet にするとニュッと下から出るタイプのアラートになります。
UIAlertControllerで下からニュッと出す(UIActionSheet)
下からニュッと出てくるアラートはUIAlertControllerを用いて実装します。 遥か昔、下からニュッと出てくるアラートはUIActionSheetなんて呼ばれている時期もありましたが、UIAlertControllerに統合されました。
UserDefaultsを使ってパラメーターを保存する
UserDefaultsはアプリを落としても保持しておきたいデータを保存するときに使います。 使い方はいたってシンプルです。 サンプルコードでは、まず最初に userDefaults.register(defaults: ["KEY_LabelText": "Hello"]) で初期値を設定しています。 .register() はとても便利で、指定したキーに対応するデータが存在しない場合に、初期値を入れてくれます。 次にラベルにUserDefaultで保存した値を読み取り、ラベルのテキストに反映。 そしてボタンを押されたらuserdefaultsとラベルの値を更新しています。
UIPickerViewを使って値を選択する
はいどーも! UIPickerViewを使って値を取得するサンプルコードです。 PIPickerViewは選択肢の中から要素を選ぶときによく使いますね。 今回は食べ物とドリンクとフードを選ぶアプリを作ってみました。 新しい記事は こちら AppleDeveloperDocuments UIPickerView
カスタムレイアウトを持つコレクションビューをつくる
今作成しているアプリに画像が入れ子となったデザインをつくることになったので、実装方法について調べました。 主なコードは以下のサイトを参考にさせていただきました。 本当にありがとうございました。 Swift2->4の変換は大変でした。。。 iOS UICollecionViewFlowLayout でカスタムレイアウトを作ろう ~ Swift版
SwiftでUDP通信を行い、文字列を送る
SwiftでUDP通信するメモです。 SwiftSocket をcocoapodsで入れて、こんな感じで書きました。 woom-02と通信するのに使いました。
Swift3からSwift4への移行時に出る@objc inference warningsを消す
Xcode8からXcode9へ乗り換えてSwift4へ変換すると以下のエラーが出ます。それの消し方です。 The use of Swift 3 @objc inference in Swift 4 mode is deprecated. Please address deprecated @objc inference warnings, test your code with “Use of deprecated Swift 3 @objc inference” logging enabled, and then disable inference by changing the "Swift 3 @objc Inference" build setting to "Default" for the "TargetName" target. 各ターゲットを選択 -> Build Settings -> 検索窓で inference と検索 -> Swift @objc inference を Default に設定する 他にもターゲット(UITest,UnitTest)がある場合はそれも Default に設定する。 これで消えるはずです!
UICollectionViewにCustomセルを追加する
UICollectionViewにCustumCollectionセルを追加してみました。 クラス名を文字列に変換する NSStringFromClass(CustumCollectionViewCell.self) は、UITableViewやUICollectionView を使うときにとても便利です。
UICollectionView
新しい記事 があります。 UICollectionViewのサンプルです。 UICollectionViewを使う を参考にさせていただきました。 このサイトは見やすくて、swiftをやる人にとてもオススメです。 makeColor() 関数でランダムに生成した色をセルに入れています。 スクロールするたびに色が変わります。
Alamofireを使ってAPIからJSONを取得する
新しい記事(Swift4)はこちらAlamofireを使ってAPIからJSONを取得する(Swift4.2) swiftの有名な通信ライブラリである Alamofire とこれまたSwiftで有名なJSONを扱うライブラリであるSwiftyJSONを使って、お天気API から情報を取得するサンプルです。 今回のサンプルでは非同期でJSONを取得し、アラートを表示します。
delegateで別のViewからメソッドを呼び出す
あるViewから他のViewControllerにある関数などを実行するデリゲートのサンプルです。 今回はモーダル表示したViewから、元々いたViewの背景色をデリゲートを使って変えています。
Swiftでクラス名と関数名と行番号を取得、表示する
「ここは動いたらヤバい!」的な箇所に書くとでデバックが捗ります。 クラス名と行番号、取得表示することができます。 print("Class name : \(NSStringFromClass(type(of: self))) ") print(#function, #line)
UIImagePickerControllerで画像の選択
iPhoneのフォトライブラリから画像を取得するサンプルプログラムです。 フォトライブラリから画像を選択するために、プロジェクトの info.plist にフォトライブラリを使用する旨を記述します。 これを書いておかないとUIImagePickerControllerは使えません。 キーの値は以下の値を使います。 NSPhotoLibraryUsageDescription Typeは String でValueの中に使用理由を書きます。 使用理由を書かないと審査の時に落とされるらしいです。 下の画像のような感じです。 コードは以下のようになります。
UIStatusBarを白くする
UIStatusBarを白くする方法についてです。 UIStatusBarを白くする方法その1 UIStatusBarを白くする方法その1です。特定のViewControllerを白くする方法です。白くしたいUIViewControllerに書きます。 NavigationController以下にあるStatusBarはこの方法では白くはなりませんので注意してください。 UIStatusBarを白くする方法その2 全てのStatusBarを白くする方法です。 プロジェクトのターゲットのinfoに[Status bar style]と[UIStatusBarStyleLightContent]、[View controller-based status bar appearance]と[NO]を追加します。NavigationController以下にあるStatusBarも白くなります。 わかりやすいようにViewの背景色をオレンジにしています。
UITableViewとUISearchBar
UITableViewとUISearchBarを組み合わせたサンプルです。 ナビゲーションバーにある虫眼鏡を押すとSearchBarが現れ、そこに文字を入力することで検索結果が表示されます。 UITableView 基本的なテーブルビューの例文を以下に示します。
UserNotification(LocalNotification)
UserNotificationはユーザーに対して通知を発行する時に使用します。 UserNotificationは大きく分けて二種類あり、外部から通知を発行できるRemoteNotification(LineやTwitterのような通知)とLocalNotification(時計アプリなどの内部的に発行する通知)があります。 ここではLocalNotificationを取り扱います。 UserNotificationサンプル 初めにオリジナル通知音の発行に使用する音データ(.cafファイル)をプロジェクトに登録します。 .caf ファイルをプロジェクトに追加し、BundleResoucesに登録されていることを確認します。 また使用したcafファイルはこちらです。 UserNotificationの仕様として、使用するオリジナル通知音に不具合がある場合、デフォルトの通知音が再生されます。
音声認識(SFSpeechRecognizer)
iOS10からSpeech Frameworkが登場しました。 ここではSFSpeechRecognizerを使って音声認識をしてみようと思います。 そしてシミュレーターでは動かないから気をつけてください。 参考: AppleDeveloper:SpeakToMe: Using Speech Recognition with AVAudioEngine 参考: あたも開発ブログ 参考: 【iOS 10】Speechフレームワークで音声認識 – 対応言語リスト付き プライバシー設定をinfo.plistに記入 iOS10になってから、プライバシーに関する機能(通知、カメラ、フォトライブラリへのアクセス)を使う際に、Info.plistにあらかじめ使うことを書いておかないとアプリが落ちてしまうようになりました。 音声認識機能を使う場合は以下のプライバシー設定を行う必要があります。 参考: アプリ開発ブログ(仮) info.plistを開き、Privacy – Speech Recognition Usage DescriptionをStringで追加し、右側に使用目的を記入します。 Privacy – Microphone Usage Description to practice programingもまたStringで追加し、右側に使用目的を記入します。 使用目的が書かれていないと審査で落とされるらしいです。 サンプルコード 音声認識の結果をAlertで表示するプログラムです。
UITextField
UITextFieldは文字の入力に使われます。 UITextFieldのクラス階層 NSObject ↑ UIResponder ↑ UIView ↑ UIControl ↑ UITextField AppleDeveloperリファレンスUITextField UITextField例文 UITextField、生成し、ボタンが押されるとUITextFieldから文字列を取り出してラベルにコピーします。
UINavigationBar
iOSアプリの画面上部によく使われているUINavigationBarについてです。 UINavigationBarのクラス階層 NSObject ↑ UIResponder ↑ UIView ↑ UINavigationBar AppleDeveloperリファレンスUINavigationBar UINavigationBar例文 UINavigationBarを生成し、タイトルとボタンを付けます。
UILabel
UILabelクラスは文字表示を管理するクラスです。画面に文字を表示させたい時に使用します。 UILabelのクラス階層 NSObject ↑ UIResponder ↑ UIView ↑ UILabel AppleDeveloperリファレンス UILabel UILabelサンプル サンプルコード
UITableView
UITableViewはリストのような形でテキストを表示するクラスです。データ一覧などを表示する時などに役立ちます。 UITableViewのクラス階層 NSObject ↑ UIResponder ↑ UIView ↑ UIScrollView ↑ UITableView AppleDeveloperリファレンスUITableView UITableView
UIButton
UIButtonクラスはボタンを設置するためのクラスです。 ボタンタップでアクションを起こすことができます。 UIButtonのクラス階層 NSObject ↑ UIResponder ↑ UIView ↑ UIControl ↑ UIButton AppleDeveloperリファレンスUIButton UIButton例文 様々なUIButtonのサンプルです
UIBarButtonItem
UINavigationBarの要素追加、カスタマイズに用いられるUIBarButtonItemについてです。 UIBarButtonItemのクラス階層 NSObject ↑ UIBarItem ↑ UIBarButtonItem AppleDeveloperリファレンスUIBarButtonItem UIBarButtonItem例文 UINavigationBarを生成し、タイトルとボタンを付けます。
