- 1. 【Swift】touchesMovedが実行される最小移動量について【Tips】
- 2. mediapipeをiOSアプリに組み込む
- 3. チェインオブレスポンシビリティをSwift5で実装する
- 4. appiumをiOSの実機で使うまでの手順・方法
- 5. UISearchBarのキャンセルボタンをアニメーション付きで表示したい話
- 6. UITextFieldで文字を入力した後にキーボードをしまう方法
- 7. FirebaseのRemoteConfig使ってみた
- 8. SceneKitで環境マップ
- 9. houstonを使ってrailsサーバーからプッシュ通知を送る時に設定できる値のメモ、あと多言語対応
- 10. 【Swift】[weak self]付のクロージャに親スコープの変数を渡したい!!!
- 11. [swift5]iOSアプリでApp Groupsを実装
- 12. [swift5]iOSアプリでカメラ機能を実装
- 13. 【swift】画像のデータサイズを取得し、バリデーション を実装する
- 14. プロキシーパターンをSwift5で実装する
- 15. 【小ネタ】環境ごとにアプリアイコンを変更する方法【iOS】
- 16. 【swift】画像を指定した比率でトリミングする【TOCropViewController】
- 17. 【SwiftUI】@Environmentを支える機能
- 18. iOSアプリ、Adhoc配信でもプッシュ通知は飛ばせます!飛ばないときのトラブルシューティング
- 19. UIAlertController の title と message のパターン
- 20. UITableViewでセルを選択不可にする方法
【Swift】touchesMovedが実行される最小移動量について【Tips】
連続的なジェスチャーの検知に使われる `touchesMoved` が実行されるタイミングに関して調査してみたので簡単にまとめる。
# 検証環境
– Swift5.0
– iPhone6s(iOS13.3)# 検証方法
以下の様なコードでコンソールに測定した位置を出力することで検証した。“`
override func touchesMoved(_ touches: Set, with event: UIEvent) {
let latestTouch = touches.first
let newPoint: CGPoint = (newTouch?.location(in: view))!
// previousPointはクラスのプロパティとして保持
let translation = CGPoint(x: previousPoint.x – newPoint.x, y: previousPoint.y – newPoint.y)
previousPoint = newPoint
print(translati
mediapipeをiOSアプリに組み込む
# mediapipeとは
Googleの開発しているML推定のパイプラインを簡単に設定できるライブラリ。Windowsを初めiOSやAndroidなどマルチプラットフォームに対応している。
https://github.com/google/mediapipe
mediapipeにはプリセットで手や関節の位置推定や顔の位置推定のモデルがバンドルされていてexampleで確認することができます。
https://github.com/google/mediapipe/tree/master/mediapipe/models![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24979/91e9bd2a-8d3f-0e6f-f59d-c370e91b6eed.gif)
# iOSアプリにmediapipeを組み込む
iOSアプリにmediapipeで作ったパイプラインを組み込むには、一度フレームワークとしてビルドするかiOSアプリをbazelで管理する必要があります。
ここでは
チェインオブレスポンシビリティをSwift5で実装する
※この記事は「全デザインパターンをSwift5で実装する」https://qiita.com/satoru_pripara/items/3aa80dab8e80052796c6 の一部です。
###The Chain Of Responsibility(チェインオブレスポンシビリティ)
####0. チェインオブレスポンシビリティの意義
あるリクエストを処理する複数のオブジェクト(レシーバーまたはレスポンダーという)がある場合、レシーバーを線形リストで繋げてリクエストを処理させるパターンをChain of Responsibilityという。
各レシーバーは次のレシーバーへの参照を持っており、あるリクエストを処理するのに適切なレシーバーが見つかるまで(あるいはレシーバーがなくなるまで)リクエストを次のレシーバーへ渡していく。
このレシーバーを組み合わせた「鎖」をプログラム実行時に動的に作ることもでき、柔軟な処理が可能となる。
例えばiOSにおいては、画面をタップした時の処理がこのパターンによって処理されている。
リクエストを処理するレシーバが1, 2個しかない場合などは、
appiumをiOSの実機で使うまでの手順・方法
appiumをiOSの実機で動かすまでの手順です。
### 使用環境
使用環境は以下の通りです。
Xcode, command line toolsはインストール済とします。Mac OS Catalina(10.15.2)
Xcode 11.2.1
appium v1.15.1### Appiumのダウンロード
公式サイトより環境にあった物をDLする。
http://appium.io/### Appium側の設定
ダウンロードしたら起動をし、Start Serverをクリック
Start Serverをクリックするとログが出る画面になるので虫眼鏡ボタンをクリック
UISearchBarのキャンセルボタンをアニメーション付きで表示したい話
UISearchBarをタップして編集状態中だけキャンセルボタンを表示したいと、
ちょびっと悩んだので備忘録として書いときます。↓こんな感じのやつ
![qqytl-ojzlm.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542129/ad6d45db-b35f-7f6e-dc42-8b66beb6c2c0.gif)# アニメーション無しの場合
showsCancelButtonを使うことで表示の制御はできますが、アニメーションはありません。
“`swift
searchBar.showsCancelButton = true
“`# アニメーション有りの場合
setShowsCancelButtonを使いましょう
“`swift
searchBar.setShowsCancelButton(true, animated: true)
“`# 実装例
コピペをこよなく愛する者たちへの贈り物です?
“`swift
import UIKitclass ViewCo
UITextFieldで文字を入力した後にキーボードをしまう方法
## 今回の記事を書く理由
初学者に多い気がしますが、UITextFieldで文字を入力した後、キーボードが勝手に閉じてくれないのでそのためのコードを書く必要があります。
意外と何回も調べていたりしていたためメモの代わりに書きます。
今回は説明を交えながら書いてきます。
## xcodeでreturnの文字を変更
まずxcodeでreturnの文字を変更することができます。
## ソースを追加
### 全体像
この後説明していきます。
“`swift
class ViewController : UIViewController, UITextFieldDelegate {
@IBOutlet var textFiel
FirebaseのRemoteConfig使ってみた
#はじめに
最近になってFirebaseのRemoteConfigを使う機会があったので、
このサイトに残しておこうかと思います。
ほぼ、ドキュメントに通りなので、
気になる方だけ読んでいただければと思います。
#RemoteConfigとは
アプリをアップデートすることなく、アプリの動作や外観を変更できる機能になります。
行なっている事としてはRemote Config Serverから設定されているパラメーターを取得して、
その値によって動作や外観を変更します。
[RemoteConfigとは](https://firebase.google.com/docs/remote-config?hl=ja)#環境
Xcode 11.3
swift 5
Firebase 6.15.0
#FireBaseのインストール
インストール手順は省きます。
以下、公式ドキュメント
[Firebase を iOS プロジェクトに追加する](https://firebase.google.com/docs/ios/setup?hl=ja)
#RemoteConfig設定
[Remote Config
SceneKitで環境マップ
“`objc
SCNScene *scene = [SCNScene sceneNamed:@”art.scnassets/my_scene.scn”];
// 背景に表示用
scene.background.contents = @[@”art.scnassets/px.png”, @”art.scnassets/nx.png”, @”art.scnassets/py.png”, @”art.scnassets/ny.png”, @”art.scnassets/pz.png”, @”art.scnassets/nz.png”];// ライティング用
scene.lightingEnvironment.contents = @[@”art.scnassets/px.png”, @”art.scnassets/nx.png”, @”art.scnassets/py.png”, @”art.scnassets/ny.png”, @”art.scnassets/pz.png”, @”art.scnassets/nz.png”];// モデル
SCNNode *m
houstonを使ってrailsサーバーからプッシュ通知を送る時に設定できる値のメモ、あと多言語対応
#1. 概要
“houston”というgemを使って、ruby on railsのサーバーからiOSアプリにプッシュ通知を送るようにしました。今回は本文・SE・バッジ数だけの一番シンプルな通知を実装しましたが、[GitHubのUsage](https://github.com/nomad/houston)を参照すると、通知データに対して他にも設定できる項目があるようです
将来細かい設定が必要になった時に忘れないように、調べたことを書いておきます。
#2. メモ
“`ruby:Usage.rb
require ‘houston’
# 定数の宣言はメソッド外でする
APN = Houston::Client.development
APN.certificate = File.read(‘/path/to/apple_push_notification.pem’)# 通知を送りたいデバイスのdevice tokenを代入
token = ‘
【Swift】[weak self]付のクロージャに親スコープの変数を渡したい!!!
小ネタです。
UI更新処理ってメインスレッドでやらないといけないので、
DispatchQueue.main.async {[weak self] in …… }の中に書くじゃないですか?
このときに、関数内のスコープを持った変数をクロージャに渡したい、ということがありました。“`swift
class ViewController {
func soramissionLoaded() {
var word = “これを渡したい”
DispatchQueue.main.async {[weak self] in
//どうしたらいい?
}
}
}
“`# 正解
先に正解を書くと、“`swift
class ViewController {
func soramissionLoaded() {
var word = “これを渡したい”
DispatchQueue.main.async {[weak self, word] in
[swift5]iOSアプリでApp Groupsを実装
アプリ間でのデータ共有を実装する方法を紹介します!
本ページでは、App Groups を利用します。## 動作環境
| 対象 | バージョン |
|—|—|
| iOS | 13.3 |
| macOS | Catalina 10.15.2 |
| Xcode | 11.3.1 |
| Swift | 5.1.3 |## データ共有機能(App Groups)の実装
アプリ間でデータを共有するため、アプリは2つ作成します。
1. データを表示・変更するアプリ
2. データを表示のみするアプリ1, 2 で同じデータを表示します。
## アプリの設定(2つのアプリ共通)
2つのアプリで設定してください。
1. 「Signing & Capabilities」から「App Groups」を追加する
2. グループ名を追加する### ファイル作成(2つのアプリ共通)
– Storyboard
– ここでは、”AppGroups.storyboard” とします
– ViewController.swift
– ここでは、”AppGroup
[swift5]iOSアプリでカメラ機能を実装
iPhoneに入っているカメラアプリのようなカメラを呼び出す機能を実装する方法を紹介します!
本ページでは、UIImagePickerController を利用します。自分でカスタマイズしたカメラを実装したい場合は、UIImagePickerController ではなく AVFoundation を利用する必要があります。
## 動作環境
| 対象 | バージョン |
|—|—|
| iOS | 13.3 |
| macOS | Catalina 10.15.2 |
| Xcode | 11.3.1 |
| Swift | 5.1.3 |## カメラ機能の実装
本ページでは、2画面用意します。
1. ボタンを用意します
2. ボタンを押下すると、カメラ画面に遷移します
3. 写真をとり、写真を利用を押下すると、写真が保存されはじめの画面に戻ります### Info.plistの修正
Info.plist に2つ項目を追加します。
– Privacy – Camera Usage Description
– カメラを呼び出すために追加する
– P
【swift】画像のデータサイズを取得し、バリデーション を実装する
#方法
“`swiftvar image:UIImage? = … //画像を読み込む
//
let imageData:Int = NSData(data: image.jpegData(compressionQuality: 1)!).count//※画像のデータサイズをKBで表示。
let dataToKB = Double(imageData) / 1000.0//バリデーションを実装。(10MB以下のみ保存可能)
if dataToKB < 10000.0 { print("画像を保存できます") //画像をimageViewに描写させたりする self.imageView.image = image } else { print("画像データが過大です。10MB以下可能です") } ``` #詳しく ##`jpegData(compressionQuality: CGFloat)` ```swift func jpegData(compressi
プロキシーパターンをSwift5で実装する
※この記事は「全デザインパターンをSwift5で実装する」https://qiita.com/satoru_pripara/items/3aa80dab8e80052796c6 の一部です。
###The Proxy(プロクシ)
####0. プロクシの意義
ある特定のオブジェクトに直接アクセスさせず、間接的にアクセスするようにするパターンをプロクシパターンと言う(Proxyは代理というような意味)。
具体的には、
・ バーチャルプロクシ
・ リモートプロクシ
・ プロテクティブプロクシ
の三種がある。注意点は、プロクシを経由せずに直接目的のオブジェクトにアクセスできるような抜け道を用意してはならないという事である。それではプロクシパターンの意味がなくなってしまう。
####1. Virtual Proxy(バーチャルプロクシ)
オブジェクト生成にコストがかかる場合、その生成のタイミングを本当にオブジェクトが必要になるまで遅らせるパターンの事を言う。
Swiftでは、変数の前に`lazy`修飾詞をつける事で比較的簡単に実現できる。
“`swift:ImagePro
【小ネタ】環境ごとにアプリアイコンを変更する方法【iOS】
# モチベーション
「どれを確認すればよい?」
検証端末に複数の環境のアプリをいれて動作確認をするというのはよくある話だと思いますが、確認する役割の人や確認依頼者がわかりやすいようにする。– 確認者がアプリ名は分けているけど時々間違う
– 依頼者がスキーマ分けているのに時々間違うというようなことを防ぐ。
# 対象
– 開発フェーズがある程度進んでしまっている *1
– `Build Config`で環境分けはしている
– リソース管理ライブラリは使ってない
– `Assets.xcassets`ファイルでアイコン定義をしている対象がちょっと限られていますが、同時に付け加えられるなら可能です。
新規開発の場合はリソース管理系のライブラリの導入を検討した方が良いかと思います。*1 リソース管理ライブラリなどを適用するには総合的に現実的ではないという状況
# やりかた
1.`Assets.xcassets`に必要な環境のイメージセットを`New iOS APP icon`を選択し追加*New iOS App icon*
![スクリーンショット 2020-01-21
【swift】画像を指定した比率でトリミングする【TOCropViewController】
#使用するライブラリ
[TOCropViewController](https://github.com/TimOliver/TOCropViewController)
>ユーザーがUIImageオブジェクトの一部を切り取ることができるiOS用のView Controllerを提供します。#目標
1.ボタンをタップすると、`UIImagePickerController`が起動する。
2.トリミングしたい画像をpickし、`UIImagePicker`を閉じる。
3.配置した`UIImageView`と同じ大きさにトリミングできる`CropViewController`が起動する。
4.トリミングを完了すると、`UIImageView`にトリミング編集した画像が反映する。(実装例)
![20200121_214939.GIF](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376004/be1ec78e-1a6a-0489-444f-efef385feac5.gif)#サンプルコード
“`sw
【SwiftUI】@Environmentを支える機能
# 基本的な記法
“`swift:sample.swift
@Enviroment(.\accessibilityEnabled) var accessibilityEnabled
“`# 関数定義
“`swift:definition.swift
@propertyWrapper public struct Environment: DynamicProperty {
@inlinable public init(_ keyPath: KeyPath(
@inlinable public var wrappedValue: Value { get }
}
“`# なぜ `@Enviroment` のように書けるのか
Swift5.1で追加された@propertyWrapperというattributeを型に付けると、@Environmentのようにアノテーションぽい記述を行うことができます。このマークを付けると、値のget set する際にpropertyWrapperをつけた型を経
iOSアプリ、Adhoc配信でもプッシュ通知は飛ばせます!飛ばないときのトラブルシューティング
## はじめに
今回、社内用にAdhocでプッシュ通知を伴うアプリをリリースしました。
結構証明書周りや署名、ビルド方法などが難しく、「Adhocではできない」と書かれたブログ記事も多くあったため、
ここに確認すると幸せになれる項目を書きます。
結論としては、Adhocでもプッシュ通知飛ばせます。
順不同に並べるので、不安なところを参考にしていただけたら幸いです。## 前提
– サーバサイドからFCMへプッシュを投げて、iOSで通知を受け取る流れ
– すでにWebのプッシュ通知は実装済みで、サーバサイド→FCMへの連携はできている状態
– xcode Version 11.2.1
– enterprise apple developer program ではなく、apple developer program に登録しています## ビルドする target の内容をチェック
– TARGETS の Signing & Capabilities タブで、Background Modes の Remote notifications にチェックがついていること
– Push
UIAlertController の title と message のパターン
毎回 title と message のどっちを設定するとどうなるかを忘れるので表にしてみました
style = actionSheet のときに `title あり/message = nil` と `title = nil/message あり` のパターンで後者の方がフォントが太くなるあたりが見どころです
## UIAlertController.Style.alert
| | not empty message | empty message | nil message |
|:-:|:-:|:-:|:-:|
| not empty title |![alertTextText](https://raw.githubusercontent.com/funnything/AlertPattern/master/outputs/alertTextText.png)|![alertTextEmpty](https://raw.githubusercontent.com/funnything/AlertPattern/master/outputs/alertTextEmpty.p
UITableViewでセルを選択不可にする方法
## 環境
swift 5
xcode 11.32020年1月20日現在
## 動機
簡単なのですが、すぐに忘れてしまうので。
メモメモ
## 方法
selectionがNoneになっていれば選択することができなくなります。
![スクリーンショット 2020-01-20 21.35.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270808/f03b0929-a6fc-48bf-f0b8-5bb4a9ddaf73.png)
![スクリーンショット 2020-01-20 21.35.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270808/0ad2fec8-8581-53b7-516d-9ad5a3c5edbe.png)
## コードだと
コードだと以下のように書くようです。
“`swift
self.tableView.allowsSelection = false
“`