iOS関連のことを調べてみた2021年11月22日

iOS関連のことを調べてみた2021年11月22日

【炎上、解消。】荒れたコメントや記事を見たくない人のためのアプリ

#はじめに
**技術的な内容のみをご覧になりたい方は[こちら](#技術的なポイント)からどうぞ**

[](https://tokiwaproject.page.link/mute)

[以前の記事](https://qiita.com/KokumaruGarasu/items/3ca4c0c7f8bc83b28645)でも紹介したアプリ「ミュート」に**Yahooニュースなど各種サイトでのコメント欄非表示**の機能を追加しました。コメントでの誹謗中傷は話題になっていたのでそれに対応した形になります。今回はその詳細と、以前の記事で伝えきれていなかった部分をご紹介したいと思います。

**ダウンロードはこちらから**

https://tokiwaproject.page.link/mute

#追加した機能

##コメント欄

元記事を表示

[SwiftUI]ScrollViewの副作用を抑制する

## 0. 概要

SwiftUIのScrollViewには副作用があり、ビューの配置の仕方によって周囲のビューの動作が決定します。
例えば、次のようなコードはScrollViewの中のTextのみならずNaviagtionのタイトルも連動してスクロールするようになります。

“`swift
struct ContentView: View {
var body: some View {
NavigationView {
ScrollView {
Text(“view”)
}
.navigationTitle(“Title”)
.navigationBarTitleDisplayMode(.large)
}
}
}
“`

![Simulator Screen Recording – iPhone 13 mini – 2021-11-21 at 16.54.13.gif](https://qiita-im

元記事を表示

SwiftUIでUIKitのビューの装飾をするためにUIAppearanceを使うのは間違っている

SwiftUIはツールバーの背景色を変えることができません。
この問題に対応するために、`UIAppearance `を利用する記事が散見されます。
実際、次のようなコードを書くことでTabViewの背景色を変えることができます。

“`swift
struct ContentView: View {
var body: some View {
NavigationView {
Text(“button”)
.toolbar {
ToolbarItem(placement: .bottomBar){
Text(“Item”)
}
}
}
.onAppear {
UIToolbar.appearance().backgroundColor = UIColor.blue
}
}
}
“`

![CleanSho

元記事を表示

iOSアプリでFirebaseによるGoogleサインインの実装方法(初心者向け)

# 記事作成のきっかけ

新たに作成したiOSアプリにFirebaseによるGoogleサインインの実装をするにあたり、以前作成していたiOSのアプリで実装していた内容をそのまま移行しようとしたがうまくいかず、あらためて[Firebaseのドキュメント](https://firebase.google.com/docs/auth/ios/google-signin?authuser=0#swift_5)に基づいて実装をすることにしました。

ドキュメントを見てもよくわからないという方が対象です。正しく実装するにはドキュメントを参照いただくのが最も正しいやり方となります。エラーハンドリングはかなり割愛しています。ご注意ください?

以前参照した記事の通りに実装しているつもりが、エラーメッセージが出力される状態でした。
Firebaseのドキュメント通りに実装している記事が見当たらなかったためこちらに投稿することにしました。
どなたかのお役に立てれば幸いです。

## 実装手順
1.Firebaseにプロジェクトを作成する。
2.Xcodeで新たなプロジェクトを作成する。
3.Goog

元記事を表示

【iOS】仕様変更に強いif文の書き方 〜 enumを使ってSwiftらしく書く 〜

今回は、enum型を使ってSwiftらしいif文の書き方を記事にしてみました。

## この記事で学べること
– いつものif文をenumを利用してSwiftらしくスマートに書く方法
– 仕様変更に強いif文の書き方

## サンプルコード
### 仕様
今回はサンプルとして、APIなどの外部リソースから都道府県の文字列を取得したと仮定します。
その上で、都道府県が`”Tokyo”`or`”Osaka”`の場合とそれ以外の都道府県で処理を分岐したいという仕様にします。

### enumを一切使わないif文の場合
“`swift
if city == “Tokyo” || city == “Osaka” {
print(“特定の都市が入力されました”)
} else {
print(“特定の都市以外が入力されました”)
}
“`

この書き方でも処理的な問題はないが、この書き方で書かれているコードがプロジェクトに複数箇所あると、
`「都道府県名を大文字に変更してください」`
という仕様変更が発生した場合、該当箇所を全部修正する必要があります。
その過程でプログラマー

元記事を表示

Xcode 13でSwiftプロジェクトをローカライズ(翻訳)

以前、Xcodeにはローカリゼーションをエクスポート / インポートする機能がありましたが、外部のXLIFFエディターが必要でした。WWDC 2021でリリースされたXcode 13には、ローカリゼーション用のエディターが組み込まれています。

この記事では、Xcode 13におけるローカリゼーションのフローについて説明します。

## セットアップ

Xcodeは、既定の開発言語(アプリを開発している時に使用する言語)として英語を使用しています。これは日本語に変更することができます。
[Development language の変更](https://qiita.com/MaShunzhe/items/86200a5c03817497ac29#development-language-の変更)

また、[アプリの翻訳先言語も指定する必要があります。](https://qiita.com/MaShunzhe/items/86200a5c03817497ac29#新しい言語の追加).

## ローカライズ可能な文字列をマークする

SwiftUIビューでは、よく使用される多くのビュー

元記事を表示

Fastlaneでアプリのスクリーンショットを自動化してみた

## はじめに
1つ前の記事で、FastlaneでXCTestを自動化するという記事を書いたのですが、今回はその続きでアプリのスクリーンショットを自動化する記事を書いてみました。

https://qiita.com/ctnc_67/items/e5e0bae431b3025f4255

Fastlaneをこれから導入するという方は、Fastlane導入については前記事をご参照ください。
今回はsnapshotを撮るところだけに焦点を当てていきます。

あと、前提としてプロジェクトにXCUITestは導入されている前提で進めます。

## この記事で学べること
– snapshotとは?
– アプリのスクショの自動化(スナップショット)
– スクショ自動化のための細かいオプション

## Snapshot導入
### fastlaneのsnapshotとは
アプリのスクリーンショットを自分で実機やシュミレーターを操作しながら取得する作業を自動化してくれるツールです。

スマホアプリ開発において「色々な大きさの機種のスクショを全画面取得せよ!」なんていうミッションは、よく課せられると思い

元記事を表示

expoでiOSシュミレーターが開けない

ひさしぶりに環境の再構築をして[expo](https://expo.dev/)をインストールしたら下記のような表示が出てiOSシュミレータが起動しません。Xcodeはすでにインストール済みです。

“`
› Opening on iOS…
✔ Xcode needs to be installed (don’t worry, you won’t have to use it),
would you like to continue to the App Store? … (Y/n)
Unable to verify Xcode and Simulator installation.
“`

`xcode-select –install`をしてもすでにインストール済みと表示されます。

“`
❯ xcode-select –install
xcode-select: error: command line tools are already installed,
use “Software Update” to install updates
“`

## 解決方法

元記事を表示

iPhone iOS 15.1 の出力音質を引き上げる設定

iPhone iOS 15.1 の出力音質を引き上げる設定についてメモします。
iOS 15.1 はデフォルト設定では最高音質にはならないことがあり、以下のように設定変更が必要です。

## 前提条件

このメモは以下の環境で確認および記述しました。

* iPhone `iOS` `15.1` (iPhone SE 第一世代)
* iPad mini 4 でも動作確認実施済み
* iPhone SE 第二世代において動作確認実施済み
* `Roland Rubix22` (USB接続オーディオインタフェース)
* [Ruelen: iPhone Lightning – USBカメラアダプタ](https://www.amazon.co.jp/gp/product/B09C5DZC28) (手元にあったのでこれを利用。動作保証するものではありません)

# iPhone と DAC (Roland Rubix22) とを接続する

* iPhone と DAC とを接続します。
* 私は [Ruelen: iPhone Lightning – USBカメラアダプタ](h

元記事を表示

UIViewのドラッグ (生)

タップ検知方法は、
生のタップ情報から任意イベントを検知をする自由度が高い方法と、
UIGestureRecognizerが用意した基本タップイベントのテンプレートを使う方法
の主に二つがあるが、
前者の生でもドラッグ検知だけなら簡単ということがわかったので、試してみた。

## 実装

“`DraggableView.swift
import UIKit

// ドラッグだけ実装したヴュー
class DraggableView: UIView {
// ドラッグ検知メソッド
override func touchesMoved(_ touches: Set, with event: UIEvent?) {
guard let touch = touches.first else {// このビューへのタップ取得。ちなみにデフォルトではマルチタップのプロパティはfalseになってるので、ここではfirstのみ考えればおk。
assert(false)
}
let loc = t

元記事を表示

UIViewのドラッグ (UIGestureRecognizer)

タップイベント検知は、
生のタップイベント情報を操作するゴリゴリの方法もあるが、
基本的なタップイベントに関してはUIGestureRecognizerがテンプレートを用意してくれているので、使えるときはそちらを使いたい。

ドラッグに関しては、UIPanGestureRecognizerと言うテンプレートが用意されている。

# 実装
UIGestureRecognizerにアクションを設定して、Viewに持たせればおk。

“`ViewController.swift
import UIKit

class ViewController: UIViewController {

@IBOutlet weak var draggableView: UIView!

override func viewDidLoad() {
super.viewDidLoad()

let pGR = UIPanGestureRecognizer(target: self, action: #selector(dragging

元記事を表示

UIViewControllerのviewにxibを使用する

# 概要
xibfileから、UIViewControllerのviewのoutletを紐付ける。

# 手順
1.xibfileのfile’s ownerをViewControllerに指定する。これで、ViewControllerのviewのoutletがxibfile側から見えるようになる。
2.ViewControllerのviewのoutletに、xibfileのrootviewを紐付ける。
3.storyboardに紐づいているViewControllerの場合、storyboard側の実装が優先されるので、storyboard側ではViewControllerのviewを削除しておく。
Frameworks/dp/1492074616![スクリーンショット 2021-04-24 18.36.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252245/2658a1a6-f504-03dd-d855-1218026f4367.png)

# 感想
こういうやり方もあるのかーと言った感じ。

元記事を表示

ios概論: View

# はじめに
iosの仕組みを概要的に説明することがモチベーションです。
想定読者はios〜中級者です。
仕組みをわかって実装するための、最低限の知識が体系的に得られるといいなあと思っております。

間違っていたらご指摘していただけると嬉しいです。
また、修正・追加して欲しい内容などございましたらこれもご指摘いただけるとありがたいです。

構成は以下になります。
1.View
2.Draw
3.Animation
4.Touch

Viewの根幹となる描画機能を3章まで説明し、最後にタッチ機能を説明します。

# 全体観
UIViewとはなんでしょうか?
ドキュメントを見てみると、たくさんのクラスやプロトコルから構成されているのがわかります。

https://developer.apple.com/documentation/uikit/uiview

![スクリーンショット 2021-04-25 17.11.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252245/072169

元記事を表示

iOS概論

# 目次
[1. View](https://qiita.com/Zousaaaaaan/items/1d32dece850d1be707e9)
2. Inteface ※準備中
3. Framwork ※準備中

# モチベーション

まず、きっかけから話します。

わからない時にその都度調べるというのが、大部分のプログラマーの知識の獲得方法かと思います。
しかし、それでは体系的な知識が身に付いていかない体感があったので、ios業務のために一冊オライリーの参考書を読むことにしました。
結果、結構良かったです。体系的な知識が身に付きました。
また、本という枠に入った知識を知ることで必要な知識の輪郭が明確になった感じがしました。
これは個人的にはとても良くて、”技術者としての最低限知識はこの範囲。これ以上は都度調べればOK”と安心して割り切れるようになりました。

ということで本記事のモチベーションですが、
iosの仕組みを概要的に説明することです。
細かい実装テクニックなどは他の記事に任せて、仕組みをだーっと書いていきます。
また、ほぼ参考書からの知識になりますが、大

元記事を表示

コードで作るContainer View Controller

# はじめに
この記事の目的は、コードから、Container View Controllerを作れるようになることです。
子ViewControllerが一つである単純な例で説明を行います。
参考文献の書籍の内容です。

# Container View Controllerとは
UINavigationControllerやUITabBarControllerなどといった、ViewControllerヒエラルキーの親子関係の親になり、子ViewControllerのviewを表示するViewControllerのことです。

androidだとFragmentを持つActivityのようなものです。

# 方法
UIViewControllerでは、子ViewControllerを格納するための`children`プロパティが用意されていますが、プロパティを直接扱うことは非推奨です。
childrenプロパティに子ViewControllerを格納するには決まったお作法があり、技術書によれば、作法を破ると手痛い仕打ち(バグ)を受けるとのこと。
つまり、Container View

元記事を表示

[iOS]Cell, UIViewに影・丸み・輪郭線を追加すると角が影の上にはみ出てしまう / 影の表示のパフォーマンス改善

## はみ出てしまう事象

ポイントとしては、影を設定したLayer(が属するView)の上にさらにCellのcontentViewなど別のUIViewがあるとその角が影の上にはみ出してしまいます。

cell自体に影を設定した場合は、cellの上のcontentViewの`layer.masksToBounds` を`true`とすることで、はみ出しを防止できます。

“`swift:UIView+Layer.swift
import UIKit

public extension UIView {
/// 丸みの設定
func setUpRoundness(_ cornerRadius: CGFloat = 5.0) {
layer.cornerRadius = cornerRadius
}

/// 輪郭線の設定
func setUpBorderLine() {
layer.borderColor = ColorName.lightGrayMinus.color.cgColor
layer

元記事を表示

SFSymbolsが潰れて表示されるとき

SFSymbolsがこのように潰れて表示されてしまうときはどうするのか(UIKit)、メモしておきます。

![スクリーンショット 2021-11-19 12.28.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505421/cbe7840a-04d2-ad0e-ebcf-6cd6f27c1f8c.png)

“`swift
private func createImage(parentView: UIView, imageName: String) {
let imageView = UIImageView()
imageView.image = UIImage(systemName: imageName)
imageView.frame = CGRect(x: 10, y: 12, width: 40, height: 40)
parentView.addSubview(imageView)
}
“`

## 対処法

設定

元記事を表示

【Swift】UIImagePickerControllerで簡単カメラ連携

# やりたいこと
カメラで写真を撮影して、その写真をアプリ内で使いたい。

# 環境
– Xcode 13.1
– Swift 5

# 準備
カメラを使う際は、info.plist の Camera Usage Description を定義しておく必要があります。
![スクリーンショット 2021-11-18 18.53.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367596/35a9133d-388d-875d-9a22-acdd472ad7df.png)

# 処理概要
1. カメラのアクセス権限確認
1. UIImagePickerController のインスタンス生成、カメラ起動
1. Delegateで撮影した写真を受け取る

# ソースコード

“`swift:SampleViewController.swift
class SampleViewController: UIViewController {
/// ボタンタップでカメラを起動する
@IBAct

元記事を表示

2点のCGPointからCGRectを作る

任意の2点で構成される四角形を作る場合、よく`(p1.x – p0.x, p1.y – p0.y)`をsizeとしてCGRectを生成することがあるが、CGRectのunionを利用することで計算を手書きせずに簡単に作ることができる。

“`swift
let r0 = CGRect(origin: p0, size: .zero)
let r1 = CGRect(origin: p1, size: .zero)
let rect = r0.union(r1).standardized
“`

unionは2つのCGRectを構成する最小のCGRectを生成する関数で、これを利用して座標だけを持つCGRect2つをunionさせて四角形を計算させる。

元記事を表示

iOSのショートカットとGASを使って紙のお知らせの保存&リマインダー機能を作った #iOSショートカット #紙の電子化

##まずはこれを見てほしい
![cSVGr4qw.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2143015/df09c3e9-7c50-7494-058d-2d6396f56387.jpeg)
我が子の保育園から貰うお知らせです。
ふむふむ、11/22までにボーダー柄の服とビニール袋をお持ちせよ。とな?
良し、期限まで時間もあるし、とりあえず置いておこう **←絶対忘れるやつ**

というわけで、LINEやメールが主流になった昨今ですが、まだまだ紙でのお知らせはたくさん来ると思います。紙なので埋もれやすいし**それ自体が邪魔になると思う**人も多いのではないでしょうか。私のことです。
携帯に記録しておくにも入力が面倒ですし、案外大事な情報が載っていたりするので紙のまま置いておいた方がよかったりします。

**こんな面倒ごとを、iOSのショートカット、Dropbox、Google Apps Script、LINE Notifyを駆使して解消してみました。**

##完成品
お知らせをカメラで撮影し

元記事を表示

OTHERカテゴリの最新記事