- 1. 【SwiftUI】sheetで表示したViewだとKeyboard上のToolbarが機能しない(iOS17.0)
- 2. 【SwiftUI】子ビューでは@StateObjectと@ObservedObjectのどちらを使うべきなのか
- 3. (iOSアプリ開発)Launch Screenの設定でハマったこと
- 4. 【SwiftUI】refreshableのProgressViewをカスタムしたい。。。
- 5. Xcode エミュレータで画面録画する方法
- 6. Kotlin Multiplatform の SKIE について Flows 機能の動作を TCA を使って確認しました
- 7. 【SwiftUI】HomeIndicatorを非アクティブにしてミス操作でホーム画面に行かないようにする(iOS16)
- 8. SwiftUI LazyVGrid利用時にViewのスペースを割り当てる優先順位を変更
- 9. 【SwiftUI】画像をShapeStyleとして使いたい
- 10. IOSの権限ダイアログの文言変更の方法
- 11. “~が…へのアクセスを求めています”の実装方法
- 12. MapKitで近くのお店を取得する方法(MKLocalSearch.Request, MKLocalPointsOfInterestRequest)
- 13. 【iOS】AppとApp Extension間でCookieを共有する方法
- 14. 【SwiftUI】設定ウインドウを開くボタンを設置する(macOS14)
- 15. 【Xcode】ショートカットガチ勢が普段よく使うショートカットを紹介する
- 16. mlprogramの出力を画像にする〜GFPGANによる例
- 17. SwiftUIのalertのためにOptionalを持つBindingの拡張メソッドを作ってみた。
- 18. うおぉぉぉ!いつの間にかiOS形式に変換できるようになっていた消しゴムモデルLaMaをiPhoneで使う
- 19. 【SwiftUI】箇条書きできるViewを作成する
- 20. 【Xcode】control + mで引数を自動で改行
【SwiftUI】sheetで表示したViewだとKeyboard上のToolbarが機能しない(iOS17.0)
# はじめに
iOS17.0でキーボードの上にボタンを表示しようとしても表示されないという問題があるようです。
過去にも同様のバグがあったようですが、iOS16で1度修正されて、iOS17.0で再発したっぽいです。
iOS17.2では直ってました。https://ja.stackoverflow.com/questions/89652/sheet%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%81%95%E3%81%9B%E3%81%9F%E9%9A%9B%E3%81%AB-%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AEtoolbar%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84
https://developer.apple.com/forums/thread/709227
再現方法を記録しておきます。
# サンプルアプリ
|iOS17.0|iOS17.2|
|-|-|
|![Simulator Screen Recor
【SwiftUI】子ビューでは@StateObjectと@ObservedObjectのどちらを使うべきなのか
こんにちは![むらお](https://twitter.com/ymurao2)です!
SwiftUIで画面分割をした際、親ビューでは`@StateObject`を使用するべきだと思いますが、子ビューではどうなのかが気になったので、今回はむらお調査兵団による調査結果をご紹介します# @StateObjectと@ObservedObjectの違いについて
細かい説明は他の方の記事を読んでいただきたいのですが、1番の違いは**ライフサイクル**だと思います。
@StateObject:Viewが表示されてから非表示になるまで
@ObservedObject:親ビューのbodyが更新されるたび### 参考
[【SwiftUI】@StateObjectと@ObservedObjectの違いと使い分け](https://qiita.com/0102_0102johnny/items/fba13b2e7cfa61d437e9)# 調査報告
### コード
以下のようなコードで調査しました。
よくある構成だと思います。
ParentViewのbody内が大きくなったので、ChildVie
(iOSアプリ開発)Launch Screenの設定でハマったこと
#### はじめに
ユーザーがアプリを起動する際に最初に表示される画面、すなわち「Launch Screen」を設定するとアプリが本格的になります。Launch Screenを作成する方法を色々と調べましたが、この記事では一番簡単な方法として`info.plist`ファイルを使用した設定方法を紹介します。#### Launch Screenとは?
Launch Screenは、アプリがロードされる間に表示される静的な画面です。ユーザーにアプリの初期読み込み時間を知らせる役割を果たします。効果的なLaunch Screenは、ユーザー体験を向上させるための重要な要素です。#### `info.plist`でのLaunch Screen設定手順
1. **Xcodeプロジェクトを開く**: Xcodeで対象のiOSアプリプロジェクトを開きます。
2. **Assetsに画像をアップロードする**: 使いたい画像をドラッグ&ドロップで下の図の「logo」の箇所にアップロードします。(画像のタイトルは任意に設定可能です)
![](https://storage.googleapis.c
【SwiftUI】refreshableのProgressViewをカスタムしたい。。。
# はじめに
refreshableをカスタムするためにはScrollViewのスクロール位置を調べたり、RefreshActionをいじったりと、色々面倒なことが多いです。手軽に済ませたい場合はUIKitをいじっちゃうのが手っ取り早いです。
# サンプルアプリ
![Simulator Screen Recording – iPhone 15 – 2023-12-31 at 20.08.52.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a1401cc8-eda6-8257-d732-34c59ffc8e61.gif)# カスタムローディングの実装
“`swift
import SwiftUIenum CustomProgress: CaseIterable {
case state1
case state2
}extension CustomProgress {
var rotationEffect: Angle {
retu
Xcode エミュレータで画面録画する方法
iOSのエミュレータに画面録画する機能を最近まで知らなかったので、紹介してみようと思います。
![スクリーンショット 2023-12-31 12.58.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/a000418c-dbef-5673-24c2-43bae0072042.png)
こちらエミュレータの上の部分です。
optionキーを押したままにすることで、真ん中のカメラアイコンが録画ボタンに変わりクリックすることで録画することができます。ちょっとした動作の共有などで便利だと思います。
Kotlin Multiplatform の SKIE について Flows 機能の動作を TCA を使って確認しました
# はじめに
Kotlin Multiplatform における iOS 向け API を Swift から使いやすくするツール [SKIE](https://skie.touchlab.co/) (スカイ)を活用しています。これまで[いくつかある機能](https://skie.touchlab.co/features/)のうち、[Sealed Classes](https://skie.touchlab.co/features/sealed) と [Suspend Functions](https://skie.touchlab.co/features/suspend) を紹介してきました。今回は [Flows](https://skie.touchlab.co/features/flows) 機能を iOS のありものの状態管理クラスである [TCA](https://github.com/pointfreeco/swift-composable-architecture) の Reducer に乗せて動作確認する形で紹介しようと思います。
## Sealed Classe
【SwiftUI】HomeIndicatorを非アクティブにしてミス操作でホーム画面に行かないようにする(iOS16)
# はじめに
以前、HomeIndicatorを非表示にするって記事を書きました。https://qiita.com/SNQ-2001/items/077524f3c3a494f15dbb
今回は非表示にする訳ではなく、非アクティブ?(表現が適切かどうかは不明)にして、1度のスワイプでホーム画面に行かないようにします。
# サンプルアプリ
`all`と`bottom`でしかわかりませんが、HomeIndicatorがグレーになっていることがわかります。
![Simulator Screen Recording – iPhone 15 – 2023-12-30 at 22.19.17.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/434bcced-ec8c-de84-d748-fa4268471ca3.gif)# 実装
“`swift
import SwiftUIstruct ContentView: View {
@State private var edgeS
SwiftUI LazyVGrid利用時にViewのスペースを割り当てる優先順位を変更
SwiftUIの[LazyVGrid](https://developer.apple.com/documentation/swiftui/lazyvgrid)は子ビューに指定したViewをグリッド状に並べることができるViewです。
ただし遅延して表示するため、レイアウトを組む場合Viewのスペースを割り当てる優先順位を考慮する必要があります。
どう考慮すべきかを`HStack`の子ビューに`LazyVGrid`を指定する場合で解説します。| | バージョン |
|:———–|:————:|
|Xcode|15.1|
|iOS|17.0|
|macOS|Sonoma 14.0|# 作成物
`HStack`の子ビューに`LazyVGrid`(グリッド状に並べた絵文字)と`Button`を指定し、このようなViewを作成します。
【SwiftUI】画像をShapeStyleとして使いたい# はじめに
図形にforgroundStyleで画像をのせたいことがありました。
できるのかなと調べたところ出来そうだったので記事にしておきます。# 素材
![gradation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/2fc3a4a2-22db-094d-d55d-89c8b4e7e71c.png)# サンプルアプリ
![simulator_screenshot_1F031802-7025-43D1-9749-33507E7EC232.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/82c18b2d-cbf6-f050-0c25-b2b72c6b8597.png)# 実装
`ImagePaint`を使用してShapeStyle化できるっぽいです。
引数はimageの他にscaleやsourceRectなどがあります。
“`swift
import SwiftUIs
IOSの権限ダイアログの文言変更の方法
初めてIOSアプリを作成してAppストアに申請して超詰まったところ
「権限の許可ダイアログに詳細な説明がありません」
上記の理由で何度も不許可
でも公式のダイアログ使ってるのにな〜?
何かカスタムする方法あるのかな〜?ありました!
しかも簡単!まずXcodeを開きます
自分のプロジェクトをクリックします
そうよく使うplistとかいうやつです
その中の「info」を選択します
追加した権限が必要なprivacyの末尾のvalueに文字を書くだけ!簡単です![スクリーンショット 2023-12-29 16.02.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647748/deca119e-2d9c-c584-c173-98a0068dc3f8.png)
これの赤線で囲ったところですね
こんな簡単にできたのか。。。
“~が…へのアクセスを求めています”の実装方法
## はじめに
アプリの開発において、ユーザーのプライバシーに関連する情報へのアクセス権を取得する必要が生じることがよくあります。この際、具体的な使用目的や利用する情報の詳細をユーザーに明示し、その許可を得る確認画面を表示することが必要です。今回は、この確認画面を実装するためのXcodeの設定手順について解説します。## Xcode設定手順
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984024/170c5f23-858f-f4de-d896-777cba1e19d5.png)① プロジェクト設定画面からInfoを選択
② +ボタンでプロパティを追加
③ Key(許可を求める機能:例ではカメラ)を選択
MapKitで近くのお店を取得する方法(MKLocalSearch.Request, MKLocalPointsOfInterestRequest)
# はじめに
AppleのMapKitを使って、現在地近くのお店(MKMapItem)を取得する機会があったので、備忘録的にまとめます。
## 基本
– 2つのオプションがあって、自然言語で検索する場合、しない場合
– MKMapViewに対して使う方法は今回は記載してません。### 自然言語で検索する場合
– MKLocalSearch.Requestを使用する
“`swift
// locationはCLLocationCoordinate2D
let localSearch = MKLocalSearch.Request()
// この場合、centerを中心に100m * 100mの四角形の中を検索する
localSearch.region = MKCoordinateRegion(center: location, latitudinalMeters: 100, longitudinalMeters: 100)localSearch.naturalLanguageQuery = “検索したい言葉”
let response = try? await
【iOS】AppとApp Extension間でCookieを共有する方法
# はじめに
アプリからHTTPリクエストで行動ログを送信し、APIサーバがCookieから端末を識別するための情報(端末ID)を取得して、行動ログと端末を紐づけて分析基盤に記録するということをしています。あるとき、アプリとアプリエクステンションとで、行動ログに紐づく端末IDが異なっていることに気づきました。
正しく分析を行うためには、アプリとアプリエクステンションのどちらから送信される行動ログにも同じ端末IDを付与する必要があります。
原因と対応方法がわかったので、以下にまとめます。
# アプリとアプリエクステンションはそれぞれ別々のCookieストレージを持っている
アプリがAPIサーバに初めてアクセスしたとき、APIサーバが端末IDを発行し、それをSet-Cookieヘッダーの値としてアプリに返す仕組みになっています。アプリは次回以降のアクセスでそのCookieをリクエストに付与するので、リクエストを端末と紐づけて記録することが出来ます。
ところが、アプリとアプリエクステンションはそれぞれ別々のCookieストレージを持っているため、アプリが端末IDのCookie
【SwiftUI】設定ウインドウを開くボタンを設置する(macOS14)
# はじめに
以前も同じ内容の記事を書きました。https://qiita.com/SNQ-2001/items/423db3d6453db5577ad6
今までは設定ウインドウを開くにはAppKitを使用しないと実現できなかったのですが、macOS14からSwiftUIの標準で実装することができました。
# サンプルアプリ
![画面収録-2023-12-28-22.13.55.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a8b2fb90-f2e5-b44c-eace-b2c6c70afb16.gif)# 実装
“`DemoApp.swift
import SwiftUI@main
struct DemoApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}Settings {
Settin
【Xcode】ショートカットガチ勢が普段よく使うショートカットを紹介する
こんにちは!作業効率厨、[むらお](https://twitter.com/ymurao2)です!
爆速コーディングのために、ショートカットガチ勢(自称)である自分が、よく使うショートカットや開発スピードアップテクニック?を紹介します## 登場する記号たち
| 記号 | |
| — | — |
| ⌘ | Command |
| ⇧ | Shift |
| ⌃ | Control |
| ⌥ | Option |
| ↩ | Return |
| ⌫ | BackSpace |
| ↑↓←→ | 矢印 |## Tier
独断と偏見でつけていきます
| Tier | 説明 |
| — | — |
| S | エース・これなしではやっていけない |
| A+ | 最強ではないものの非常によく使う |
| A | 結構使う |
| A- | 場所を選ぶが、結構使う |
| B | 便利 |
| C | たまに使う |
| D | あんまり使わない |# Xcode編
## Build系
| Tier | ショートカット | アクション |
| — | — | –
mlprogramの出力を画像にする〜GFPGANによる例
# ケーススタディGFPGAN
![sampleimage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/428f5550-a1e4-0ddf-8abe-5d493e7216d4.png)
https://github.com/TencentARC/GFPGAN
GFPGANは品質の良くない顔画像を綺麗にできる。
このPytorchモデルをCoreMLで画像出力できるようにしていく。# そのままではうまく画像にできない
CoreMLToolsを使ってPytorchモデルをCoreMLモデルに変換するとき、以下のようにして出力を画像に設定することができるが、**通常このままではうまく画像が出力されない。**
“`python
import coremltools as ctdummy_input = torch.randn((1,3,512,512)).cuda()
jit_model = torch.jit.trace(model,dummy_input)corem
SwiftUIのalertのためにOptionalを持つBindingの拡張メソッドを作ってみた。
SwiftUIでalertをスマートに実装する方法を模索中です。
例えば [`alert(_:isPresented:presenting:actions:message:)`](https://developer.apple.com/documentation/swiftui/view/alert(_:ispresented:presenting:actions:message:)-3md6l) の場合、`presenting`に与えるデータの有無に連動して、`isPresented`のtrue/falseが切り替わる仕組みがあると、便利と思いました。
`Binding`には [get/setのクロージャで値変換が可能なイニシャライザ](https://developer.apple.com/documentation/swiftui/binding/init(get:set:)-7ufcp)があるので、これを利用してみます。
で、汎用的に使えるように拡張メソッドを作ってみました。
“` swift:
extension Binding {
func bool
うおぉぉぉ!いつの間にかiOS形式に変換できるようになっていた消しゴムモデルLaMaをiPhoneで使う
# あの消しゴム機能がついにiOS形式に変換できるようになった
![Dec-27-2023 23-34-07.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/1af1859c-f58c-5920-e6f9-050d8aa9ff08.gif)以前はiOS形式にできなかったLaMaインペインティングモデル。
フーリエ変換か何かが変換できなかった。
CoreMLToolsのアップデートで変換できるようになったらしい。
というのは、変換スクリプトを提供してくれている人をGitHubで見つけた。https://github.com/mallman/CoreMLaMa
ありがとうマルマンさん。
# 変換方法
“`shell
git clone https://github.com/mallman/CoreMLaMa.git
cd CoreMLaMa
pip install -r requirements.txt
python convert_lama.py
“`これだけでLaMa.
【SwiftUI】箇条書きできるViewを作成する
# はじめに
箇条書きViewってありそうでないんですよね
そう思ったので作ってみました。# サンプルアプリ
![スクリーンショット 2023-12-27 22.44.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/89c060f9-ea08-2c6e-429b-0a444d3bfc48.png)# 実装
“`swift
import SwiftUIstruct BulletPointListView: View {
let alignment: HorizontalAlignment
let spacing: CGFloat?
let bulletPointShape: BulletPointShape
let items: [String]init(alignment: HorizontalAlignment = .center, spacing: CGFloat? = nil, bulletPointShape:
【Xcode】control + mで引数を自動で改行
Xcode15から使えるショートカットで、引数のどこかにカーソルを合わせて`control + m`を押すと、引数が自動で改行される。
![スクリーンショット 2023-12-27 17.46.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640032/801486c9-30ae-2413-433c-a219b646026d.png)
↓↓↓
![スクリーンショット 2023-12-27 17..png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640032/3d1e0d10-c280-3801-0db2-f30dec8ad3ff.png)