- 1. 【iOS】制約ベースのアニメーションで簡単にアニメーション実装
- 2. 共通パーツはどのように共通化すべきなのか?(UIView)
- 3. iOS15/Safari html要素にposition: fixedを設定した状態でlandscapeへ画面回転するとinnerHeightがアドレスバー分小さくなる
- 4. 【個人開発】メモアプリのiOS版をリリースした話【Flutter】
- 5. CoreMLの画像出力をプレビューできるようにする
- 6. Autoresizing MaskになっているとAutolayoutが効かない
- 7. 【Swift】撮影した動画からサムネイル画像を取得
- 8. 【Swift】カスタムViewとViewControllerの作成
- 9. 「The Ultimate Guide to WKWebView」をSwiftUIで実装する #07 – Monitoring page loads –
- 10. SwiftUI + FlowController パターンの提案
- 11. [Swift]なぜIdentifiableつけるの?
- 12. 【Xcode】コードスニペットで何回も書く処理を時短しちゃおう!
- 13. Windows端末でBlazorアプリを作ってiPhoneにデプロイするためには(macbookが別途必要) – その1
- 14. 「信頼されていないデベロッパ」のダイアログが出て自作アプリが起動できない!
- 15. 【Swift】CoreBluetoothの使い方 その3:ペリフェラルの実装
- 16. QR読込範囲指定
- 17. 【Swift・iOS】初学者も必見!! ライフサイクルについて今一度考えてみた編
- 18. [iOS]純正アプリ ショートカットを使ってパスワード管理アプリを作ってみよう
- 19. 【Firebase】初心者メモ【iOS / SwiftUI】
- 20. iPhoneの動作時のブルっという触覚効果をさっと作りたい とりあえずの構成
【iOS】制約ベースのアニメーションで簡単にアニメーション実装
#はじめに
iOSでアニメーションを使うときは今までCoreAnimationをメインで使っていましたが、制約ベースのアニメーションでも簡単に綺麗なアニメーションが作れることを知って目から鱗だったので、自分なりにまとめたいと思います。~~※投稿した後に気づきましたがGIFがクリックしないと動かないので修正中です。~~
#アニメーションの種類
+ CoreAnimationを使ったアニメーション
+ 制約ベースのアニメーションおそらく他にもあるのでしょうが、今回は上記2つに焦点を当てて違いを説明します。
#CoreAnimationを使ったアニメーション
出典: [Core Animation Programming Guide](https://dev
共通パーツはどのように共通化すべきなのか?(UIView)
![Xcode-13.1](https://img.shields.io/badge/Xcode-13.1-brightgreen) ![Swift-5.5.1](https://img.shields.io/badge/Swift-5.5.1-brightgreen) ![iOS-15.0](https://img.shields.io/badge/iOS-15.0-brightgreen)
## はじめに
アプリを作っているときに複数画面で同じような表示をみかけると共通のカスタム View として切り出すことがよくあります。しかし、安易に共通化すると後々の仕様変更時に痛い目にあう可能性があります。痛い目にあわないように共通のカスタム View はどのように作るべきなのか考えたいと思います。
(明確な答えがあるわけじゃないのでポエムのようなものです:innocent:)## 事象
添付のような画面があった場合、下部の金額表示部分は同じなので共通化したくなるはずです。|画面A|画面B|
| — | — |
|![screen_a](https://user-im
iOS15/Safari html要素にposition: fixedを設定した状態でlandscapeへ画面回転するとinnerHeightがアドレスバー分小さくなる
##タイトル通り
iOS15/Safariにて
html要素に`position: fixed;`を設定した状態でlandscapeへ画面回転すると、
アドレスバーが非表示であるにもかかわらず、「innerHeightがアドレスバーが表示されている時の値になってしまう」バグがある。
ちなみに本記事はただの備忘録です。##どうしたか
innerHeightを使用せず100vhを使用したところ、計算上は正しい値が得られたものの、
innerHeightを超過した分は見切れてしまった(winodw外ということ?)ため、
html要素から`position: fixed;`を外すことでしか対応できなかった。
【個人開発】メモアプリのiOS版をリリースした話【Flutter】
## はじめに
Flutterで開発したメモアプリのiOS版をリリースしました。android版から遅れて約2か月くらいです。android版リリース時の記事は[こちら](https://qiita.com/taki0010/items/c38827089ef04d01c91a)。今回は、android版リリース後に必要だと感じた機能を実装するために利用したパッケージなどを中心に書きたいと思います。
https://play.google.com/store/apps/details?id=com.karas.notespod
https://apps.apple.com/jp/app/notespod/id1600436936
—
### receive_sharing_intent [→](https://pub.dev/packages/receive_sharing_intent)
この **Notespod** は、メモにいろんなデータを添付できるアプリです。ストレージ内のデータについては`file_picker` のようなパッケージで持って来ればいいんですが、
CoreMLの画像出力をプレビューできるようにする
#ファイルだけでプレビューできるようにする方法です
![スクリーンショット 2022-02-17 10.49.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/f0dc7473-05d1-aa27-d2bd-84b524cfb367.png)
#画像プレビューはどうやるの?
CoreMLの出力を画像タイプにすると、ファイルを開いたときにプレビュータブが現れ、プレビューできるようになります。
しかし、画像をドロップしてみると、インディケーターが回り続けてStylized画像が表示されない場合や、
ノイズのような画像が表示されるなど、うまくプレビューできない場合があります。
何が間違っているのでしょうか?#画像の出力形状の並べ替えや非正規化が必要
例えば、モデルの出力形状が[1,256,256,3]の場合、
CoreMLファイルがプレビューできるRGB画像の形状は[3,256,256]なので、形状を並べ替える必要があります。“`swift
spec = mlmodel.get
Autoresizing MaskになっているとAutolayoutが効かない
Autolayoutで左右の制約を設定したが、Viewの幅が制約通りにリサイズされず、小さいデバイスだと画面からはみ出してしまった。
原因を探っていくと、インスペクターで該当ViewのLayout設定が`Autoresizing Mask`になっていたところを、`Inferred(Constraints)`にすると、意図通りに表示されるようになった。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37598/977ce0d7-cb39-3a22-b8cd-13cecb3453bb.png)
Webで漁っても解決策に行き着かなかったが、これは常識の範囲なのだろうか。
【Swift】撮影した動画からサムネイル画像を取得
#はじめに
今回のタイトルは撮影した動画からサムネイル画像を取得としていますが、
私がこの記事で伝えたいのは取得方法よりも注意点についてです。
こちらを実装される方は知っておいた方が良いです。
又、こちらは動画の一番最初のフレームをサムネイルにする場合の実装です。#実装
“`swift
private func setThumbnail() {
guard let url = URL(string: videoUrl ) else { return }
let asset = AVAsset(url: url)
let generator = AVAssetImageGenerator(asset: asset)
generator.appliesPreferredTrackTransform = truedo {
let thumbnailCGImage = try generator.copyCGImage(at: asset.duration, actualTime: nil)
【Swift】カスタムViewとViewControllerの作成
# はじめに
xibを使って、レイアウトはViewに、イベントはViewControllerで処理する場合のシンプルな実装方法を紹介します。
# ゴール(完成図)
xibを使って、ViewControllerにカスタムViewを表示させる。
※青背景色の部分がUIViewController、白背景色の部分がUIView。
おおまかな開発の流れとしては、ViewControllerにViewを埋め込む感じです。# 1.カスタムUIView、UIViewControllerのswiftファイルと、それに紐付くxibファイルの作成
– UIViewはSwiftとViewファイル別々に選択して作成する必要があり、UIViewControllerはcocoaTouchClassでxibファイルを一気に作成することができます。
「The Ultimate Guide to WKWebView」をSwiftUIで実装する #07 – Monitoring page loads –
[「The Ultimate Guide to WKWebView」](https://www.hackingwithswift.com/articles/112/the-ultimate-guide-to-wkwebvie)をSwiftUIで実装してみるの、
7つ目になります。15まであるので、大体半分まできました! ?
今回はKVOだとか、SwiftUIのProgressViewだとか、WKWebViewのメソッドだとか
使ったことがないものが多くて自分には重めだった・・・## 目次
シリーズ化していこうと思うので、全体の目次を置いておきます。
リンクが貼られていないタイトルは、記事作成中または未作成のものになります。|#|タイトル|
|——|—————–|—|
|01|[Making a web view fill the screen](https://qiita.com/kamimi01/items/b4d6cbafa587831c1be0)
(フルスクリーンのWebViewを作る)|
|02|[Loading re
SwiftUI + FlowController パターンの提案
## コンセプト
![concept.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178830/87f3e9dd-c69e-9113-5f81-b901774548c3.png)
## モチベーション
**アプリを SwiftUI ベースで作りたい!**
**……けど、危険な香りもするので UIKit に逃げられる余地を残しておきたい**### SwiftUI
SwiftUI が発表されたのが WWDC2019 なので、今年 2022 年で登場から約 3 年。
ネットを徘徊すると実際のプロダクトへの導入例もだいぶ見かけるようになってきました。実際に SwiftUI を触ってみると、宣言的 UI によるコード記述量の削減やコンポーネントとしての再利用性の向上、Canvas を利用したプレビューによる開発体験といったあたりは確かに素晴らしいのですが、実際にプロダクトに導入すると個人的には色々と不安な印象です。
特に気になるのが、
– 画面遷移周りの制限
– プッシュ遷移での `
[Swift]なぜIdentifiableつけるの?
#この記事を書いた理由
現在Swift UIの勉強をしていますが、Listを作成する機会がとっても多い。
その中で頻出するIdentifiableについて、「頻出だけどあまり理解できていない・・・」と思っていたので、1人でも私と同じような人がいなくなればと思って今回記事にまとめています。
まだ勉強中なので間違えていましたらご指摘いただけますと幸いです。#目次
[1.Identifiableとは?](#Identifiableとは?)
[2.Identifiableが無い時のエラーについて](#Identifiableが無い時のエラーについて)
[3.実装してみる](#実装してみる)
[4.まとめ](#まとめ)#Identifiableとは?
そもそもIdentifiableとは何でしょうか。
結論から言うと、**構造体に準拠するコンテンツにidを振ることを可能にするプロトコル**です。まだちょっとわかりにくいですよね。
順を追って説明していきます。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
プロトコルについての記事はこちら → 現在作成中
構造体に
【Xcode】コードスニペットで何回も書く処理を時短しちゃおう!
# はじめに
コードを書いていると、「あー、このコード前も書いたなー。」ということはよくありますよね。個人開発アプリを作っているとき、サンプルアプリを作っているとき、何度も同じコードを書くのは面倒ですよね。そんなときに、コードスニペットと呼ばれる機能を使うと時短ができちゃうので、その紹介です。# 環境
Xcode Version 13.2.1
MacOS Monterey Version 12.1# 何ができるの?
何度も使うコードをコードスニペットに任意のキーワードと一緒に登録しておくことで、いつでもキーワードから特定のコードを呼び出すことができます。
と、文章で書いてもよくわからないので、実際にやってみましょう。# 今回登録するコード
今回は以下のアラートのコードをスニペットとして登録していきます。そして、登録したコードを__`「alert」`__と入力することで呼び出せるようにしていきます。![スクリーンショット 2022-02-13 22.15.35.png](https://qiita-image-store.s3.ap-northeast-1.amazona
Windows端末でBlazorアプリを作ってiPhoneにデプロイするためには(macbookが別途必要) – その1
## Windows機でiPhone向けアプリを開発をしたい!
皆さんこんにちは。
僕は、とにかく開発については、操作性などから、Windows愛用者。で、iPhone向けのモバイルデスクトップアプリを作ろうと思ったときに、
選択肢はいろいろあるのですが、
とにもかくにも「Experimental Mobile Blazor」で、Blazorアプリにしたくなり。Webじゃなくて、モバイルネイティブなアプリです(のつもりですw)
で、そんなときに、Macbookも持っているのですが、
現時点(2022/02)では、VisualStudio2022がMacbookに対応していなかったりなどなど。いろいろあって、やっぱりWindowsで開発したいよね~と。
そんなときの手順の覚書です。
## MacBook側の設定
3. Visual Studio for Macをインストール (Xcodeより先に入っていると、Win機側のVSからペアリングすると、見つからないといわれる。。)
※何がダメだったって、Win機からペアリングしようとすると、XCodeが見つかんねーよって
「信頼されていないデベロッパ」のダイアログが出て自作アプリが起動できない!
## XCodeで作成したアプリを自分のiPhoneで「信頼されてないよ」と出た時の対応。
### 環境
* iOS 15.2.1### 手順
1. [設定」を開く
2. [一般]を開く
3. [VPNとデバイス管理]を開く
4. [デベロッパAPP]をクリック
5. 信頼したいアカウントを選択して信頼するをクリック##### 以上で完了です。
##### iOS更新のたびに、こういった設定周りの場所が、ネットで出ている情報と変わってしまうので、備忘録でした。
【Swift】CoreBluetoothの使い方 その3:ペリフェラルの実装
#はじめに
Corebluetoothのペリフェラル側の実装について記載していきます。
①その1:BLEにおける役割
②その2:セントラルの実装
③その3:ペリフェラルの実装 ← 今回はここ#処理の順番
・必要な機能の初期化
・アドバタイズの開始
・その後はCentral側の処理によって順番は変わるので、書込みや読み込みなどに応答するためのDelegateメソッドを実装#必要な機能の初期化
・BLE関連の設定の追記
info.plistに「Privacy – Bluetooth Always Usage Description」を追加
info.plistに「Privacy – Bluetooth Peripheral Usage Description」を追加#以降の処理及びコード
以下のような画面のペリフェラルアプリを作製しました。# はじめに
QR読取時に読取範囲を指定する必要があったのだが、なかなか思うように範囲を設定できなかったのでログに残しておく。# CGRect直で読取り範囲を算出(失敗)
`AVCaptureMetadataOutput`インスタンスの`rectOfInterest`プロパティに`CGRect`インスタンスを使って読取範囲を指定するサンプルをいくつか見つけたのだが、意図通りに読取範囲を指定することができなかった(Y軸にずれがある)。“`swift
// CGRectで指定しているサンプル
self.metadataOutput.rectOfInterest = CGRect(x: frame.minY,y: 1-frame.minX-frame.size.width, width: frame.size.height,height: frame.size.width)
“`
[参考]– [Swift5 QRリーダーの実装 脳死コピペ用](https://www.letitride.jp/entry/2019/12/03/125802)
– [iOSでバーコードを読み
【Swift・iOS】初学者も必見!! ライフサイクルについて今一度考えてみた編
こんにちは、株式会社ZOZOでiOSエンジニアをしております@shogunzozoです!!
自身2本目の記事はライフサイクル関係についての記事を書いてみました。
普段何気無く使っているライフサイクルに関するメソッド群も使い方次第でパフォーマンスに直結してくると痛感する日々です。プロダクトを直接的に実装するエンジニアとしてユーザーのUX向上は命題です。そのため、今一度根幹であるライフサイクルに関して見直しせっかくなのでQiitaに残す事にしました。
## 本記事の内容
初学者にもわかりやすく、iOSアプリのライフサイクルに関してまとめてあります。
困った時の辞書代わりに使って頂ければ幸いです。## そもそもライフサイクルって何??
簡略化すると、一般にアプリが立ち上がり画面が描画され消える(次の画面に進んだり、アプリを閉じたり)までの一連の流れを言います。つまり、アプリで画面のライフサイクルというと以下2点が大きな意味合いになると思います。
* 画面データがいつ読み込まれ、レイアウトはどのタイミングで計算されているのか
* その瞬間瞬間はどういったメソッドで実行されてい
[iOS]純正アプリ ショートカットを使ってパスワード管理アプリを作ってみよう
# はじめに
みなさん iPhone アプリの`ショートカット`ってご存知ですか?
このアプリが結構便利で iPhone 上で色々できてしまうんです。
今回はこのショートカットアプリでできることを紹介しようと思います。突然ですが、各種パスワードの管理ってどのようにしてます?
私は元々 iPhone のメモアプリで管理していました。
でも、これって各パスワードの検索がすごく大変なんですよね。
とはいえ、有料のパスワード管理アプリを使うのもなんか費用対効果が伴っていない気がしていました。
そこで、ショートカットアプリを使ってパスワード管理アプリを作れないか挑戦してみました。このパスワード管理アプリ作成を通してショートカットアプリにできることの一部を紹介していきます。
# 構成
構成は以下のようになります。
各項目の概要を説明します。– DB
– 検索入力フォーム
– 検索エンジン## DB
まずはアプリケーションの構成から紹介していきます。
パスワードを保存しておくデータベースですがこちらも iPhone のアプリケーションでかつ無料で再現したいですね。
ということで純
【Firebase】初心者メモ【iOS / SwiftUI】
####実行環境
・Xcode Version 13.2.1#Firebase プロジェクト
####開発環境と本番環境の分け方
Firebaseプロジェクトに設定するバンドルIDを本番用プロジェクトは本番のもの、開発用プロジェクトは後ろに-devなどを付けたものにし、Xcode側は開発中は以下のようにしておけば(良くないけど)ひとまず問題なさそう。(プロジェクト名は-prod/-devなど)
・バンドル ID:本番のもの+-devなどに変更する
・GoogleService-Info.plist:本番用のものをリネームしておき、開発用のをGoogleService-Info.plistとしておく#パッケージ
####パッケージのインストール
Project > Package Dependenciesで一度インストールしたあと、他のサービスも利用することになって追加のインストールが必要になった場合、「-」ボタンで一度削除して、再度まとめてインストールするっぽい。
サービスに対応するライブラリの一覧(公式):
https://firebase.google.com/docs/i
iPhoneの動作時のブルっという触覚効果をさっと作りたい とりあえずの構成
#タップ時にデバイスがふるえる機能の追加方法です
![2000928.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/2ef9b944-c0ea-b141-5c88-e40354d378ba.png)#なるべく少ない設定で触覚をつけたい
#方法
触覚用のクラスを作ります。
よかったらコピペで使ってください。“`swift
import Foundation
import CoreHapticsclass Haptics:NSObject {
var engine: CHHapticEngine?
lazy var supportsHaptics: Bool = {
CHHapticEngine.capabilitiesForHardware().supportsHaptics
}()
override init() {
super.init()
if supportsHaptics {