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

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

[Swift] var-forパターンを避けよう

# はじめに

**var-forパターン**は既存の言葉ではありません。
このアンチパターンよく見かけるので自分で**var-forパターンと勝手に命名**しました。
コードレビューとかで**「これvar-forパターンだよね」**という感じで使えるかもしれません。

本記事の内容はSwiftの初心者向けです。

# var-forパターンとは

以下のような**一時変数varとfor文(forEach、while、repeat-whileなども含む)**を利用したロジックです。

“`swift
// 1から10までの整数を3倍して、6の倍数のみの配列を生成
var result = [Int]()
for number in 1…10 {
let tripleNumber = number * 3
if tripleNumber % 6 == 0 {
result += [tripleNumber]
}
}
“`

## var-forパターンの置き換え

たいていのvar-forパターンは以下のようにmapやcompactMap

元記事を表示

【厳選】これだけは覚えておきたいXcodeショートカットまとめ

#コード編集
| ショートカットキー | 結果 |
|:—————–|——————:|
| Cmd + I | インデント整理 |
| Cmd + / | コメントアウト |
| Cmd + Click(※) | 定義へ移動 |
| Opt + Click | Quick Help(リファレンス) |
| Cmd + Ctr + E | ファイル内変数のRename |
| Cmd + Ctr + ← | ジャンプ前のコードに戻る |
| Cmd + Ctr + → | 進む(上記の逆) |
| Opt + ← | 左の単語にカーソル移動 |
| Opt + →

元記事を表示

【Swift】スコープについて

##スコープの種類
スコープは以下の2種類に分類することができる
・ ローカルスコープ
・ グローバルスコープ

##ローカルスコープ
`if`や`for`などの制御構文や関数内で定義されるスコープ
制御構文や関数内などで定義された定数・変数はその外部から使用することができない

#### 制御構文の例

“`.swift
if true {

// hoge関数内で定数a、変数bを宣言
let a = 100
var b = 200

}

print(a) // エラー!
print(b) // エラー!
“`

上記の様に、制御構文内で定義された(= ローカルスコープ)定数や変数を関数外で使用することはできない

“`.swift
if true {

// hoge関数内で定数a、変数bを宣言
let a = 100
var b = 200

print(a) // -> 100
print(b) // -> 200
}
“`
上記の様に、関数内であれば使用することができる

##

元記事を表示

【iOS】 ReactorKitでStoryboardを使う方法

## 経緯
[ReactorKit](https://github.com/ReactorKit/ReactorKit)を使っているプロジェクトでStoryboardでレイアウトした画面を表示させたら画面に何も表示されなかったので原因を調べてみた

## 対応方法
最初はbind内でloadView()を呼んでViewの生成を行っていたがStoryboardを使っているのにloadView()を呼びたくないとおもい公式ドキュメントを調べてみたらそれ用のプロトコルが用意されていた

“`swift
func bind(reactor: Reactor) {
loadView()
}
“`

以下のようにStoryboardViewプロトコルを使用するとViewの生成が行われ画面が表示された

“`swift
class MyViewController: UIViewController, StoryboardView {
func bind(reactor: MyViewReactor) {
// this is called after the view is

元記事を表示

遷移先でdismissした後に画面更新したい場合

iOS13からModalで画面遷移をする際にフルスクリーンではなくシート型に変更になりました。この場合、UIとしては格好いい(スワイプで閉じられる)のですが、遷移元の画面更新をviewWillAppearでやっていた場合、iOS13では呼ばれなくなりました。

# 対応策

遷移先のViewControllerのなかで下記のメソッドを呼んでやる必要があります。iOS12で呼ぶと二重で実行されてしまうので、実行をiOS13以上にしてやる必要があります。

“`swift:
override func viewWillAppear(_ animated: Bool) {

if #available(iOS 13.0, *) {
presentingViewController?.beginAppearanceTransition(false, animated: animated)
}

super.viewWillAppear(animated)

}

override func viewWillDisappear(

元記事を表示

Swift でショートムービ(動画)を再生する

# はじめに

AVPlayer を使って動画を再生できるように実装していきます。
より詳細な情報は下記で載せました。

– https://yamato8010.hatenablog.com/entry/2020/07/26/214009

# 動画を表示するためのクラス作成

まずは動画を再生するために、`AVPlayerLayer` を `layerClass` とする UIView のサブクラスを
作成していきます。

“`swift
class VideoPlayerView: UIView {
private var playerLayer: AVPlayerLayer? {
return layer as? AVPlayerLayer
}

// Override UIView property
override static var layerClass: AnyClass {
return AVPlayerLayer.self
}
}
“`

# `VideoPlayerView` に Pro

元記事を表示

実はiOSのWebView内のHTTPSリクエストは傍受できる(URLProtocol)

Chromeの開発ツールにはnetworkという項目があり,ブラウザでサイトにアクセスしたときのHTTP/HTTPSのアクセスのログを見ることができます.APIの動作確認などできるので,Web開発者なら重宝している機能の一つだと思います.
とても便利な機能なので,iOSのWKWebViewでも使えたらいいなと思い開発しました.
下記の動画が作ったサンプルなのですが,アプリ内のWKWebViewでGithubにアクセスしたときのHTTPSリクエストすべてをTableViewに表示できるようになっています.
こちらが今回作成したサンプルのレポジトリです.
https://github.com/tommy19970714/WebKitURLProtocol

これはログを表示するだけですが,この技術を応用する例としては,WKWeb

元記事を表示

[swift5]端末毎のビュー崩れを防ぐ方法(コードで指定)

## はじめに
今回はiPhoneの端末サイズによってビューが崩れる現象を修正する実装方法についてアウトプットします。具体的な方法はいくつかありますが、今回はコードで要素の位置を指定する方法です。

## 環境
swift5
Xcode 11.6

## 要素の位置を指定
**基本文法: ‘CGRect(x:値, y:値, width:値, height:値)’**

基本的には**HTML**のボックモデルと考え方が似ており、左上を基準に要素を動かします。
x軸は右に動かせば+、y軸は下に動かせば+となる。

widthとheightは指定した要素の横縦のサイズを指定する。
液晶全体の幅に合わせたい場合は、**’view.frame.size.width(height)’**と指定すれば画面いっぱいに要素を配置してくれる。

元記事を表示

Swiftでインスタグラムへのシェア導線をつけてみる

# はじめに

今回はアプリからインスタグラムのフィードへのシェア導線をつける実装です。詳しくは[こちら](https://yamato8010.hatenablog.com/entry/2020/07/25/160833)に書いてあります?‍?

## インスタグラムに遷移できるようにする

まずは、アプリからインスタグラムの Custom URL Scheme が利用できるように info.plist の `LSApplicationQueriesSchemes`に`instagram://`を追加していきましょう。

## 画像を保存して LocalIdentifier を取得する

“`.swift
func saveImage() {
UIImageWriteToSavedPhotosAlbum(image, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)
}

@objc private func image(_ image: UIImage

元記事を表示

iOS: DeviceCheckの参照、保存をJavaで実装。(アカウントBan,リセマラ防止対応など)

# iOSのdevice checkで出来ること。

– 端末から取得できるdevice tokenを元に、端末単位で2つのビット値をAppleのAPIに記録、参照できる。
– 端末を初期化、アプリのアンインストール&インストールしても保存されたビット値はリセットされない。

# どんなことに利用できるか。
### リセマラ防止。
– (初期インストール時、device checkのAPIに記録すると、再インストールされたことを判定できる。)

### 深刻な不正行為をするユーザーを端末単位で、アカウントbanする。
– device checkのAPIで、アカウントbanされた端末であることを記録。
– アプリの再インストール、端末の初期化後も、以前にアカウントbanされた端末である場合、利用できないようにする。

# 利用時の注意点
– 端末が中古市場等で別の人に渡った場合でも、保持される値なので慎重な運用が必要。
– 端末から取得したdevice tokenは時間的な有効期限があるみたい。(この部分の記憶は定かじゃないので、テストしてみてください。)アカウントbanで利用する場合

元記事を表示

【Xcode Behaviors】Xcodeのイベントに合わせて動作を設定する – 開発効率をUPする便利機能

# 開発効率をUPする便利機能

Xcodeの設定にBehaviorsという項目があるのをご存知でしょうか?
この項目から、Build/Testing/Runningなどの各イベント発生時の挙動を設定することができます。

例えば次の画像のように、RunningのPausesイベント(デバッグ中のエラー発生やブレイクポイント到達)発生時に、別のタブを開いて該当部分を表示するといったことが可能です。
before-running.pngrunning-fails.png超簡単にViewの背景をぼかす方法【iOS開発】

#背景をぼかしたい!!
背景をぼかしたいなーと思った時には**UIVisualEffectView**を使うと思うんですけど、ぼかす処理を毎回書くのがめんどくさい!!
というわけで超簡単に背景ぼかしができるextensionを作りましょう

#extensionを書く!
新しいファイルを作ってこれを書きましょう!

“`swift:addVisualEffect.swift
import UIKit

extension UIView {
func addVisualEffect() {
//スクリーンサイズ取得!
let width = UIScreen.main.bounds.size.width
let height = UIScreen.main.bounds.size.height

//ブラーエフェクト生成!
let blurEffect = UIBlurEffect(style: .light)

//ブラーエフェクトからエフェクトビ

元記事を表示

【SwiftUI】VectorArithmetic を自作して AnimatablePair の型パラメータ地獄から解脱する

## はじめに

### モチベーション

SwiftUI でアニメーション可能なシェイプを作成する場合は `animatableData` を実装する必要があります。

アニメーション可能なパラメータが1つの場合は次のような実装をします。

“`swift
public struct HogeShape: Shape {
public var foo: CGFloat

public var animatableData: CGFloat {
get { foo }
set { foo = newValue }
}

public func path(in rect: CGRect) -> Path {
// foo をパラメータにした Path を作る
}
}
“`

`animatableData` の型は必ずしも `CGFloat` である必要はなく、`VectorArithmetic` に適合していれば OK です。次の型が既知で適合しています。

– CGFloat
– Double

元記事を表示

Dateを扱うときは12時間表記設定を考慮しよう。

# 要約
– カスタムフォーマットの日時文字列からDate変換時にnilが返却される。
– シミュレータでは発生しない、実機で発生する
– 国内のみのサービスでもDateFormatterにはLocaleは必ず設定し利用する。
– 可能であれば実機利用のテストのタイミングに組み込む

# 現象
文字列からDate変換するときに、端末の設定が12時間表記になっていると必ずnilが発生。
シミュレータでは発生しないので、忘れがち。

### 問題になるパターン

| 変換文字列 | 24時間 | 12時間 | シミュレータ |
|———-|——-|——–|———-|
| 時刻を含む文字列 | 成功 | 失敗(nil) | 成功 |
| 時刻を含まない文字列 | 成功 | 成功 | 成功 |

#### 参考 問題になるコード

“`swift
let dateFormmater = DateFormatter()
dateFormmater.dateFormat = “yyyy-MM-dd HH:mm:ss”

/// 12時間表記の際に dat

元記事を表示

【Swift】ラベル付きループ文の使い方

###はじめに

今回は、多重ループの内側から一気に抜け出す際に役立つ、ラベル付きループ文の書き方を紹介します。

### ラベル付きループ文とは?

多重ループを構成するwhile文やfor文などにラベルを付けて置き、break文とcontinue文を使用する際、どのループから抜け出すのか、またはどのループの実行を継続するのかを、ラベルで指定する書き方です。
Swiftではあまり使われない方法ですが、場面によってはすごく効果的な手法になります。

### 具体的な書き方

ラベルはwhile文やfor文の前に、識別子と「:」を置きます。
break文ではラベルの付けられたループから抜け出し、そのループの次の文の実行に移ります。
continue文はラベルの付けられたループの残りの部分の実行をスキップして、次の繰り返しが可能かどうか、条件の判定に移ります。
実際の書き方を以下に示します。

“`
loop1: while 条件~~ {
loop2: while 条件~~{
while 条件~~ {
break loop

元記事を表示

大学生が1週間でFlutterアプリを学んでリリースした過程(7日目)

こんにちはシオンです。

ついに最終日がきました。
ここまで読んでくださって本当にありがとうございます。
思いつきで始めたこの企画ですが、いい感じにFlutterの勉強になったし、記事を書く楽しさも感じられて始めてすごく良かったなと感じています。
ですが、今日アプリが完成しないことには終わるに終われませんので、引き続きラストスパート頑張りたいと思います。

#目次
#####■完成までにやること
#####■路線変更:AppStoreへアップする
#####■いよいよ審査!
#####■まとめ

#■完成までにやること

今日アプリを完成させるためにやらなければいけないことを先にまとめておきます。
大きくやることを分けると
**①アプリのコードを書ききること。**
**②リリース申請をすること。**
この2つになります。

では、それぞれ進めていきます。

##①アプリのコードを書ききる

現状画面を全て作成し終わって、画面遷移まで実装できました。
残る機能は以下の通りです。
**1. 2画面目でストレスLvを表示**
**2. 3画面目に2画面目で入力した愚痴タイトルを表示**

元記事を表示

Swiftで指定した桁数のランダムな文字列を生成

備忘録:book:
ユニークなIDを生成したいときなどに

“`Swift
func generator(_ length: Int) -> String {
let letters = “abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789”
var randomString = “”
for _ in 0 ..< length { randomString += String(letters.randomElement()!) } return randomString } ```

元記事を表示

目でTwitterとブラウザを操作する

#この記事は…?

以前、「手を使わずにTwitterを閲覧したい!」という強い意志のもと、NoHandTwitterなるものを作りました。
↓↓↓
https://qiita.com/LilyMameoka/items/52f05eac7ae95b399e32

これが結構使えたんですよ。昼休みに昼食を食べながらTwitterを閲覧できましたし、あとは授業中でもTwitterを…おっと、失言。(開発当時)受験生だっただろ、おい。

で、授業中にTwitterをしていて思ったんですけど、前の記事の状態では先生が来たときにTwitterの画面が見えてしまうんですよね。「これではバレてしまう」、そう思ったんですわ。なんとかしたいですよね。

というわけで、今回は授業中にユースケースを絞り込んで、アップデートしました。

(これを作ったのは前回の記事の直後なのですが、最近「書いてなかったな」と思い出しまして今更ですが、綴りました。)

コードの全貌は記事の最後に掲載しました。

#先生が来ちゃったらどーしよ(どーする?!)

まずは先生が来てもTwitterをやっていることがバレない

元記事を表示

Twitterの横スワイプメニューのデザインの作り方

# はじめに
今回はTwitterアプリの検索タブにあるカテゴリー分けニュースフィードのデザインを紹介します。これはNewsPicksやメルカリでも利用されている、ユーザーエクスペリエンス向上にはもってこいの機能です。ちなみに私の作ったフィットネスアプリ『モニトレ』でもある機能です。

![twitter_feed.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323176/a5ff1fec-198b-2622-b891-13ffd5328ec9.gif)

*ストーリーボードは使用していないので、Extension.swiftファイルに制約のルールを設定しています。(ステップ3をご覧ください)
#開発環境
Swift 5.2.4
Xcode 11.5(Deployment Target 13.0)
ストーリーボードなし

#ストラクチャー
構成は以下の様になっています。
![twitter_feed_structure.png](https://qiita-image-store.s3.ap-nort

元記事を表示

大学生が1週間でFlutterアプリを学んでリリースした過程(6日目)

こんにちはシオンです。

今日で6日目、残すところあと2日となりました。
計画通りに行けば、コードをかけるのは今日が最後の日です。現状としては5画面あるうちの2画面の画面構成まで、処理はひとつもかいていなく、また書き方もわからないため、進捗率としては5%…よくて8%ほどでしょうか。

やばいですね。でも期限はもう決まってしまっているのでやり切りましょう。途中までで終わらないよりも、終わらせる。今回は60点でもいいから終わらせることが大事なのです。

では、時間がないので(本当に!)やっていきます。

#目次
#####■実装する処理の確認
#####■画面遷移を学ぶ
#####■残りの画面を作って画面遷移のルートを繋ぐ
#####■まとめ

#■実装する処理の確認

昨日3画面の実装をしてFlutterでの画面の配置に関してはなんとなくわかってきました。
残り3画面は処理を実装するのと同時にプログラミングしていきます。
今回実装する残りの処理としては
**・画面遷移**
**・入力した文字を読み取って表示**
**・カウントアップ**
この3つです。

実装するためにはど

元記事を表示

OTHERカテゴリの最新記事