iOS関連のことを調べてみた2020年02月04日

iOS関連のことを調べてみた2020年02月04日
目次

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`で中央揃えにする.

スクリーンショット 2020-02-03 午後10.00.26.png

元記事を表示

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内のイベント発生タイミングで処理を完結させられたら、イベントを通知する必

元記事を表示

#21 UIScrollViewの使い方1例

#はじめに
個人のメモ程度の出来なのであまり参考にしないで下さい.

#環境
Xcode:11.2.1
Swift:5.1.2
2019/11

##part1
`UINavigationBar`と検索する.

スクリーンショット 2020-02-03 午前0.24.22.png

##part2
`UINavigationBar`を`UIViewController`に追加する.

スクリーンショット 2020-02-03 午前0.24.36.pngアプリを初めて起動したときに画面の使い方を教えてくれるコーチマークを実装

# コーチマークとは

よくアプリを初めて起動したときに、画面の機能を紹介してくれるものです。

こういう感じに使い方を教えてくれます。

機能が多くなると、どうしてもUIが複雑になります。
そうすると、初めて触るユーザーは困惑してしまうかもしれません。
できるだけ、説明しなくても扱えるように設計するのが最善なのでしょうが、そうは言ってられないこともありますからね。
コーチマークを付ければ、初めて使うユーザーでもどのボタンを押せば何が起こるのかが、わかりやすくなります。

# ライブラリをインストール

いろいろあるのですが [ephread/Instructions](https://github.com/ephread/Instructions) を使ってみました。

“`:Podfile
pod ‘Instruct

元記事を表示

スマホアプリのUIデザインについて知っておきたいこと

# はじめに
スマホアプリのエンジニアとして、UIデザインについて知っておきたいことをまとめておきます。
自分用のリンク集のような意味合いが強いですがお役に立てば幸いです。

# 公式資料
一度は目を通しておきたい基本的で重要なドキュメントです。

### Apple
– [Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/)
– 現在は英語版しかないようです
– [Apple Design Resources](https://developer.apple.com/design/resources/)
– デザインツール用のテンプレートファイルなどがあります

### Google
– [Material Design](https://material.io/design/)
– こちらも現在は英語版しかなさそう
– [Android のマテリアル デザイン](https://developer.android.com/guide/topics/

元記事を表示

1つのTableViewに単一選択と複数選択のセクションを用意する

※開発環境: Xcode11.3/Swift5.1.3/端末(iPhone6s/iOS13.3)

# 経緯
とあるTableViewでセクションによって単一選択か複数選択かを分岐したい時ってありますよね。そうですよね、ええ、はい、あんまりないですよね。最近、初めて出会いました。
経験浅なので、セクション毎の設定とかできるんでしょうくらいに思っていたら、そんなものはなく、中々苦労したので今回取り上げました。

# ひとまず完成GIF
銭湯セクションのみ単一選択で、他のセクションは複数選択で設定しています。
銭湯の選出については適当です(おすすめがあればコメントください)。

# 実装方法
今回の表題に関係のない箇所は省きます。
一応Repositoryのリンクは載せておきます。
[SingleAndMultipleSelecti

元記事を表示

Google Maps SDK for iOS で現在地を表示

# はじめに

Google Maps SDK for iOS を使用する機会が多いので、
備忘録として Google Map をアプリ上に表示→現在地を表示するところまでをまとめておきたいと思います。

# 開発環境

– Xcode:11.1(11A1027)
– Swift 5
– iOS:13.1

# 実装

以下のような Step に分けて実装していきます

1. Google Maps SDK for iOS の Key を取得
2. Google Map をアプリ上に表示
3. 現在地を Map 上に表示

## 1. Google Maps SDK for iOS の Key を取得

[こちら](https://developers.google.com/maps/gmp-get-started)の手順に沿って API Key を取得します

## 2. Google Map をアプリ上に表示

[こちら](https://developers.google.com/maps/documentation/ios-sdk/start)に沿ってアプリ上に表示します

元記事を表示

[Swift4] カスタムViewを作って画面下からフェードイン・画面下へフェードアウトさせる方法

AppStoreで公開している[ShodoCAM](https://apps.apple.com/jp/app/shodocam/id1452049446)の開発をしていて,あるボタンを押すとカスタムViewが下から出てくるアニメーションを実装したかった.その後カスタムViewを下にフェードアウトさせる機能も実装する.

## 手順
1. カスタムViewのxibファイルを作る
2. カスタムViewクラスを作る
3. カスタムViewのxibとカスタムViewクラスを紐付け
4. カスタムViewのフェードイン・フェードアウト実装

### 1. カスタムViewのxibファイルを作る
xibとは(XML Interface Builder)の略で,アプリのUIとして使いまわせるカスタムViewを作るファイルです.StoryboradではアプリのあるView全体を作り,xibでUIのパーツを作って複数のViewで使い回すと覚えておけば良い.
xibファイルはコンパイルされてnibファイル(NeXTSTEP Interface Builder)に変換されるみたい.
[参考記事 (W

元記事を表示

【Storyboard】遅延初期化しているViewModelをDIしてViewControllerをテスト可能にする

# はじめに

ViewModelのinitializerに引数がある場合に、ViewController側で以下のような遅延初期化をすることが多々あります。
このViewControllerにViewModelを注入してテストをしたい場合に、どうすれば注入することができるようになるでしょうか。

本投稿では以下の2点を重視して、既存のプロジェクトでも導入できる方法を解説していきます。

– Storyboardを用いてViewControllerが初期化される
– ViewModelの既存のインターフェースを大きく変更しない

※ Combine.frameworkを利用していますが、RxSwiftでも同様の実装が応用できます。
※ GitHubで[ソースコード](https://github.com/marty-suzuki/LazyInitializedViewModelInjectionSample)も公開しています。

“`swift:ベースとなるViewControllerの実装
final class CounterViewController: UIViewContr

元記事を表示

UIButtonのsystemとcustomのデフォルトの挙動の違い

UIButtonのsystemとcustomのデフォルトの挙動(色変化など)について調べる

– normal
– highlighted
– disabled
– selected

の4状態について

– テキストのみ
– フォアグラウンドの画像を指定(normalに指定)、テキストなし
– バックグラウンドの画像を指定(normalに指定)、テキストあり

の3パターンを調べる。画像は彩度と明度を金融会社のイメージカラーぽくした緑色を用いる。

Xcode 11.3
シミュレータ iPhone8 iOS13.3

#Normal
![Normal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46631/0a378cfe-a377-e94d-98a6-2c20352e0f41.png)
左がsystem、右がcustom
上から、文字のみ、フォアグラウンド画像指定で文字なし。バックグラウンド画像指定で文字あり。

文字色はnormalが青、customが白。
systemのフォアグラウンド画像指定

元記事を表示

QRコードを使ったiOS端末とMac間のリンク共有

# はじめに

iOS端末から開発中のWebサイトを開きたい時に、iOS端末のブラウザでURLを直接入力するのは面倒ですよね。(例えば、Mac側でngrokで生成したリンクをモバイル端末で素早く開きたい時など)

これらを解決する方法としては、

* iCloud経由の同期
* Google Chrome経由の同期
* AirDrop経由のリンク共有

などがあります。(他にもあるかと思いますが。。)

ただ、iCloudやGoogle Chromeといったアカウント連携したものは個人の環境ではOKでも、会社で同じアカウント連携するのは面倒かもしれません。AirDropの場合はiOS端末側で設定を有効化すると利用できるため、割とリンク共有方法として手間がかからずに良いかなと思います。

ここでは、アカウント連携が不要な“`QRコードを使ったリンク共有“`について書きたいと思います

# 大まかな手順

単純に以下をやるだけです。

1. Mac側でURLを含むQRコードを生成する
2. iOS端末側でQRコードを読み込む

# Mac側でQRコードを生成

文字列をQRコード化する

元記事を表示

[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン ~Observer~

この記事シリーズは、iOS/Swiftエンジニアである執筆者個人が、
**ごく普通のiOSアプリ開発でよくある状況**や
**Swiftのコアライブラリやフレームワークで使われているパターン**に
着目してデザインパターンを学び直してみた記録です。

**関連記事一覧**
[[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン](https://qiita.com/y-some/items/96db5f24ded4a1fab48f)

# Observerパターン概要

– Observerとは「観察者」という意味です。
– **オブジェクトの状態が変化した際に、そのオブジェクト自身が、「観察者」に状態の変化を「通知」する仕組みです。**
– GoFのデザインパターンでは**振る舞いに関するパターン**に分類されます。
– iOSアプリ開発では、他のどのパターンよりも実用的なパターンと思います。

# 使い所

実務においては、ViewControllerにAPI通信やデータ取得/更新などのロジックを詰め込むとViewControllerが肥大化してしまい、保守性

元記事を表示

#20 TabBarControllerにTabを追加する1例

#はじめに
個人のメモ程度の出来なのであまり参考にしないで下さい.

#環境
Xcode:11.2.1
Swift:5.1.2
2019/11

##part1
プロジェクトに`UIViewController`を追加する.

スクリーンショット 2020-02-01 午後11.17.29.png

スクリーンショット 2020-02-01 午後11.17.54.png

##part2
`control`キーを押しながら`TabBar

元記事を表示

OTHERカテゴリの最新記事