- 1. [Swift5]ニコニコ動画やLINEにあるようなスクロールによって閉じたり開いたりするヘッダー
- 2. 【iOS】書類スキャンライブラリ「WeScan」の紹介と日本語化など
- 3. SwiftUIとRealmを連携してUIを自動更新する
- 4. iOSとmacのunityのnative pluginを作る
- 5. シャッター音なしのアプリを作ってみた
- 6. 【CocoaPods】iOSのライブラリをForkして使う
- 7. NavigationBarのBackボタンの見た目を変えずにイベントをつける
- 8. iOSアプリのライセンス生成ツール「LicensePlist」のセットアップ&操作方法
- 9. 【swift】まず簡単なリファクタリングをしよう【初心者向け】
- 10. Selector完全攻略、そして初学者特有のAddTarget()やAddObserver()のセレクタに変数を渡そうとする願望について
- 11. Flutterでパッケージ名がcom.exampleになっているのをiOS/Androidで修正する箇所まとめ
- 12. iOSでビルド時に自動生成するソースコードをGitで管理しないために
- 13. Apple Music API(MusicKit)のDeveloper Token取得方法
- 14. なぜiPhone 11 Pro では0.5の線が描画できないのか調べてみた
- 15. UITableViewCell の高さを UIImage のアスペクト比を元に決定する方法
- 16. #22 Labelのテキストに改行を入れて複数行で書く方法1例
- 17. bundle installしてもpermissionsエラーが起きるときの対処法
- 18. ObservableObject利用時のView更新タイミングを細かく制御する
- 19. キーボードの高さを取得する
- 20. 【iOS】図解解説!NotificationCenter
[Swift5]ニコニコ動画やLINEにあるようなスクロールによって閉じたり開いたりするヘッダー
# はじめに
**TableViewのスライドに同期して出てきたり閉じたりするヘッダーみたいなバー**は、主に検索やビューの切り替えなどに使われ**非常に便利なツール**です。簡単に実装できないかなぁとネットを探しまわったんですが、思い通りの情報が得られず結局自分で実装したので共有します。
少し複雑な内容になっていますが、初心者の人にも出来るだけ分かりやすく解説したいと思います。
意外と重宝しそうなツールほどネットに転がっていなかったりしますよね。
この記事が皆さんの助けになれば幸いです。!初投稿かつSwift初心者なので至らない点があるかもしれません。
(この記事を気に入った人は”いいね”して頂けるとモチベーション上がります)# 目次
– 環境
– 実行例
– 考え方
– 必要な値を取得
– 適切なヘッダーの状態を判断する
– ヘッダーの状態を元にヘッダーに対してスクロール処理をする
– 必要な値を更新する
– ソースコード
– コードを紐解く
– おわりに# 環境
– Xcode 11.2.1
– Swift5# 実行例
!
【iOS】書類スキャンライブラリ「WeScan」の紹介と日本語化など
# WeScanとは
>WeScan makes it easy to add scanning functionalities to your iOS app! It’s modelled after UIImagePickerController, which makes it a breeze to use.
https://github.com/WeTransfer/WeScan
![wescan2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272677/587acb70-35da-e338-cdb7-28d6ae5226e7.gif)このように、カメラやローカルの画像を取り込んで書類っぽい部分をcropできるライブラリ。例えば[Evernote Scannable](https://help.evernote.com/hc/ja/articles/208430668-Evernote-Scannable-%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3
SwiftUIとRealmを連携してUIを自動更新する
## はじめに
SwiftUIとRealmを連携してライブアップデートを効かせる方法を記載します。
### 要点
– Realmオブジェクトはライブアップデート機能を備えており、該当のインスタンスは常に最新の値で更新されている
– Realmオブジェクトを `@Published` で保持したとしても、値に変更があった際に自動で更新されるようにはならない
– observeメソッドを利用してSwiftUIに再レンダリングの指示を与えることで、常に最新の値がUIに反映されるようにすることができる## Realmのインストール
RealmはSwiftPackageManagerに対応しているので、今回はこれを利用してインストールします
1. Dependencyを追加する
2. realm-
iOSとmacのunityのnative pluginを作る
# iOSとmacのunityのnative pluginを作る
unity editorで使えるmacOS用のbundleとiOS用のFrameworkのnative pluginを作成する手順です。
Bluetoothや動画作成など、**Unityに実装されていない機能**をiOS, macOSの機能を使うことで実現します。
[UnityPluginXcodeTemplate](https://github.com/fuziki/UnityPluginXcodeTemplate)をベースに作成します。
UnityPluginXcodeTemplateを使うことで、unityのnative pluginを作成するために必要なxcodeの複雑な設定の必要がなくなり、editorで動作確認できるbundleと実機用のframeworkが同時に開発できます。### 今回作成するnative pluginの目的
* unity(C#)には加算演算が実装されていない(設定)です。そこで、swiftの加算演算子を使って加算演算を実現するnative pluginを実装します。
* 手順に着目
シャッター音なしのアプリを作ってみた
# 作るに至ったわけ
日本や韓国などではスマホ(ケータイ含め)で写真を撮影しようとするとシャッター音が鳴りますが、海外で販売されたスマホ(iPhone含め)はシャッター音は鳴りません。インスタなどでレストランなどの静かなところで撮影する時など、あの音が鳴ると気を使いますよね。マナーからだという意見もありますが、スクリーンショットもなる必要はありません。法律で決まってるわけでないので、徐々にこの慣習がなくなっていくといいのになと思います。
というわけで、iOS向けにマナーモード時はシャッター音がならないカメラアプリを作ってみました。
# 無音カメラを作る方法
– ビデオ撮影モードで静止画をキャプチャする方法
割とこの方法は一般的なようでぐぐると多く見つかります。ただ、静止画モードではないため解像度が劣ったりといろいろ制限があります。
– 逆位相の音を再生する方法
ノイズキャンセリングと同じ方法ですが、ジャストのタイミングで再生しないといけないため、難易度は高いようです。
– シャッター音のサウンドファイルを削除する方法
Jailbreakしかできません。
などなど。今回
【CocoaPods】iOSのライブラリをForkして使う
iOSアプリのライブラリを一部カスタマイズして使う機会があったので。
# フォーク
まず普通にFork。
https://help.github.com/ja/github/getting-started-with-github/fork-a-repo
GitHub公式練習用リポジトリ[Spoon-Knife](https://github.com/octocat/Spoon-Knife)を使って説明。このボタンを押して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272677/4ab2c658-2d75-68cc-59c5-b38f67ab5487.png)
こうなれば成功。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272677/127e8f4d-cf79-016f-8bb2-13d236845d46.png)Fork元の変更を楽に取り込むローカル構成手順もあるが割愛
NavigationBarのBackボタンの見た目を変えずにイベントをつける
# はじめに
久々に投稿します!NavigationBarの「<」Backボタンにイベントをつけたいと思い、調査をしましたが 見た目を変えずにイベントを付与することができる情報がなかなか見つからなかったので 備忘としてまとめてみます:point_up: :warning::warning:**iOS12以上をサポートしている前提で調査をしたため、SwiftUIは使用していません。**:warning::warning: # 開発環境 以下の環境で開発しました。 |Tool|Version| |:-:|:-:| |Xcode|11.2.1 (11B500)| # やりたいこと 今回実現したいことは以下の通りです。 1. NavigationBarのBackボタンタップ時にアラートを表示したい 2. Backボタンの見た目は変えたくない 3. Backボタンで戻る際のアニメーションも変えたくない 1番のみであれば、Backボタンを非表示にしてleftBarButtonItemに自作のBackボタンを追加すれば実現できそうですが、 2番3番の見た目を変えないというのが難しい
iOSアプリのライセンス生成ツール「LicensePlist」のセットアップ&操作方法
## はじめに
ライセンス表示を手動で実装するのが手間なので、導入することにしました。
## 「LicensePlist」とは?
CarthageとCocoaPods、SwiftPMで管理しているライブラリのライセンス表示を自動的に生成するツールです。
設定ファイルを用意することで、任意のライブラリに対しても生成できるようです。## 環境
– OS:macOS Mojave 10.14.6
– Swift:5.1.3
– Xcode:11.3.1 (11C504)
– LicensePlist:2.12.0## セットアップ
### LicensePlistのインストール
[Mint](https://github.com/yonaskolb/Mint)からインストールします。
“`diff:Mintfile
+ mono0926/LicensePlist@2.12.0
“`“`shell-session
$ mint bootstrap
“`その他の方法でインストールするには、公式ドキュメントをご参照ください。
https://github.co
【swift】まず簡単なリファクタリングをしよう【初心者向け】
#なぜ簡単なリファクタリングをするのか?
1.簡単なリファクタリングだけでも、コードの可読性が激増する。
2.難しい文法でリファクタリングをしようとすると、挫折する。
3.すぐ終わる。#大事なこと?
###たまにリファクタリングをしたほうがいい。
リファクタリングで
– 開発のしやすさ。
– 説明のしやすさ。
– コード修正のしやすさ。を手に入れましょう✨
>- 説明のしやすさ。
これは、特に大事です。
誰かにアドバイスをもらうためコードを添付する際、
自分ですら読めないコードを誰が読めるのでしょう。#リファクタリングしないと??
初心者の方は初めてのアプリ(ポートフォリオなど)を作成する際、
『文法とかコードの可読性とかどうでもいいからとりあえず完成させたい!』という気持ちがあると思います。しかし、コードが増えれば増えるほど
– 以前書いたコードが理解できない
– 変数名、メソッド名がパッと見わからないなどの問題が発生します。
#簡単なリファクタリング集
###わかりやすい命名をする
– [codic](https://codic.jp/)を使っ
Selector完全攻略、そして初学者特有のAddTarget()やAddObserver()のセレクタに変数を渡そうとする願望について
[前回の記事](https://qiita.com/eg_19_/items/ab76494ce6e33a90371e)はNotificationCenterの基本でした。
その中で、難易度的に省いたトピックを今回書きます。偉く長いタイトルにしましたが、トピックとしては二点で、
– Selectorの話
– AddTarget()/AddObserver()に変数渡したいときどうするかを扱います。
# 実行環境
Swift: 5.1.3
Xcode: 11.3.1# Selector完全攻略
NotificationCenterのAddObserver()の引数の中に、Selectorが出てきます。
このSelector、僕はUI部品にAddTarget()するときの引数で最初に遭遇して、**かなり扱いに苦しみました。**“`swift:addTarget例
let button = UIButton()
button.addTarget(self, action: #selector(somefunction), for: .touchUpInside)@o
Flutterでパッケージ名がcom.exampleになっているのをiOS/Androidで修正する箇所まとめ
# はじめに
flutterでプロジェクトを新しく作成するとき、“`
flutter create my_app_name
“`とすると、Package Name/Bundle Identifier は自動的に `com.example.my_app_name` のように指定されてしまいます。リリースに向けて開発を進めるのであればパッケージ名を正しく修正する必要があるので、その修正箇所をまとめておきます。
# Android
### 1. android/app/src/AndroidManifest.xml
– 3行目: package
– 8行目: android:label“`xml
iOSでビルド時に自動生成するソースコードをGitで管理しないために
## はじめに
iOSアプリ開発において、リソースにタイプセーフにアクセスするためのソースコードを自動生成する [SwiftGen](https://github.com/SwiftGen/SwiftGen) や [R.swift](https://github.com/mac-cain13/R.swift) のようなツールをよく利用すると思いますが、みなさんはその自動生成されたソースコードは Git 管理下においていますか?私の開発中のアプリではこれまで Git 管理下においていたのですが、アプリの要件により次のような状況になりました。
– Build Configuration に応じて自動生成されるコードに違いが出るようになった
– ソースコード以外にも Build Configuration に応じてアプリにバンドルさせるファイルを切り替える必要性がでてきたこのような状況ですと、Build Configuration によってファイルが変化してしまうため、ビルド時に自動生成するファイルは Git 管理下におかないようにしました。が、その中でつまづきポイントがあったので
Apple Music API(MusicKit)のDeveloper Token取得方法
いつも忘れてググって色んなサイト飛んだりするので、自分の備忘録として書いておく
## Apple Developerページでの作業
https://developer.apple.com/account/
### Music IDを取得
1. Developer Accountの証明書等々の[一覧ページ](https://developer.apple.com/account/resources/certificates/list)にいく
2. `Identifiers`の**+**ボタンより `Music IDs`を選択
3. `Description`, `Identifier `を入力し、作成
### MusicKit用の秘密鍵を作成
1. [Keys](https://developer.apple.com/account/resources/authkeys/list)ページで**+**ボタンより作成
2. `Key Name`を入力し、`Music Kit`の**configure**ボタンで紐付けたい`Music ID`を設定
3. **Regis
なぜiPhone 11 Pro では0.5の線が描画できないのか調べてみた
## 環境
– Xcode 11.3
## 何が起こったのか
いつもどおり 0.5 の線を引くために Storyboard の AutoLayout で `Height = 0.5` の制約を指定した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8292/236f2f05-72e1-d2f8-f35f-95285b181af2.png)
すると、デザイナーから「線の太さにばらつきがあるので揃えてほしい」と指摘があった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8292/84c6ed07-e194-f998-796d-1cb8b2d3e3c4.png)
↑たしかによく見ると上の線のほうが若干濃くも見える・・。両方とも 0.5 で指定しているが、念のため次のコードを書いて height を出力してみた。
“`swift
print(separator1.frame.
UITableViewCell の高さを UIImage のアスペクト比を元に決定する方法
# はじめに
UITableViewCell にセットする画像のアスペクト比が固定ではない場合、セルの高さの決め方を工夫する必要があります。今回はその方法の一つとして、 AutoLayout を用いた解決策を示します。# 解決策
“`swift
final class CustomTableViewCell: UITableViewCell {
@IBOutlet private weak var mainImageView: UIImageView!private var aspectConstraint: NSLayoutConstraint? {
didSet {
if let value = oldValue {
mainImageView.removeConstraint(value)
}
if let constraint = aspectConstraint {
mainImage
#22 Labelのテキストに改行を入れて複数行で書く方法1例
#はじめに
個人のメモ程度の出来なのであまり参考にしないで下さい.#環境
Xcode:11.2.1
Swift:5.1.2
2019/11##part1
`Lines`を0にして,テキスト入力時に`control`キーと`q`キーを押しながら`Enter`キーを押す.
`Alignment`で中央揃えにする.
bundle installしてもpermissionsエラーが起きるときの対処法
#目的
iOSのアプリを複数人で開発するときにbundlerでCocoaPodsのバージョンを管理していると思います。僕は普段個人でアプリ開発をやっていて複数人で開発するのは初めてなので、rbenvとbundlerをインストールしていたのですが、bundlerをインストールする際に以下のようなエラーが出て解決するのにだいぶ時間がかかってしまいました。
“`
$ gem install bundler
ERROR: While executing gem … (Gem::FilePermissionError)
You don’t have write permissions for the /Library/Ruby/Gems/2.6.0 directory.
“`“`
$ bundler -v
Traceback (most recent call last):
2: from /usr/bin/bundler:23:in `‘
1: from /Library/Ruby/Site/2.6.0/rubygems.rb:303:in `a
ObservableObject利用時のView更新タイミングを細かく制御する
## 要点
– Publishedは使わず、ObservableObjectプロトコルで宣言されているobjectWillChangeを使って実装する
– Viewを更新したいタイミングでのみ、objectWillChangeのsendメソッドを呼ぶことで更新タイミングをコントロールできる## Publishedを使うパターン
SwiftUIでは、View内で`@State`プロパティを定義して状態管理を行う方法の他に、別クラスに状態変数を集めて管理する方法もあります。
これは `ObservableObject` と `@Published` を組み合わせて使うやり方が一般的で、以下の実装手順で実現することが可能です。**実装手順**
1. ObservableObjectに準拠させたクラスを定義
2. 状態の変更に応じてViewを更新させたいプロパティに `@Published` を与える
3. View側では1.のインスタンスをプロパティに保持しておき、`@ObservedObject` のアノテーションを付与する
→ `@Published`を付与したプロパティに更新
キーボードの高さを取得する
よく使うけど変換の仕方を忘れがちなので、備忘録として残しておく。
“`swift
@objc func keyboardDidChangeFrame(_ note: Notification) {guard
let value: Any = note.userInfo?[UIResponder.keyboardFrameEndUserInfoKey],
let frameValue: NSValue = value as? NSValue else
{ return }
let frame: CGRect = frameValue.cgRectValue
// https://developer.apple.com/documentation/uikit/uicoordinatespace/1622661-convert
let convertedFrame: CGRect = view.convert(frameEnd, from:
【iOS】図解解説!NotificationCenter
NotificationCenter、わかったつもりでいざ使おうとしたら全然わかってなかったので、記事書きます。
# 対象
– iOS開発初心者
– NotificationCenterが何かわかってない人
– NotificationCenterの名前は知っているが、イマイチ理解し切れていない人# 前提として
コードに入る前に、NotificationCenterに関わる登場人物を整理させてください。## なぜNotificationCenterか
NotificationCenterはイベント通知の仕組みです。![名称未設定.002.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333454/3acdfc13-cf44-8268-1812-e99c3d546eb8.jpeg)
登場人物はObserverとSubjectという二つのクラスです。
Subjectはイベントの発生を通知するクラスです。
Subject内のイベント発生タイミングで処理を完結させられたら、イベントを通知する必