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

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

SwiftUIでEquatableなViewで冗長な更新を防ぐ

# SwiftUIでEquatableなView(EquatableView)で冗長な更新を防ぐ
SwiftUIを使うと良い感じにUIを作ることができます
しかし、特に大規模なアプリを作成していると、たまにパフォーマンスの問題に当たることがあります
SwiftUIでは、Equatableを継承しているViewは、Equatableの評価結果が等価である場合は、Viewを更新しないという挙動になります
この仕組みを使うと、冗長な更新を防ぎ、パフォーマンスを向上させることができそうです
そこで、EquatableなView([EquatableView](https://developer.apple.com/documentation/swiftui/equatableview))の挙動を確認しつつ、効果的な使い方を考えてみました
※ Xcode14/iOS16で検証しています

# EquatableなViewの挙動の確認
まずは、EquatableなViewと、EquatableではないViewとの挙動の違いを確認します
ベースとして、下記のような2個の数字をインクリメントするVie

元記事を表示

【SwiftUI】端末を振ったことを検知する

# はじめに
端末を振ったことを検知するとランダムに色が変更されるアプリを作成します

# サンプルアプリ
端末を振ると色が変化します
![Simulator Screen Recording – iPhone 14 Pro – 2023-07-23 at 22.40.54.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/dfa251d0-b5ff-0d25-720f-b00c90d59781.gif)

# 実装
“`swift
extension NSNotification.Name {
public static let deviceDidShakeNotification = NSNotification.Name(“DeviceDidShakeNotification”)
}

extension UIWindow {
open override func motionEnded(_ motion: UIEvent.EventSubtype, with eve

元記事を表示

【Swift】大文字小文字を区別しない検索機能の作り方3選

# はじめに
Swiftで大文字小文字を区別しない検索機能を作る方法を紹介します。

# 作るもの
文字列の配列から、検索キーワードを含む文字列を抽出するプログラムを作ります。

# やり方
## #1
一つ目は、`StringProtocol`の`localizedCaseInsensitiveContains`メソッドを使う方法です。
このメソッドは大文字小文字を区別せずに、引数の文字列を含むかどうか判定します。

“`swift
import Foundation

func search(_ keyword: String, in strings: [String]) -> [String] {
strings.filter { $0.localizedCaseInsensitiveContains(keyword) }
}

let strings = [“Apple”, “Banana”, “Orange”, “Grape”, “Peach”, “Pineapple”]
let keyword = “apple”

let result = search(key

元記事を表示

シングルトンクラスを作る(SwiftUI)

SwiftUIでシングルトンクラスを作る方法です。

シングルトンクラスとは、アプリ内で一意に存在するクラスのことで、アプリ内のどこからアクセスしてもただ一つのインスタンスを返します。

# EnvironmentObjectとの違い
SwiftUIには、EnvironmentObjectという、どこのViewからアクセスしても同じインスタンスを参照できるプロパティラッパがありますが、あえてシングルトンクラスを作る理由はなんでしょう。

それは、View以外からも参照したいからです。
EnvironmentObjectは、Viewを継承したビュー構造体にしか定義できません。
MVVMで開発している場合で言えば、Model、あるいはViewModelからEnvironmentObjectのインスタンスにアクセスしたいことが出てくるでしょう。そんな時に解決してくれるのがシングルトンクラスです。

# 実装

以下のように定義します。
“`swift:Singleton.swift
class Singleton{
static var shared = Singleton()

元記事を表示

Xcodeでアプリ開発、最初にやること

どうもこんにちは。[フエルマネー](https://apps.apple.com/us/app/%E3%83%95%E3%82%A8%E3%83%AB%E3%83%9E%E3%83%8D%E3%83%BC/id6446435231)の開発者です。

性格的にコード汚いのが許せないんですが、基本的に最初書いたコードは汚いので1から書き直すという暴挙に出ることがしばしばあります。

この記事は、何度かプロジェクトを作ったことがある人、久々にiOS開発をする人にも役立ちます。まず最初にプロジェクトを綺麗な状態にするための、一連の流れをまとめました。

# プロジェクトを作成
何はともあれ、新規プロジェクトを作成しましょう。

・Xcodeを起動
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/f581034f-6417-3470-94f1-6926fa3216db.png)
・Create a new Xcode projectを選択
・iOS > Appを選択してNext
・適当なPr

元記事を表示

【翻訳】Concurrency & Multithreading in iOS

並行処理とマルチスレッドは、 iOS 開発の核となる部分です。何がこれらを強力にしているのか、そして私たち自身の Cocoa Touch アプリケーションでこれらをどのように活用できるのか、掘り下げてみましょう。

### 並行処理とは、複数のことが同時に起こるという概念です。

これは一般的に、タイムスライシング (https://en.wikipedia.org/wiki/Preemption_(computing)#Time_slice) によって実現されるか、ホスト・オペレーティング・システムで複数の CPU コアが利用可能であれば、本当に並列で実現されます。私たちは皆、同時実行性の欠如を経験したことがあり、重いタスクを実行しているときにアプリがフリーズするという形で経験したことがあるでしょう。 UI のフリーズは、必ずしも同時実行性の欠如が原因で発生するわけではありません – バグの多いソフトウェアの症状である可能性もあります。 – しかし、自由に使えるすべての計算能力を活用しないソフトウェアは、リソースを大量に必要とする処理を行うたびに、このようなフリーズを発生させることに

元記事を表示

【SwiftUI】画像をインスタグラムにシェアする

# はじめに
インスタグラムへのシェア機能を作成する方法を学んだので記録しておきます。

# 実装
“`swift
import UIKit

public final class ImageDownloadManager: NSObject {
private var completion: (_ error: Error?) -> Void = { _ in }

public func save(image: UIImage, completion: @escaping (_ error: Error?) -> Void) {
self.completion = completion
if let data = image.pngData(), let png = UIImage(data: data) {
UIImageWriteToSavedPhotosAlbum(png, self, #selector(image(_:didFinishSavingWithError:contextInfo:)),

元記事を表示

【Xcode】簡単にファイルを複製する方法

# はじめに
Figmaなどの多くのデザイン系ツールでは、オブジェクトを選択してオプション+ドラッグすると、複製することができます。
これをXcodeでやるとどうなるのか、気になったので試してみました。

# 結果

なんと、Xcodeでもファイルの複製ができました!

# おわりに
テンプレートを作るのは面倒だけど、使い回しをしたいときに便利そうです!この記事が参考になったという方は、いいねとフォローよろしくお願いします。

元記事を表示

【Swift】シュミレーターを判定する

# はじめに
カメラを使うアプリを作成してる時に、シュミレータービルド時だけカメラの初期をスキップしたいことがありました。

# やりかた
“`swift
#if targetEnvironment(simulator)
// シュミレーター
#else
// 実機
#endif
“`

# おわり
知りませんでした

元記事を表示

[Swift]PHPickerを使って複数選択した画像をTableViewに表示する

# 完成動画
まずは完成形を見ていただければと…

![動画_AdobeExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643372/6cfc018a-2df6-fda2-4a61-4dbcbf662200.gif)

このように複数選択した画像をTableViewに表示する方法を紹介します。

# 環境
Swift:5.8.1
Xcode:14.3.1

# 実装
ライブラリをimportして必要な変数を用意します。

“`ViewController.swift
import UIKit
import PhotosUI

final class ViewController: UIViewController {

private var selection = [String: PHPickerResult]()
private var selectedAssetIdentifiers = [String]()
private var imag

元記事を表示

【SwiftUI】Pinterestの起動アニメーションを再現する

# はじめに
Pinterestを起動すると、最初にロゴが楽しげに動くアニメーションが表示されます。
今回は、このアニメーションを再現します。

# デモ

# 型を定義
まず、Viewがある状態に変化するまでにかかる時間、ある状態でのサイズと位置をまとめた`AnimationStep`を定義します。

“`swift
struct AnimationStep {
let duration: Double // アニメーションの継続時間
let diameter: CGFloat // ロゴの直径
let yOffset: CGFloat // y軸方向のオフセット

init(
duration: Double,
diameter: CGFloat = 100,
yOffset: CGFloat = 0
)

元記事を表示

WidgetKit概要その2

## 前置き
前回のまとめた[WWDC20-22の簡易まとめ](https://qiita.com/ryoooooory/items/c17db04442e1e8316301)のつづきとしてWWDC23でのWidgetKitについて注目すべき機能をまとめました。

### 1, WWDC23でのWidgetの主な進化
– StandbyModeでの表示
StandByModeとはiOS17から新しく搭載された画面で、 充電中に画面を横にするとこのモードとなります。主にナイトスタンドやキッチンカウンター、デスクには最適とされていて、スワイプで色々な時計スタイルに変更可能です。またカスタマイズも可能で、カレンダーなどの標準アプリウィジェットの他にサードパーティアプリのウィジェットも表示することができるので、開発者は自身のアプリのWidgetを対応させることでユーザーがこのモードでもWidgetが使用可能になります。Siriで簡単に音楽を再生したりも可能です。スマートスタックなので、適切な時に適切な情報を自動で表示。SmartStackはiOS14(Widget登場時)から存在していて、簡

元記事を表示

WidgetKit概要

## 前置き
2020からWidgetKitが登場し、iOSだとホームからWidgetを見たり編集することができました。WWDCの発表について簡単にまとめたものをこちら備忘録としてまとめたいとおもいます。

## 見出し
1. 概要
2. WWDC20
3. WWDC21
4. WWDC22

### 1, 概要
2020から登場したwidgetですが、ホーム画面にも表示できるwidgetについてはAndroidが先に導入済みであり、widgetのサイズを自由に変えたりWidgetから直接アプリの機能を使ったり比較的自由度の高いという印象です。個人的にはよく聞く話ですがiOSでは比較的制限を多くして統一的で綺麗なデザインと使いやすいUIを目指しているので、あまりカスタマイズ性はすくないのかなと思っています。ただ、近年のupdateにあるとおり、統一性をもたせつつもより開発者の個性を出しながらユーザーにもアプリ体験の向上を図るためにカスタマイズ性をどんどん増やしているのかなと思っています。

https://www.android.com/intl/ja_jp/articles/45/

元記事を表示

初めてReactNative+ExpoでiOSアプリ開発をして躓いたところ

# はじめに
私、現在は大学4年生(いわゆるFランですが・・・)、内定承諾済み、卒業研究もやっています(なんと選択科目) がまだ佳境ではなかった、ということで知人経由でアプリ制作の依頼を受けて何も知らない状態からアプリ制作を始めてみました。

RN+Expo、iPad向けの社内用アプリです。
Flutterも考えましたが、もともとWebコーディング専攻であることもありスタイリングがCSSライクなRNにしました。
Webアプリにしとけよってところですが、iPadで使いたいこととサーバーを用意、管理するのが面倒という要望があり、アプリ制作に手を出してみたかった気持ちを優先しました。

ひとまず、備忘録兼後の世代の人が検索して役に立つと良いなという淡い陰謀のもと、私が躓いた箇所をメモのように残しておこうと思います。

# 開発環境
期間:2023/04~2023/06
Thinkbook 13thgen Windows10 Pro
(後々iMac 2017 21.7inchを購入)
iPad Air 第6世代
node v18.14.2
npm v9.5.0
expo v49.0.3
RN

元記事を表示

【Flutter】screenutilに対応したGolden Testの実装

# はじめに
現在進めているプロジェクトでは画面サイズに合わせてWidgetやフォントサイズを調整できるよう
[flutter_screenutil](https://pub.dev/packages/flutter_screenutil)を導入しています。

Widget Test実装時はGolden Testで実装しているのですがその際に詰まったことを備忘録がてら書きます。

# 前提
[flutter_screenutil](https://pub.dev/packages/flutter_screenutil)とは?
Widgetやフォントサイズを動的に変更できる便利なパッケージです。
詳細な説明は省きますが公式を見て初期設定さえすれば簡単に実装することができます。

Golden Testについて
Golden Testの詳細は省きますが今回の対応では[goolden_toolkit](https://pub.dev/packages/golden_toolkit)を利用しています。
Flutterではパッケージを導入せずともGolden Testの実装は可能ですが、よりテス

元記事を表示

【TCA】Reducerで複数の非同期処理を並列実行する3つの実装パターン

# はじめに
1つのアクションに対して、サーバからのデータ取得、ログ送信、AsyncSequenceの購読など、複数の非同期処理を実行しなければならないケースがあります。
これらの非同期処理を順列に実行していたのではユーザ体験が悪くなってしまうため並列実行させるのが基本ですが、非同期処理を並列実行する実装は条件分岐などが入ってくると可読性が低くなったり冗長なコードになってしまいがちです。

本記事では、複数の非同期処理を並列実行する3つの実装パターンについて書いています。
おそらくどれが良い悪いということではなく、ケースバイケース、あるいは好みの問題で使い分けることになるのかなと思っています(※ただし、1つはDeprecatedなので注意)。

本記事が可読性の高いReducerのコードを書く助けになれば嬉しいです。
もっと良い方法がある、あるいは記事の内容についてご指摘等あれば是非教えてください!

# async let
例えば2つのログを並列に送信するケースをasync letで実装するとこうなります。

“`swift
case .buttonTapped:
return

元記事を表示

Unity Remote 5 が動かない(windows、ios)

Unity Remote 5 が動かない時の原因メモ

1.iosにswitch platformしてない
2.itunesがpcにインストールされていない
3.USBがつながってない

上が確認できても、つながらない場合は、ひたすらUnity Remote を立ち上げなおしたりすると、いつかつながる。

元記事を表示

Fastlaneを使わずにiOSアプリのビルド・配信を行う

# はじめに

iOSアプリのビルドやApp Store Connectへの配信を自動化する際には、Fastlaneを利用するケースが多いかと思います。Fastlaneは大変便利なツールですが、Rubyを導入したりBundlerでバージョンを管理したりと環境構築が少し面倒と感じる事があるかと思います。

そこで、本記事ではFastlaneを使わずにXcodeに付随する`xcodebuild`コマンドだけでiOSアプリのビルド・配信を行う方法を説明します。

## 環境

– Xcode14.3.1 (14E300c)

## 手順

### 1. Releaseビルドの署名設定をAutomaticにする

本記事ではXcode13から導入されたcloud signingを利用するため、Releaseビルドの署名設定を「Automatically manage signing」に設定してください。
※cloud signing については、[こちら]()の記事を参考にしてください。

![スクリーンショット 2023-07-19 21.42.22.png](https://qiita-

元記事を表示

LiveViewNative で簡単 iOS ネイティブアプリ -?チュートリアルを動かす?‍⬛-

## はじめに

LiveViewNative は Elixir で iOS や Android のモバイルアプリが作れてしまう素晴らしいフレームワークです

https://github.com/liveview-native/live_view_native

@the_haigo さんが以前の記事で紹介してくれています

https://qiita.com/the_haigo/items/1936319bad327d14ad7b

同じようなものとして Elixir Desktop があります

https://github.com/elixir-desktop/desktop

LiveViewNative と Elixir Desktop の違いについては上記記事を参照してください

Elixir Desktop も @the_haigo さんがアプリの開発手順を紹介してくれています

https://qiita.com/the_haigo/items/17a89b5038a7f337b102

## LiveViewNative とは

LiveViewNative では

元記事を表示

SwiftUIでマッチングアプリ風の左右スワイプのサンプル作成

## この記事を書こうと思ったきっかけ
・SwiftUIで自作しているアプリで表題の機能を追加してみたいと思った。
・SwiftUIの画面について学習がしたかった。

## 今回作成するサンプル
・カードは合計五枚あり左右どちらかにスワイプすると次のカードを表示する
・スワイプされるとどちらにスワイプされたかprintする

## 1.変数を定義する
下記コードで変数を定義しております。
cardOffset: CGFloat = 0は後述しますが
現在のカードの基準の位置になります。
こちらの値が変化することでスワイプ判定となります。
“`swift
struct ContentView: View {
let cardSize = CGSize(width: 300, height: 400)
let cardCount = 5
@State private var currentIndex = 0
//カードが表示されているかどうかを示すBool値
@State private var isCardVisible = true

元記事を表示

OTHERカテゴリの最新記事