- 1. FlutterでQiitaのアプリを作ってみる その1
- 2. ElixirDesktop iOS でカメラ撮影【2023年3月版】
- 3. (Flutter)Google Maps PlatformのiOS用APIキーの隠蔽と利用
- 4. 【UIKit】コードからAutoLayoutでSafeArea対応させる方法
- 5. 【SwiftUI】ダブルタップを検知する
- 6. SwiftUI+TCAで作るリアルタイム検索機能:debounceを使って効率的な検索を実現しよう
- 7. Swift Package プラグインの全体像
- 8. Swift モーダル画面が閉じたことを検知する方法
- 9. Swift × Realmでおしゃれなメモアプリを作ってみようの巻
- 10. 【SwiftUI】外観モードを固定する
- 11. SwiftのUIPanGestureRecognizerで移動制限をつける
- 12. EffectTaskのtask/run/fireAndForgetメソッドの使い分け
- 13. 【Swift×テスト自動実行】0からGithub Actions を使ってiOSアプリのテストコードを自動実行
- 14. 【Mac】スプリットビューを使用して快適に開発する
- 15. ARKitでGPSを使ってARを表示する(ARKit, RealityKit, CoreLocation)
- 16. 【Xcode】キーボードショートカットを割り当てる
- 17. preferredVideoStabilizationModeが効かないのだが????
- 18. アプリ内でSafariを起動する
- 19. 【個人開発】iosアプリ「Custom Wall Clock」をリリースしました
- 20. 【SwiftUI】よくある感じのくるくるインジケーター
FlutterでQiitaのアプリを作ってみる その1
最近の案件ではwebばかりで久々にモバイルアプリ開発をやりたくなった
とはいえ作りたいものがあるわけでもないので、勉強がてら[Qiita API](https://qiita.com/api/v2/docs)を使って適当なアプリを作っていく過程を記録する少し前にswift/kotlinでそれぞれのOSの開発をやっていたがFlutterは今回初めて使います。
間違えとかあれば教えてください## 環境準備
[Flutter](https://docs.flutter.dev/get-started/install/macos)のSDKに関してはdocument通り。 `flutter doctor` でエラーが出ないところまでやる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3077916/0cfc4189-109f-6abb-9e3d-e099026a6ddf.png)
久々にXcode落としたけど重いですね…
ひとまずflutterの準備は終わったのでアプリ作成
“`s
ElixirDesktop iOS でカメラ撮影【2023年3月版】
## はじめに
半年くらい前(2022年9月)に以下の記事を書きましたが、すっかりモバイルから離れていたので改めて最新版で同じことをしてみます
https://qiita.com/RyoWakabayashi/items/554a88cb35f24ec594ca
## 実行環境
– 開発環境・デスクトップ版実行環境
– macOS Ventura 13.2.1
– モバイル版実行環境
– iPhone SE 第2世代
– iOS 16.3.1## 実装コード
デスクトップ用
https://github.com/RyoWakabayashi/elixir-desktop-camera-20230305
iOS用
https://github.com/RyoWakabayashi/elixir-desktop-camera-ios-20230305
## デスクトップ版
### デスクトップ版準備
公式のサンプルコードをベースにしていきます
https://github.com/elixir-desktop/desktop-example-a
(Flutter)Google Maps PlatformのiOS用APIキーの隠蔽と利用
google_maps_flutterをiOSで使う場合、Google Maps Platformから発行されたAPIキーをAppDelegate.swiftに書き込む必要があります。
https://pub.dev/packages/google_maps_flutter#iosただ、
– APIキーをswiftコードにハードコーディングするのは嫌
– Android側と設定ファイルをひとつにまとめておきたいの両方を実現する方法がなかなか見つからず苦戦しました。
(実際にはSwiftやiOSアプリ開発への知識が皆無だったため遠回りした感はありますが)
また、日本語記事の情報がほとんど見つからなかったので、非常に簡記ながら投稿しておくことにしました。Android側の設定については、既にdart-define-from-fileを使っていました。
dart-define-from-fileの使い方は、[このサイト](https://zenn.dev/altiveinc/articles/separating-environments-in-flutter#ios%E3%82
【UIKit】コードからAutoLayoutでSafeArea対応させる方法
AutoLayoutで配置したViewが画面上部のStatusBarなどに被らないよう、SafeAreaに対応させる方法を紹介する。
# anchorで設定する方法
“`swift
myView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
“`
– 対応させたいViewのanchorに`safeAreaLayoutGuide`のanchorを設定する。
– 基本的にはこの方法で良いと思われる。
# 画面の端からSafeAreaの広さ分スペースを空ける方法“`swift
myView.topAnchor.constraint(equalTo: view.topAnchor, constant: view.safeAreaInsets.top).isActive = true
“`
– equalToにはviewのanchorを設定しておき、そこからconstantに設定した値の分スペースを空ける。
– `safeAreaInsets
【SwiftUI】ダブルタップを検知する
# はじめに
SwiftUIでダブルタップを実装する機会があり、調べると案外簡単に実現できました。
記録しておきます# 実装
“`swift
.onTapGesture(count: 2) {
// 処理…
}
“`# おわり
`count`を増やすことでトリプルタップなども実現できそうです。
想像以上に簡単でびっくりしました。
SwiftUI+TCAで作るリアルタイム検索機能:debounceを使って効率的な検索を実現しよう
# はじめに
SwiftUIとTCA (The Composable Architecture) を使用して、リアルタイム検索機能を実装する方法について説明します。本記事では、TCAのアーキテクチャについての基本的な知識があることを前提に進めていきます。# リアルタイム検索
検索機能を実装する上で重要なのは、ユーザーが素早く目的の情報を見つけられるようにすることです。そのためには、ユーザーが入力した検索キーワードに合わせて、リアルタイムに検索結果を返すことが必要です。しかし、ユーザーが入力するたびに検索処理を実行してしまうと、端末やサーバーに負荷がかかってしまうことがあります。# debounce
そこで、debounceを使って、一定時間以内に連続して入力された場合には、最後に入力されたキーワードを検索キーワードとして採用し、それ以外の場合には検索処理を実行しないようにします。これにより、検索処理を効率的に実行することができます。# コード例
実際にSwiftUIとTCAでdebounceを使った検索機能を実装するには、以下のようなコードを書きます。“`swift
Swift Package プラグインの全体像
## 概要
Swift 5.6 から Swift Package にプラグインが追加され、 SPM から外部ツールの実行を含めた色々な処理ができるようになりました。 Swift 5.8 の時点では以下2種類のプラグインがサポートされています。
– ビルドツールプラグイン
– コマンドプラグインこの記事では、まだプラグインに触れたことがない方でも、それぞれのプラグインで何ができて何ができないのかがだいたい理解できるようにまとめます。プラグインの実装方法の詳細などはこの記事では扱わないことにします。
## TL;DR
| | ビルドツールプラグイン | コマンドプラグイン |
| — | — | — |
| 実行タイミング | ビルド時 | 手動 (CLI / IDE から) |
| 利用例 | ・swiftgen や swift-protobuf などを使ったコード生成
・swiftlint などを使った lint | ・docc などを使ったドキュメント生成
・swift-format や swiftlint などを使ったコードフォーマット |
Swift モーダル画面が閉じたことを検知する方法
iOS13から特定のスタイルでモーダル遷移をすると画面を閉じた際、 遷移元のライフサイクルメソッドが発火されない仕様になったのを今更知知りました。
画面を閉じた際、遷移元のviewWillAppearで画面表示時に毎回ある処理をさせたかったのですが、モーダルを閉じた際の検知で代用することにしました。閉じた際の検知はUIAdaptivePresentationControllerDelegateのpresentationControllerDidDismissメソッドを使って特定できるみたいです。
https://developer.apple.com/documentation/uikit/uiadaptivepresentationcontrollerdelegate/3229889-presentationcontrollerdiddismiss
中身としては以下のように画面遷移する際にpresentationControllerのdelegateを自身にセットします。
“`swift
// 遷移元コード全体
class ViewController: UIViewC
Swift × Realmでおしゃれなメモアプリを作ってみようの巻
# 概要
この記事は、Realmを使ったTODOメモアプリの作成記録です。CRUDとは何か簡単に説明できる人向けになるので、全くの初心者の方は「CRUD」の意味を調べてから臨むようにしてください?
## 開発環境
|項目||
|—|—|
| PC | MacBook Air 2017 |
| IDE | Xcode Ver. 12.4|
|言語| Swift 5 |
|データベース| Realm |#目次
1.主な流れ
2.いざ開発!!
3.コードの全容
4.Storyboard
5.終わりに# ?何するのー?
## ■やること
Realmを使った簡単なアプリ作成
ちなみにRealm=レルムです?## ■What We Learn
– Realmの基本的な実装を理解できる
– NCMBよりもう一段階データベースを深く学べる## ■Realmを使うメリット
– 保存したデータをローカル環境で可視化できる(userDefaultsとの違い)
– 世界中で使われているので参考ドキュメントが豊富(英語中心だけど?)## ■主な流れ
– プ
【SwiftUI】外観モードを固定する
# はじめに
iPhoneにはライトモードやダークモードに二種類が存在します。
アプリによってはダークモードにさせたくない場合などあると思います。
そんな時に使えるモディファイアを紹介します# ライトモード固定
“`diff_swift
struct ContentView: View {
var body: some View {
VStack {
Image(systemName: “globe”)
.imageScale(.large)
.foregroundColor(.accentColor)
Text(“Hello, world!”)
}
+ .preferredColorScheme(.light)
}
}
“`# ダークモード固定
“`diff_swift
struct ContentView: View {
var body: some View {
VStac
SwiftのUIPanGestureRecognizerで移動制限をつける
## はじめに
今回はUIPanGestureRecognizerを使って、Viewをドラッグすると動くようにします。その際に、決めた範囲からViewが出ないように制限をつけてみました。
## やり方
まずは、UIPanGestureRecognizerを使ってViewがドラッグした位置に動くように実装します。
100×100の背景色赤の正方形をViewに追加し、UIPanGestureRecognizerを設定します。※今回は分かりやすくするためにy軸方向にしか動かない形で実装します
“`swift:qiita.swift
class ViewController: UIViewController {
let squareView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
override func viewDidLoad() {
super.viewDidLoad()
squareView.backgroundColor = UIColor.
EffectTaskのtask/run/fireAndForgetメソッドの使い分け
Reducerで非同期処理を実行するためのツールとして、EffectTaskには3つのstaticメソッドが用意されています。
使い分けのポイントとしては以下のようになります。
| メソッド | 用途 |
|:-:|:-:|
| `task(priority:operation:catch:)` | 1つのActionをSendする |
| `run(priority:operation:catch:)` | 0または1つ以上のActionをSendする |
| `fireAndforget(priority:_:)` | ActionをSendしない |# `task(priority:operation:catch:)`
`task`では、以下のようにActionをreturnする必要があります。
returnする前に、複数の非同期処理を実行可能です。“`swift
return .task {
try await operation1()
try await operation2()
return await .fetchResponse(TaskRes
【Swift×テスト自動実行】0からGithub Actions を使ってiOSアプリのテストコードを自動実行
# 目的
GithubにPush(※1)したタイミングでのテストコード自動実行を行可能にする
※1 : 対象のPush先は`mainブランチ`とします## 対象としている人
– ローカルのプロジェクトで`Swift`を使い`iOSアプリ`のテストコードを書いたことある人
– テストを手動ではなく、`自動で実行`するためにはどうするのかな と思ってる人
– Github Actions に興味あるけど触ったことない人## 前提
– XCodeでプロジェクトを作成している
– プロジェクト名を `UnitTestApp01` としておくと、本記事との整合性がとれます!
– XCodeで作成したプロジェクトを`GithubのリポジトリへPush`している
– Swiftの構文をある程度理解している
– `class`, `func`, `return`, `let`, `var` をいつ使うか理解できていればOKです
– Git・Githubの操作をある程度理解している
– `ローカルリポジトリ`, `リモートリポジトリ`, `Add`, `Commit`
【Mac】スプリットビューを使用して快適に開発する
# はじめに
Xcodeとシュミレーターを行ったり来たりするのでかなり時間無駄にしていると思います。
Macのスプリットビューを活用して快適な開発環境を作ります!# こんな感じ
![画面収録_2023-03-04_20_40_57_AdobeExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/12bde367-194d-8aff-3485-951cd925a77e.gif)# やりかた
スクリーンにXcodeとシュミレータを用意します。
![スクリーンショット 2023-03-04 20.43.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/b846f759-b955-6453-b3e4-977c58b8cc4f.png)① 緑色のボタンを長押しします
② 「Tile Window to Left of Screen」を選択します
![スクリーンショット 2023
ARKitでGPSを使ってARを表示する(ARKit, RealityKit, CoreLocation)
ARKitのARGeoTrackingConfigurationとlocationManagerを使って特定の緯度と経度に3Dオブジェクトを配置する方法を解説していきます。
# 完成形
# ファイル構成
![Screenshot 2023-03-04 at 11.00.30 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3112425/e570b90b-a570-4947-a6c6-a82994ce6f43.png)
AppDelegateファイルは何も変更を加えていません。
# コード
“`swift:ContentView
import SwiftUI
import RealityKit
i
【Xcode】キーボードショートカットを割り当てる
# はじめに
以前、XcodeでGitHub Copilotを使う記事を書きました。
この時は、簡単に使えなくて不便だなと思ってました。
しかし、ショートカットキーを割り振ることができると教えてもらい、めっちゃ簡単に使う方法を知りました。
記録しておきます。https://qiita.com/SNQ-2001/items/3777c50e8c3a1aa894f0
# ショートカットキーの割り振り方法
① 「Xcode」を選択します
② 「Settings…」を選択します
![スクリーンショット 2023-03-03 20.00.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1b7d8121-2a1b-b796-c67f-cae124d94fae.png)③ 「Key Bindings」を選択します
④ `Copilot`と検索します
![スクリーンショット 2023-03-03 20.03.11.png](https://qiita-image-store.s3.ap
preferredVideoStabilizationModeが効かないのだが????
動画を撮影するようなコードを書くときに、手ぶれ補正をつけたくて調べていると
「ほう、`AVCaptureConnection.preferredVideoStabilizationMode`を設定すればええんやな」
ということで雑に“`swift
output.connection(with: .video)?.preferredVideoStabilizationMode = .auto
“`と設定してみたところ体感効いていなかったので
`device.activeFormat.isVideoStabilizationModeSupported(_):`で確認してみると、`.off`が返ってきた。
あれれーおかしいぞーと思いながらあれこれ調べていると
> Currently, only the 1080p30 and 1080p60 video formats support cinematic stabilization. The default value for preferredVideoStabilizationMode is AVCaptureVideo
アプリ内でSafariを起動する
アプリ内でSafariを起動する方法
# 環境
macOS Monterey バージョン 12.6.3
Xcode バージョン 14.2# コード
“` swift: ViewController.swift
import SafariServices
“`
SafariServicesを忘れずに
“` swift: ViewController.swift
func openSafari() {
let url = URL(string: “https://qiita.com/”)
if let url = url {
let vc = SFSafariViewController(url: url)
self.present(vc, animated: true, completion: nil)
}
}
“`### Delegate
`SFSafariViewControllerDelegate` があります。
ユーザーがSafari内の共有ボタン(A
【個人開発】iosアプリ「Custom Wall Clock」をリリースしました
![Simulator Screen Shot – iPhone 14 Pro – 2023-02-28 at 10.47.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366451/95bba977-08e8-00c9-cada-7c73b7d884e4.png)
:::note info
このプロダクトは、株式会社mofmofの「水曜日の個人開発」にサポートされています。
:::https://indie-dev.mof-mof.co.jp/
好きな画像を画面いっぱいに表示し、時間を確認することのできるカスタム時計アプリ **「Custom Wall Clock」** を作りました。
https://apps.apple.com/us/app/custom-wall-clock/id6445863766
## できること (MVP)
– 好きな画像を選択し画面いっぱいに表示できます。
– 好きなキャラクターの絵を表示したりするとなかなかエモいので試してほしい!
– 時計の文字を
【SwiftUI】よくある感じのくるくるインジケーター
![Simulator-Screen-Recording-iPhone-14-Pro-2023-03-02-at-19.29.13.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648522/6590b2d5-0e05-5cef-0b04-7e9af2711eb2.gif)
“` swift
struct SpinnerView: View {
@State private var showSpinner = false
@State private var degree: Int = 270
@State private var spinnerLength = 0.6var body: some View {
ZStack {
VStack {
Button {
showSpinner.toggle()
}