- 1. 【個人開発】【iOS】目標達成をサポートするアプリ「DrawGoal」をリリースしました!
- 2. Upcoming Feature Flagsの一覧を確認する方法(Swift)
- 3. SwiftUIレイアウトでImageを作成する
- 4. 【TCA】@BindingStateを使って値を監視する
- 5. 【Swift】DataSourceでParchmentを実装する方法
- 6. [API] Failed to create 0x88 image slot~
- 7. 【SwiftUI】カスタムのTextFieldStyleを作成する
- 8. Unity as a Library(UaaL)でSwiftUIを使う際のビュー位置ズレ問題の解決法
- 9. 【Xcode/Swift】Thread 1: “Could not load NIB in bundle: ‘NSBundle with name ‘fileName’”
- 10. Swiftのアクセス修飾子
- 11. CIImageを指定サイズにリサイズする
- 12. 【iOS】多言語対応がめんどうなのでChatGPTに一括で翻訳してもらう
- 13. 【Flutter】個人開発アプリを作成したら「大分県警察」と協力関係を締結するまでになった話をしよう。
- 14. 【Xcode】Build Configurationごとにアプリ名を変更する方法
- 15. 【Swift】フラットなJSONをネストしたモデルでデコードする【Decodable】
- 16. SwiftUIレイアウトで複数ページのPDFを作成する
- 17. UITextViewでテキストを選択した時に出るMenuをカスタマイズする方法
- 18. 【SwiftUI】positionで画面の隅に図形を移動させたい
- 19. 【Flutter】Map型まとめ
- 20. FlutterのAndroidとiOSでのファイルアクセス
【個人開発】【iOS】目標達成をサポートするアプリ「DrawGoal」をリリースしました!
# 前置き
こんにちは、個人開発が趣味のりょうやです。
最近開発した「DrawGoal」というアプリを紹介します。https://apps.apple.com/us/app/drawgoal-%E7%9B%AE%E6%A8%99%E9%81%94%E6%88%90%E6%94%AF%E6%8F%B4%E3%82%A2%E3%83%97%E3%83%AA/id6451417773
# どんなアプリか
「DrawGoal」は目標達成をサポートするアプリケーションです。自らの目標を設定し、その達成に向けての日々の進捗を記録することができます。シンプルな操作性で、誰でも簡単に利用することができます。特に、目標を持っているものの、その達成に向けての具体的なアクションや進捗の管理が難しいと感じている人にとって、非常に役立つツールになると思っています。
# 何故このアプリを開発したか
多くの人は、物事を進める際に目標を立てて行動します。しかし、目標に向かって進む途中での進捗をきちんと記録する人は少ないのではないでしょうか。私も計画的に物事を進めるのは得意ではなく、ついつい突っ走ってしまう
Upcoming Feature Flagsの一覧を確認する方法(Swift)
## はじめに
Swift 5.8から「Upcoming Feature Flags」というフラグが追加されました。
Swiftの言語仕様において、まれにソースの互換性を壊す変更が採用されることがあります。
そのような破壊的変更はメジャーバージョンアップまで導入されませんが、Upcoming Feature FlagsをONにすることで早めに有効にできます。今後の機能を予め有効にすることで、メジャーバージョンアップ時の移行が容易になるなどのメリットがあります。
詳細は以下の記事をご参照ください。
https://www.swift.org/blog/using-upcoming-feature-flags/
ただどのようなUpcoming Feature Flagがあるかがわかりづらいので、一覧で確認する方法を紹介します。
## 環境
– OS: macOS Ventura 13.5.2
– Swift: 5.9
– Xcode: 15.0 (15A240d)
– swift-tools-version: 5.9## Upcoming Feature Flagsの
SwiftUIレイアウトでImageを作成する
所謂スクリーンショット
前回の「[SwiftUIレイアウトで複数ページのPDFを作成する](https://qiita.com/mbotsu/items/eea0f350bc1b041e3b3b)」応用でSwiftUIのViewをイメージにして保存。
例の[ImageRenderer](https://developer.apple.com/documentation/swiftui/imagerenderer)で表示できないGridやListもちゃんと表示できています。ついでにiOS16の[Charts](https://developer.apple.com/documentation/charts)を少し弄ってみた。
– chartXScaleでグラフの表示範囲を指定、ここでは20〜30の範囲だけ表示
– PointMarkの表示をoverlayして画像を表示
– BarMark同士を重ねて帯の表示ユースケースとしては、健康診断なんかで使うグラフのような使い方ができるわけです。
# はじめに
@BindingStateの使い方を記録しておきます# 完成
![画面収録-2023-09-15-19.59.47.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/920c9395-67a6-67f5-da04-c8a74c04e617.gif)# 実装
### Reducer
“`diff_swift
import Foundation
import ComposableArchitecturepublic struct SampleReducer: Reducer {
public init() {}// MARK: – State
public struct State: Equatable {
+ @BindingState var text = “” // @BindingStateを付与public init() {}
}// MARK: – Action
【Swift】DataSourceでParchmentを実装する方法
## はじめに
ページャーを実装する必要があり、自分で作るのはめんどくさかったので、いいライブラリないかなと思い調べたところ“Parchment“というライブラリを見つけたので実装方法をメモします。## 前提条件
Parchmentライブラリがインストールされていること## 実装方法
### 完成イメージ
今回は、画面全体にページャーを実装するのではなく、表示させたい範囲に実装しています。
![Simulator Screen Recording – iPhone 14 Pro – 2023-09-15 at 10.39.49.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072069/1a93fb42-2e5c-a1a1-67a3-7e098310a9d5.gif)### 手順1
まず初めに表示したい**View**と**ViewController**のセットをそれぞれ作成します。
![スクリーンショット 2023-09-15 10.52.03.png](https://qii
[API] Failed to create 0x88 image slot~
問題なく動作はしているようだが、エラーが発生。
“`
Failed to create 0x88 image slot (alpha=1 wide=1) (client=0xe710c575) [0x5 (os/kern) failure]
““
[iPadOS: [API] Failed to create 0x88 image slot (alpha=1 wide=0) (client=0xfbe80e61) [0x5 (os/kern) failure]](https://developer.apple.com/forums/thread/733017)
↑ シミュレータではなかったのに実機にしたら発生したということだが、自分の場合はシミュレータ(iPad Pro(11-inch)(4th generation))で発生している。
(ちなみに、シミュレータをiPhoneにしたら出なかった)一行ずつデバッグしていくと、NavigationBarを非表示にするコードを変更したら、エラーが発生しなくなった。
“`
// エラー発生する
// self.navigation
【SwiftUI】カスタムのTextFieldStyleを作成する
# はじめに
LabelStyleやButtonStyleは使ったことがあったのですが、TextFieldStyleは使ったことがなかったので使ってみます。# Twitterの検索バー的なのを作ってみる
![simulator_screenshot_A963A173-1BDD-4AF4-A4DB-F0480C762401.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/4dff5fdc-1e32-3563-1f4b-3e7973249b4f.png)# 実装
“`swift
struct WithCancelTextFieldStyle: TextFieldStyle {
@FocusState private var isFocusedfunc _body(configuration: TextField
) -> some View {
HStack(spacing: 8) {
HSt
Unity as a Library(UaaL)でSwiftUIを使う際のビュー位置ズレ問題の解決法
# Unity as a Library(UaaL)でSwiftUIを使う際のビュー位置ズレ問題の解決法
## はじめに
Unity as a Library(UaaL)とSwiftUIの統合は多くの可能性を開きますが、この組み合わせはいくつかの困難ももたらします。この記事では、特にビューの位置がずれるという問題とその解決法に焦点を当てます。
## 我々がどのような状況でどのような問題にあったのか
UnityをiOSアプリケーションに組み込む際、SwiftUIを用いたレイアウトとの統合が必要でした。しかし、SwiftUIの画面にUnityのビューを埋め込むと、そのビューが画面の上部に徐々にずれていく問題に直面しました。
### 使用した技術
– Unity as a Library(UaaL)
– SwiftUI
– UIKit## その際のコード
問題が発生したのは、SwiftUIとUnity as a Library(UaaL)を組み合わせたプロジェクトでした。具体的には、SwiftUIの`UIViewControllerRepresentable`プロトコルを
【Xcode/Swift】Thread 1: “Could not load NIB in bundle: ‘NSBundle with name ‘fileName’”
## エラー内容
:::note alert
Thread 1: “Could not load NIB in bundle: ‘NSBundlewith name ‘fileName’”
:::## 原因
nibファイルを呼び出す際に、ファイル名が一致していないため。## 解決方法
ファイル名かファイル名を呼んでいる箇所でスペルミスがないかチェックをする。私の場合は、ファイル名の変更を忘れていたためにエラーが発生しました。
Swiftのアクセス修飾子
## はじめに
Swiftプログラミング言語には、クラス、構造体、関数、プロパティなどのアクセスレベルを制御するためのアクセス修飾子があります。アクセス修飾子を使用することで、コードのカプセル化、隠蔽、保護などを行うことができます。この記事では、Swiftにおける各種アクセス修飾子とその使用例について詳しく解説します。
## アクセス修飾子の種類
Swiftには以下の5つのアクセス修飾子があります。
1. `open` – 別のモジュールでもサブクラス化やオーバーライドが可能。
2. `public` – 別のモジュールでもアクセス可能。
3. `internal` – 同一モジュール内でアクセス可能(デフォルト)。
4. `fileprivate` – 同一ファイル内でのみアクセス可能。
5. `private` – 同一スコープ内でのみアクセス可能。—
## アクセス修飾子による呼び出し可能範囲の比較
以下の表は、各アクセス修飾子によって呼び出し可能な範囲を示しています。
| アクセス修飾子 | 同一スコープ | 同一ファイル | 同一モジュール | 別モ
CIImageを指定サイズにリサイズする
CIImageをリサイズしたい、CGImageとかUIImageに変換してからでもいいけど、CIImageのままリサイズもできます。
# すぐ使えるよ
“`swift
extension CIImage {
func resize(as size: CGSize) -> CIImage {
let selfSize = extent.size
let transform = CGAffineTransform(scaleX: size.width / selfSize.width, y: size.height / selfSize.height)
return transformed(by: transform)
}
}
“`“`swift
ciImage.resize(as:CGSize(width: 1024, height: 512)
“`![cat3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/
【iOS】多言語対応がめんどうなのでChatGPTに一括で翻訳してもらう
# はじめに
今まで個人開発アプリを多言語化するためにDeepLなどの翻訳機を使って翻訳していました。
しかし、時間がかかりすぎるのでChatGPTに任せることにしました。プロンプトが固まったので記事にしておきます。
# プロンプト
“`
iOS開発を行なっています。
アプリを多言語対応させるために、ローカライズが必要です。
[Base.lproj:]を[対応言語:]にそれぞれ翻訳してください[対応言語:]
– 英語
– 日本語
– フランス語[Base.lproj:]
“ContentView.Text1.label” = “おはよう”;
“ContentView.Text2.label” = “こんにちは”;
“ContentView.Text3.label” = “こんばんは”;
“`# 結果
![スクリーンショット 2023-09-13 20.40.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/8adcd256-90b6-0524-4a3b-da8cb
【Flutter】個人開発アプリを作成したら「大分県警察」と協力関係を締結するまでになった話をしよう。
どうも、個人でアプリ開発をしているYuKiOです。
最高にかっこいいメモアプリ「HackerMemo」などアプリを15本リリースしています。15作目のアプリをリリースしたのですが、最初は個人開発のチカラで困っている人を助けたいという気持ちでアプリを開発し始めたのですが、最終的には大分県警察と協力関係締結するまでに至りまして、なかなか苦労しました。
なぜ、締結することになったのか、そして個人アプリ開発者、特にこれから個人アプリ開発される方に、アプリを開発するまでの注意点を伝えられたらと思います。
結論は「AppStoreのガイドラインはよく読めよ!」ってことです。
どういうことは最後まで読んで頂けたらと思います。
# 「みんなのチカラ」というアプリを開発したが・・・
15作目のアプリは、指名手配犯の目撃情報を簡単通報できる「みんなのチカラ」というアプリです。作成の経緯はこのツイートを読んで頂ければと思います。(拡散だけでも協力ください!お願いします!)【拡散
【Xcode】Build Configurationごとにアプリ名を変更する方法
# Build Configrationとは
projectをクリックして出てくる`Debug`, ’Debug-Staging’等を指す?
![スクリーンショット 2023-09-13 15.05.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092613/a120d9a0-54a4-0c3b-d3a2-85f9de12a5d3.png)## アプリ名が変わる原理
Info.plist内の`CFBundleDisplayName `直下の``句がアプリ名に当たり、これを各Build Configrationに設定する ## Build Configurationごとにアプリ名を変更する方法
プロジェクトの設定項目 > `Build Settings` Filterは`All|Combined`を開く検索窓に`Packaging`と入れる
`Info.plist File`の項目を開くと、各Build Configrationに対応する`Info
【Swift】フラットなJSONをネストしたモデルでデコードする【Decodable】
こんにちは。
withでiOS開発を行っている @zrn-ns です。APIから返されたモデルをSwiftの `Decodable` 適合のモデルでデコードする処理を書いているとき、書き方に少し悩んだので、その内容を簡単にまとめておきます。
# 検証環境
– Xcode 14.3.1
– Swift 5.8.1# フラットなJSONをネストしたモデルでデコードするには
今回実装方法に少し悩んだのは、プロパティがフラットに並んだJSONを、構造化されたSwiftのモデルにマッピングする処理です。
文章だけだとわかりにくいので、具体例を示します。
### 【前提】普通のJSONのデコード処理
以下のようなユーザ情報の一覧情報のJSON文字列を、モデルにマッピングすることを考えます。
“`swift
let usersJsonData1 = “””
[
{
“id”: 1,
“name”: “Mario”,
“age”: 26,
},
{
“id”: 2,
“nam
SwiftUIレイアウトで複数ページのPDFを作成する
前回のPDFKitでPDFを読み込んで結合した際に透過部分が黒塗りになる現象が発生することがわかった。
– 前回までの記事
– [SwiftUIのレイアウトでPDFを作成する](https://qiita.com/mbotsu/items/1c1a49efed96f8ae145f)
– [SwiftUIのレイアウトでPDFを作成して結合する](https://qiita.com/mbotsu/items/4f091781901c84e69ab0)どうやらPDFのページ追加時に`context.cgContext.clear(rect)`で毎回コンテキストをクリアする必要があるようだが、PDFKitで読み込んだ場合のコンテキストの操作がわからないので諦めた。
なのでPDF作成時に複数ページを書き込んでから保存するのが妥当と判断。修正したコードがこちら。
これでSwiftUIで複数ページのPDFが安定して作成できる筈だ。
前回のPDFKitのページ結合時の透過現象の解決方法はいつか解る筈。。。https://gist.github.com/otmb/f48b31
UITextViewでテキストを選択した時に出るMenuをカスタマイズする方法
UITextViewで文を選択した時に出るMenuに新たなMenuを追加したかったので、備忘録として残します。
## 実装
“`Swift
import UIKitfinal class TextView: UITextView {
override func editMenu(for textRange: UITextRange, suggestedActions: [UIMenuElement]) -> UIMenu? {
var actions = suggestedActionslet customMenu = UIMenu(
title: “”,
options: .displayInline,
children: [
UIAction(title: “カスタム”) { _ in
print(“カスタム”)
}
]
【SwiftUI】positionで画面の隅に図形を移動させたい
# はじめに
positionで画面の隅に図形を移動させたい事があり、苦戦したので記録しておきます。# こんな感じ
![Simulator Screenshot – iPhone SE (3rd generation) – 2023-09-12 at 20.57.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/b3e2b45f-acb8-3067-084a-ea73c9dcd6d5.png)# 実装
“`diff_swift
import SwiftUIstruct ContentView: View {
+ private var rect: CGRect {
+ let scenes = UIApplication.shared.connectedScenes
+ let windowScene = scenes.first as? UIWindowScene
+ return windowScene?.windows.fi
【Flutter】Map型まとめ
# Map型とは
以下、公式より引用。
> キーと値のペアのコレクション。関連付けられたキーを使用して値を取得します。
https://api.dart.dev/stable/2.15.1/dart-core/Map-class.html
KeyとValueの組み合わせを、1つのオブジェクト内で管理することができ、Keyを基準にしてValueの取り出し、書き込みを自由に行うことができます。
# Map型の宣言
他の変数の宣言と同様に、変数名の前にMap型を指定する必要があります。
Map型の場合、Keyの型とValueの型も一緒に宣言します。“`dart
final MapuserData = { //Map < Keyの型 , Valueの型 >
“name” : “山田太郎”,
“age” : 24,
};
“`KeyとValueというワードを使用していますが、Map型の要素で`:(コロン)`の左にあたるところがKey、右側にあたるところがValueになります。
上記で宣言したMap型の変数
FlutterのAndroidとiOSでのファイルアクセス
# はじめに
FlutterでAndroidとiOSでファイルアクセスしたくなったので、動かしながら調べてみました。
まだしっかりと調べてないところもあるので内容を更新するかも。# パスの取得方法
## アプリケーション用のパスを利用する場合は path_provider
[path_provider](https://pub.dev/packages/path_provider) で取得されるパスはアプリケーション専用のパスを取得できます。
ほかのアプリケーションから参照することはできません。
ただし、パーミッションをAndroidManifest.xmlに設定する必要はありません。以下のコマンドでプラグインを導入します。
“`terminal
flutter pub add path_provider
“`使い方は簡単で、以下のように利用します。
“`dart
var appDocDir = await getApplicationDocumentsDirectory();
File targetPath = File(“${appDocDir.path