- 1. 未経験から独学で初めてアプリをリリースした件について
- 2. iPhone の safari で2回目以降の window.open できない → できた!
- 3. Combine(Swift)に関しての特に参考になった知見
- 4. iPhone初期化時のiOSバージョンに関する知見
- 5. イベント通知~オブザーバパターン~
- 6. UbuntuにAltServer for Linuxをインストールする時のメモ
- 7. Flutter – iOSアプリでライセンスplistを半自動で生成して設定画面に表示できるライブラリを作りました
- 8. 画面表示と共に、キーボードを表示する方法
- 9. [SwiftUI] 可読性にパラメータを全振りした SFReadableSymbols という OSS を作った話。
- 10. [SwiftUI] PreferenceKeyを使用して下位Viewから上位Viewへ値を伝える
- 11. 【Swift】UITextFieldがキーボードに隠れる場合のみ画面をずらす(UIScrolleViewなし)
- 12. デバイスがオフラインの時に処理をしたい~NWPathMonitor~
- 13. iOS用の画像分類モデルをTuriCreateで作る
- 14. [Swift] Tinder風のUIを実装してみよう?
- 15. stack viewで幅が変更できない xcode(swift)
- 16. ARKitのLocation Anchorsがサポートしているエリア
- 17. [iOS] もう二度と調べ直さないためのconvertメソッドに関するメモ
- 18. SwiftUIアプリでマークダウンテキストを表示する
- 19. 【Unity】ARでインジケータ表示
- 20. 物体検出ボックスを高速に描画する【Swift10倍高速バージョン】
未経験から独学で初めてアプリをリリースした件について
# はじめに
##### 前職で美容師をしていた私が独学で初めてAppStoreにアプリをリリースしました!
※温かい目でご覧いただければ幸いです。https://apps.apple.com/jp/app/beautystory/id1593645808
# アプリについて
##### SNS形式のヘアカタログアプリです。
通常ヘアカタログアプリといえば画像ですが、こちらのアプリは動画となっております。
TikTok、Instagramのリール、YouTubeのショートのような感じで閲覧できます。
機能はざっくり言うと、ログイン機能、動画撮影機能、楽曲検索機能、楽曲合成機能、投稿機能、シェア機能、スタイル検索、検索機能、動画閲覧機能、プロフィール編集機能、アカウント編集機能、お問い合わせ機能、通知機能です。### なぜこのアプリを開発したのか
コロナの流行に伴い顧客が激減してしまい美容業界全体が苦しい状況だった為、少しでも手助けができればと考えたことがきっかけです。ヘアカタログアプリを開発しなくても既に有名なヘアカタログサイトはありますが、値引き前提で美容室側に負担があ
iPhone の safari で2回目以降の window.open できない → できた!
# したいこと
親画面から子画面のポップアップをしたい。
子画面が無ければ新規で起動し、あればそれをアクティブにする。
(つまり開く子画面は1つのみであり、無限増殖しない。)# 困った現象
ほとんどのブラウザは以下の方法でOKだったはずですが・・・
親画面
“`html:old1.html
旧 親画面
旧 親画面
Combine(Swift)に関しての特に参考になった知見
### スレッドについて
https://qiita.com/shiz/items/9dc8e9a96f399b6c7246` .receive(on: DispatchQueue.main)`を用いるとメインスレッドで受けれるので良さそうである。
`.receive(on: RunLoop.main)`は、スクロール中に止まるらしい(Timerがスクロール中に止まるのと同じく)### UIControlをCombineで購読したい
デフォルトで用意されているものはない。
CombineCocoaを利用すればできる模様。
[UIKitでもCombineしたい!を叶えるCombineCocoaを試してみる](https://dev.classmethod.jp/articles/combinecocoa/)
[もしUIKitでUIを作りCombineで非同期処理を行うなら絶対にCombineCocoaの導入を検討するべきではないだろうか](https://emoshu.co.jp/blog/archives/18)
[CombineCommunity/CombineCocoaiPhone初期化時のiOSバージョンに関する知見
# 初期化方法
iPhoneには次の2通りの初期化方法がある。* iTunesを使用して初期化
* iPhoneの端末をリセット# iTunesを使用して初期化の場合
リセット後にiOSバージョンは最新のOSのバージョンに更新されてしまう。
例) iOS(14.8.1)の端末を初期化 → iOS(最新の15.4(2022年4月時点))として初期化された状態になる
※こちらの情報は実際に試したわけではなく、ネット上の記事より得た情報のため、間違い補足あればコメント歓迎します。# iPhoneの端末をリセット
こちらはiTunesストアには接続せず、iPhoneのリセットメニューから初期化した場合です。
工場出荷状態に戻すと言われていますが、iOSバージョンは例外のようで、
リセット後であってもOSバージョンはリセット前のままです。
例) iOS(14.8.1)の端末を初期化 → iOS(14.8.1)として初期化された状態になる
(当然ながらアプリは全て初期化されています)
※こちらは私のiPhone 6s Plus(iOS 14.8.1)端末を検体にした、実体験です。イベント通知~オブザーバパターン~
# イベント通知とは
イベントの発生箇所となるオブジェクトが、他のオブジェクトにイベントの発生を伝えること。イベント・・・アプリケーション内で発生するあらゆる事象のこと。
# イベント通知のパターン
・デリゲートパターン
・クロージャ
・オブザーバパターン
# オブザーバパターン
##### できること
1対多のイベント通知
-> ex) 特定のオブジェクトが変更されたタイミングで、複数の画面が更新されるケース
##### 構成要素
・サブジェクト >>> オブザーバを管理し、通知を発行する
・オブザーバ >>> 通知を受け取る対象
##### デメリット
むやみに多用すると、どのタイミングで通知が発生するか予想しづらくなり、処理を追うのが難しくなってしまう。
# 実装方法
1: 通知を受け取るオブジェクトにNotification型の値を引数に持つメソッドを実装する
2: NotificationCenterクラスに通知を受け取るオブジェクトを登録する
3: NotificationCenterクラスに通知を投稿するexample)
“`Swift: Hoge.swiftUbuntuにAltServer for Linuxをインストールする時のメモ
# 概要
これは筆者が[AltServer for Linux(非公式)](https://github.com/NyaMisty/AltServer-Linux)をコンパイルした時のメモです。
私が実行した時はAltServer-Linuxをコンパイルする時にエラーが発生して成功しませんでしたが、メモとして残します。
環境はUbuntu Server 21.04 for Raspberry Piです。
この記事はUbuntuの基本的なコマンドが理解出来る人向けに書いています。
(危険な事はしていませんが)何が起こっても自己責任で実行してください。
もしかしたら日本語や説明がおかしいところがあるかも知れないです。ご了承ください。
この記事に書かれているのは[作者さんの説明](https://github.com/NyaMisty/AltServer-Linux#build-instruction)を和訳、Ubuntu向け&自分向けにしたものです## 1 必須パッケージのダウンロード
### 1 APTコマンドでダウンロード出来るパッケージをダウンロードする。
~~~
sudo apFlutter – iOSアプリでライセンスplistを半自動で生成して設定画面に表示できるライブラリを作りました
# Dart, Flutterで車輪の再開発をしてみました
Swiftでは @mono0926 さんが作った [LicensePlist](https://github.com/mono0926/LicensePlist/) がありますが、Flutterを使ったiOSアプリでは同等のライブラリが存在しなかったので、Dartで作成してみました。@mono0926 さんの該当記事はこちら
https://qiita.com/mono0926/items/973752b69c881e00c507#comment-3060a817c4ba199567b9
今回作成したライブラリの置き場所はこちらです。
今回はiOSのみの対応でAndroidは対応できてないです。今後対応する予定はありますが、いい感じの実装方法が思い浮かんでないので、誰か助言を…。https://github.com/nomunomu0504/dart_license_plist
https://pub.dev/packages/dart_license_plist
—
動作結果としては、License
画面表示と共に、キーボードを表示する方法
# はじめに
SwiftUIで画面遷移をした際に、キーボードを自動で表示する方法をメモしておきます。
## コード
“`swift
import SwiftUIstruct ContentView: View {
// ContentView ⇄ SecondViewのシートを管理する状態変数
@State var isShowSheet: Bool = falsevar body: some View {
VStack{
Button{
isShowSheet.toggle()
}label: {
Text(“Go SecondView”)
}
}
.sheet(isPresented: $isShowSheet) {
SecondView(isShowSheet: $isShowSheet)
}
}
}struct
[SwiftUI] 可読性にパラメータを全振りした SFReadableSymbols という OSS を作った話。
## Tl;Dr
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29653/c8b5bc97-bde8-08d9-597a-1dccdb89944c.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29653/d56307fc-cc92-bb59-c471-8324af747b3b.png)
https://github.com/YusukeHosonuma/SFReadableSymbols
## なぜ作ったの?
マルチバイト圏(とは?)に生きる私としては、むしろこう書きたいくらい。 pic.twitter.com/LoRzlMNBA6
— トビ (@tobi462) March 9, 2022
## vs 標準API
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29653/2a83
[SwiftUI] PreferenceKeyを使用して下位Viewから上位Viewへ値を伝える
どうも、モバイルエンジニアのEtsuwoです。
SwiftUIを使ってる中で、親Viewから子Viewや孫Viewのframeへアクセスしたい場合がありました。
その際PreferenceKeyという仕組みを使用すると非常に便利だったので記事にします。# 1. PreferenceKeyとは
PreferenceKeyは下位のViewからより上位の階層のViewへと値を渡す仕組みです。
これを使うことにより、下位Viewで起こったframeの変更などを上位Viewで取得できるようになります。
二階層以上離れていても取得することができるので、Viewを細かく作りたい場合などに便利です。# 2. 実装してみる
今回は親、子、孫の3つのViewを作り親Viewで孫ViewのFrameを取得する場合を実装してみます。
以下のように中央の黒い長方形のFrameを表示できたら完成です。![スクリーンショット 2022-04-11 23.43.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383
【Swift】UITextFieldがキーボードに隠れる場合のみ画面をずらす(UIScrolleViewなし)
## はじめに
Swiftでは何もしなければ、`UITextField`がキーボードで隠れてしまいます。
それを改善するために、`UIScrollView`を使わずに画面をずらす方法を実装しました。
`UITextField`がキーボードに隠れる場合のみ画面をずらすように実装しています。これに関する情報や記事は多くあると思うのですが、ずらす幅の調整などで少し時間がかかってしまったので、記事として残しておきます。
コメントなどは、自分の分かりやすいように書いているので、細かい認識などは間違っている場合がありますが、ご容赦下さい。
## 1.キーボード開閉のタイミングを取得
まず、`viewWillAppear`に`Notification`を用いてキーボードが開閉するタイミングを取得する処理を記載。
“`Swift
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)// キーボード開閉のタイミングを取得
デバイスがオフラインの時に処理をしたい~NWPathMonitor~
# 環境
・Swift 5.5.2
・Xcode 13.2.1
# 動機
Firebase等、ネットワーク接続が必須なアプリで、デバイスがオフラインの時にアラートを出したい。etc…
# 其の一
有名なライブラリに[Reachability.Swift](https://github.com/ashleymills/Reachability.swift)というものがあるみたいですが、今回はAppleが標準で用意してくれている[NWPathMonitor](https://developer.apple.com/documentation/network/nwpathmonitor)を使用します。
# 其の二
シングルトンクラスを作成します。
“`Swift:Network.swift
import Networkfinal class Network {
static let shared = Network()
private let monitor = NWPathMonitor()func setUp() {
monitor.iOS用の画像分類モデルをTuriCreateで作る
# iOS用の高品質画像分類モデルを作ります
# CreateMLだけではない
Appleの機械学習モデルを作るフレームワークといえば、CreateMLがあります。
GUIで簡単にモバイル用モデルを作成できます。が、大量のデータセットでCreateMLの画像分類学習を回そうとすると、なぜか10iterで止まるという現象がありました。
こんなCreateMLでうまくいかない時に使えるのが、turicreateです。
TuriCreateも、Appleがリリースしている機械学習フレームワーク。
Pythonで画像分類などのモデルが作れ、iOS用のモデルとして保存できます。# 方法
必要なものをインストール
“`shell
pip install turicreate==6.4.1
# The wrong version of mxnet will be installed
pip uninstall -y mxnet
# Install CUDA10-compatible version of mxnet
pip install mxnet-cu100
# install S[Swift] Tinder風のUIを実装してみよう?
## 今回作るアプリ
今回はTinderのようなUIをUIKitを用いて実装していきます。
また今回の前提として、UIKitのみを用いて実装していきたいと思います。
そのため、余計なライブラリのインストール手段とかを取っ払っていけます!笑さらにUIはコードベースで実装し**余計な責務も持たせないこと**で少しでもパフォーマンスの良いコードを書いていきます。
今回実装する完成形UIはこんな感じです!
解説はコード内でコメントアウトしているので実際に動かしてみていただけると理解しやすいかと思います。![Simulator Screen Recording – iPhone 13 Pro – 2022-04-10 at 02.29.23.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552896/1d5787cd-b9a4-a72a-5b69-8ae420e138f8.gif)
## ソースコード
### ViewController
“`ViewController.swift
imstack viewで幅が変更できない xcode(swift)
## stack viewで幅が変更できない
### やりたいこと
計算機アプリ作成のため`stack view`を利用して、左右いっぱいにボタンを配置したい。### 困ったこと
`Width`の数値が変わらない。
![スクリーンショット 2022-04-10 8.27.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533678/7413347e-8901-99b2-cb58-b56691691c44.png)無理やりハンドツールで幅を広げると間が開く
![スクリーンショット 2022-04-10 8.30.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533678/8b92086b-2631-c9d2-759f-e774da300b02.png)### 解決方法
`Horizontal`(水平方向の)`StackView`を覆うように`Vertical`(垂直方向の)`StackView`ARKitのLocation Anchorsがサポートしているエリア
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/15121635-a67a-edce-8dfa-cf774169977d.png)
Location Anchorsは、GPSだけでなくカメラから取得した視覚情報も活用してユーザの絶対的な位置を割り出し、絶対的な位置にアンカーを記録するAPIです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/df9fac4c-3ad7-b846-ed4c-b78c1e2f45d4.png)
ARKitの機能の一つであるLocation Anchorsは、対応するエリアでした利用できません。
では、対応しているエリアはどこなのか。
公式ドキュメントに記載があったので引用します。
ちなみに**日本はありません。**## Location Anchors対応エリア
アリゾナ州
フェニックスカリフォルニア州
アラメ[iOS] もう二度と調べ直さないためのconvertメソッドに関するメモ
## convert to
“`swift
func convert(_ rect: CGRect, to view: UIView?) -> CGRect
“`レシーバ(メソッドが呼ばれる対象のオブジェクト)の座標系 **から** 引数で渡す `view` の座標系 **へ** 変換する
`rect` にはレシーバのローカル座標 (bounds) を指定するコード例
“`swift
let rect = targetView.convert(targetView.bounds, to: baseView)
“`## convert from
“`swift
func convert(_ rect: CGRect, from view: UIView?) -> CGRect
“`レシーバ(メソッドが呼ばれる対象のオブジェクト)の座標系 **へ** 引数で渡す `view` の座標系 **から** 変換する
`rect` には `view` のローカル座標 (bounds) を指定するコード例
“`swift
let rect = baseViewSwiftUIアプリでマークダウンテキストを表示する
この記事では、SwiftUIアプリ内でのマークダウン形式のテキストの表示について説明します。これは、コードに入力した文字列と、ユーザーが入力したテキストの両方に当てはまります。
## 使用可能なマークダウンフォーマット
現時点では、太字、イタリック体、リンク(リンクをクリックすると、Safariアプリが起動します)、コードのマークダウンが使用できます。
## コーディングする文字列の中でマークダウンを使用
コードファイルの中の文字列に直接マークダウンフォーマットを含めることができます。
“`swift
Text(“You can use **bold text**, an *italic* text, a [link](apple.com), or `a piece of code`.”)
“`テキストはマークダウンフォーマットで表示されます。
![スクリーンショット 2022-04-09 14.16.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/4b164719
【Unity】ARでインジケータ表示
# インジケータって?
こういうの
インジケータの表示できた#Unity pic.twitter.com/uMzG8GfHyt
— soh mǐtián (@soh_mitian) April 8, 2022
ARで任意の場所にオブジェクトを置きたい時のターゲットインジケータってわけです。
# 作り方
ARFoundationを使うので、予めパッケージに追加しといて下さい。## インジケータのプレハブを用意
こういうの
![スクリーンショット 2022-04-08 23.56.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1135021/e1272f6d-b8c0-2583-518f-db6c46b86496.png)### インジケータオブジェクトを作成
ヒエラルキーで空のオブジェクトを作成します(適当にIndicatorとか名前つける)空のオブジェクト配下にPlaneを作成します。
![スクリーンショット 2022-04-08 23.59.39.png](https:
物体検出ボックスを高速に描画する【Swift10倍高速バージョン】
# 物体検出結果を高速に描画します
![Apr-09-2022 09-21-00.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/e1a6ac67-a5b6-b996-dedc-9aef6f41a2ae.gif)|Framework|(秒)|
|—|—|
|UIImage|0.5|
|CGImage|**0.04**|# 検出よりも描画がボトルネックになる
Yoloなどをモバイル用にした物体検出モデルは、iPhone11で0.02のオーダーで実行できますが、結果を下記の自分の記事のような方法でUIImageに描画すると、描画の処理が0.5秒ほどかかります。https://qiita.com/john-rocky/items/f698610ea997704ab178
つまり、
**描画処理に、検出自体の25倍の時間がかかってしまいました。**
特にラベルテキストの描画が処理の80%を食います。これは**動画など大量のフレームの物体検出処理では致命的**です。
# C
関連する記事
OTHERカテゴリの最新記事
-
- 2024.09.19
JavaScript関連のことを調べてみた
-
- 2024.09.19
JAVA関連のことを調べてみた
-
- 2024.09.19
iOS関連のことを調べてみた
-
- 2024.09.19
Rails関連のことを調べてみた
-
- 2024.09.19
Lambda関連のことを調べてみた
-
- 2024.09.19
Python関連のことを調べてみた