iOS関連のことを調べてみた

iOS関連のことを調べてみた

UIScrollViewでヘッダー部を固定する

# やりたいこと

– ズーム、スクロールをしつつヘッダー部を固定したい
– 過去に投稿した[UICollectionViewでExcelライクなUIを作成する](https://qiita.com/ooooo8/items/c5d0b8d943dc87e33944)ではズームが出来ないため、不採用

# どうすれば良いか

UIScrollViewの子Viewに固定したいViewを配置し、ズームとスクロール時に座標を更新すれば解決!

# コード

“` swift

import UIKit

class ViewController: UIViewController {
/// UIScrollView
@IBOutlet weak var scrollView: UIScrollView! {
didSet {
scrollView.delegate = self
scrollView.minimumZoomScale = 1.0
scrollView.maxim

元記事を表示

SwiftUIでデザイン実装するときに気をつけること

## はじめに

SwiftUIは標準でいい感じにしてくれる一方、業務では厳格な余白(Padding)や間隔(Spacing)が求められることが多いです。

本記事ではSwiftUIを使ったデザインの実装時に気をつけるべきことを紹介します。

## 対象読者

– __:warning: Figmaなどのデザインツールで起こしたデザインを忠実にSwiftUIで実装する人__
– 標準に寄せていい場合、本記事はあまり参考にならないかもしれない

## 環境

– OS: macOS Sonoma 14.5
– Xcode: 16.1 (16B40)
– Swift: 6.0.2

## SwiftUIでデザイン実装するときに気をつけること

### 余白と間隔

余白(Padding)や間隔(Spacing)についてです。

余白と間隔については以下の記事をご参照ください。

https://qiita.com/uhooi/items/d1d2f0f4916e053f5746

#### 決められた倍数になっているか

プロジェクトによりますが、余白や間隔は4や8の倍数と決められてい

元記事を表示

【UIButton.Configuration】ボタンタイトルの自動ハイライトを抑制したい

UIButton.Configuration 初心者の @zrn-ns です。

`UIButton.Configuration.plain()` ベースのボタンを作った際、以下のようなコードを書いたのですが、 **勝手に白いハイライトが当たる状態になりました**。

“`swift
import UIKit
import PlaygroundSupport

let button: UIButton = .init()
button.configuration = {
var config: UIButton.Configuration = .plain()
config.title = “hoge”
config.baseForegroundColor = .darkGray
return config
}()

PlaygroundPage.current.setLiveView(button)
“`

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com

元記事を表示

Swift6 対応

# Swift6 新機能

## Introduce Existential any

Cancellableなど、いくつかの型(プロトコル)を持った変数を宣言する際、Cancellableという型名の前に「any」をつけろと言われました。こちらは「[Introduce Existential any](https://github.com/swiftlang/swift-evolution/blob/main/proposals/0335-existential-any.md)」と呼ばれる新たな機能で、存在型(Existential Type)としてプロトコルを指定する場合は、「そのプロトコルに適合した何某かの型」という意味合いでanyマークをつけなければなりません。Existential Typeとは、変数の型や、メソッドに渡す引数の型や、ジェネリクス型の括弧に囲まれた型などを言います。

“`swift
private var subscription: any Cancellable

func doSomething(param: any MyProtocol) { }

元記事を表示

iOS向けUnity開発中にCocoaPods関連のエラーが発生した際の対処法

## 実証環境
Macbook Air 2
macOS 14.2.1
Unity 2021.3.29f1
Xcode 15.2

## やっていたこと
以下の記事を参考に、UnityでGeospatial APIを使ったiOS向けのアプリを作っていた。

https://www.mlit.go.jp/plateau/learning/tpc14-3/

## 発生した2つのエラー

①Geospatial APIを使うために、ARCore Extensionsパッケージを入れた時から、パッケージを入れたりiOS関連の変更を行なったりすると次のエラーが定期的に表示された。
“`
iOS Resolver

Failed to install CocoaPods for the current user.

It will not be possible to install Cocoapods in the generated Xcode project
which will result in link errors when building your application

元記事を表示

SwiftUIでさらに表示するのUIを作る

# はじめに
SwiftUIで以下のようなX(Twitter)とかでよくある一定の文字数を超えると末尾に「… さらに表示する」と表示され一部文字が省略されるUIを実装してみようと思ったのですが、これが結構難しかったので実装方法を記事にしました。

省略時のUI
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359094/800f01de-5a2d-3ed4-9ed1-05bbe1219597.png)

さらに表示押下後のUI
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359094/e034724d-4027-48b0-7012-13a127e0c666.png)

# 実装方法
今回実装した方法としては、flowlayout(※)を作成して、文字を一文字のTextに分解してレイアウトしていき、最大文字数に達したら「… さらに表示」のボタンを配置するというものです。

※f

元記事を表示

【パッケージ紹介】FlutterのアイコンはIconifyも使える

![スクリーンショット 2024-11-09 111937.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/844247/2f55001b-ec1a-7038-4288-aba2c37b48da.png)

# 今回紹介するパッケージ
https://pub.dev/packages/iconify_flutter
### install
“`bash
flutter pub add iconify_flutter
“`
### yaml
“`yaml
dependencies:
iconify_flutter: ^0.0.7
“`

## Iconifyとは
`Iconify`は、以下のような特徴を持つアイコンセットフレームワーク
`Figma`にプラグインがあるので、知っている人もいるのではないでしょうか?
– 多様なアイコンセットがある:
– 膨大なアイコンセットを混在させて使用できる
– 150,000個以上のオープンソースベクターアイコンが利用可能
– 必要なアイコンのみをロードす

元記事を表示

classがSendableに適合するためにはfinalなclassである必要がある件

# はじめに
swift concurrencyの対応を行なっているとclassを`Sendable`に適合させる必要がある場面があり以下のように実装してみたのですが、警告が表示されコンパイラに怒られました。

“`swift
class Counter: Sendable {

let value: Int = 0
}
“`

警告の内容としては以下のとおりです。
“`
Non-final class ‘Counter’ cannot conform to ‘Sendable’; use ‘@unchecked Sendable’; this is an error in the Swift 6 language mode
“`

今回は上記の警告での対応方法と、なぜこの警告が出たのかを調べたのでその内容を記事にしました。

# 警告の内容と対応方法
これはコンパイラの警告を日本語訳するとfinal出ないclassは`Sendable`には適合できまへんということなので、素直にclassにfinalをつけるとコンパイラを黙らせることができます。
(コンパイラは

元記事を表示

[Swift]RxSwift×MVVM ホットペッパーAPIを利用したアプリを作ってみた Part 2

# ホットペッパーAPIの実装 Part2
今回は前回投稿したPart1の続きのホットペッパーAPIを利用したアプリのViewModel側の実装を紹介します。

## ViewModelの実装コード
次回紹介しますが今回は`searchBar`と`tableView`をセットしたHomeViewと、ホットペッパーAPIで取得したデータを配置させるHomeCellでファイルを分けました。
このHomeViewとHomeCell各ファイルに対してViewModelを用意しました。View側ではUIパーツのバインドのみを行い、ロジックを持たせないことで、ViewとViewModelの責務が明確に分かれるようにしています。

## HomeViewModel
HomeViewControllerにデータを加工して送る役割を担います。
ここではPart1で紹介したAPIデータを取得する処理を実装した`gourmetSearchRequest`を利用し、検索結果を表示させる仕組みを定義したファイルになります。

searchGourmetメソッド内の流れを下記に記載します。
1. メソッドが走ると

元記事を表示

iOSアプリのライフサイクル (Life Cycle)

## 1. アプリのライフサイクルとは?
アプリを使用中に電話がかかってくると、アプリは自動的に電話画面に切り替わり、非アクティブ状態になります。

このように、アプリは使用中にユーザーの行動やイベントによって様々な状態に切り替わります。この仕組みを「ライフサイクル」と呼びます。

iOSはアプリの状態を管理し、その状態に応じたイベントを `AppDelegate` や `SceneDelegate` を通じて開発者に提供します。

## 2. アプリの主要な状態
iOSアプリはシステムの状態変化に応じて、次のような主要な状態を持ちます。
“`
Not Running → Inactive → Active
↑ ↓ ↓
Suspended ← Background
“`

– **Not Running**
アプリが実行されていない状態。メモリにロードされていない場合を含む。
– **Inactive**
アプリが実行中だが、イベントを受け取らない状態。
例: 電話の着信や通知の表示など。
– **Active**
アプリが実行中

元記事を表示

Flutterの基礎をまとめてみた(3)

# Flutterのカウンターアプリについて

次は、Flutterで新しいプロジェクトを作ったときに自動で作られる「カウンターアプリ」について見ていきます。

### カウンターアプリって何?
![スクリーンショット 2024-11-07 14.50.40.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929117/9be21d2f-81a7-6b6a-6ef6-88a5459f514d.jpeg)

カウンターアプリは、ボタンを押すたびに数字が増える、とてもシンプルなアプリです。Flutterを学ぶときに最初に見ることが多いアプリで、どんなふうにアプリが動くかを知るための良い例です。

例えば、このアプリでは画面の中央に大きな数字が表示されています。そして、その下にあるボタンをタップすると、数字が1つずつ増えていきます。こうすることで、Flutterの基本的な画面作りや、ボタンを押したときにどう動くかなどを学ぶことができます。

### カウンターアプリの動き方
Flutterのカウンターアプリで

元記事を表示

Flutterの基礎をまとめてみた(2)

![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929117/80a01506-ebd3-ac14-4f10-306434ddb46c.png)

# Dartってなに? – Flutterで使われる言語について

Flutterで使うのがDart(ダート)というプログラミング言葉です。Dartはとても簡単で覚えやすく、楽しくアプリを作るために作られた言葉です。ここでは、Dartの特徴を3つに分けて説明して、その後で基本の使い方を見ていきましょう。

## 1. シンプルで使いやすい言葉
985.png

Dartはプログラミングを初めてやる人にもわかりやすく作られています。

– **短い時間

元記事を表示

Flutterの基礎をまとめてみた(1)

# Flutterってなに?
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929117/5871ab9e-fb65-3de4-7b24-6faabd324eff.png)

## Flutter(フラッター)ってどんなもの?
Flutterは「フラッター」と読み、Google(グーグル)が作った便利なツールです。このツールを使うと、1回だけアプリを作れば、スマホやタブレット、パソコンでも同じアプリを動かすことができます。例えば、1枚の絵を描くだけで、いろんな画面にその絵が表示できる感じです!

Flutterを使うと、たくさんのプログラムを書く手間が減って、いろんな機械で動くアプリを一気に作れるます。

### マルチプラットフォーム対応って?
調査結果 AppleによるiOSアプリのレビューガイドラインについて

# 1.iOSアプリのプライバシー要件

### 要点
1. Appleは、iOSアプリのプライバシー保護を強化するため、サードパーティSDKに対してプライバシーマニフェストと署名の提出を義務付けています。
2. 2024年5月1日以降、特定のAPIを使用するアプリは、その使用理由をプライバシーマニフェストで明示する必要があります。
3. これらの要件は、ユーザーのプライバシー保護とデータ収集の透明性向上を目的としています。

### 詳細な説明
Appleは、iOSアプリにおけるユーザーのプライバシー保護を強化するため、サードパーティのソフトウェア開発キット(SDK)に対して新たな要件を導入しました。具体的には、一般的に使用されるサードパーティSDKに対し、プライバシーマニフェストと署名の提出が求められます。これにより、デベロッパはアプリ内のすべてのコードに対して責任を持ち、データ収集と使用方法を把握することが求められます。さらに、2024年5月1日以降、特定のAPIを使用する新規アプリやアップデートされたアプリは、App Store Connectにアップロードする際、プライバシー

元記事を表示

UISliderで作る、重なり合う画像のグラデーション効果

## **1. はじめに**

iOSアプリ開発において、画像を重ねたレイアウトの透明度を変えることで、視覚的なグラデーション効果を作り出すことができる。レイヤーごとに透明度を変えることで、スライダーの操作に応じて見え方が少しずつ変化し、インタラクティブな視覚効果が生まれる。このブログ記事では、`UISlider`を用いて3つの画像の透明度を調整し、グラデーションのような効果を得る方法について解説する。

## **2. グラデーション効果の仕組み**

このコードでは、以下のロジックでグラデーション効果を実現している:

– **重ねた画像の透明度を動的に変更**:3つの画像を重ねた状態で、それぞれ異なる透明度が設定されている。スライダーの操作により透明度が変化するため、画像が重なりながら滑らかに見え方が変化する。
– **異なる透明度が重なって表現される**:透明度の変化により、前景の画像が後景の画像を覆うようにフェードイン・フェードアウトし、自然なグラデーション効果が視覚的に表現される。

こうした重なりによる透明度の変化は、複数の画像や色の要素が組み合わさる場面で、柔らかな変化

元記事を表示

Swiftで作成したゲームに広告を入れる

## 事前準備

[Google AdMob](https://admob.google.com/intl/ja/home/)に登録

## 広告ユニットの作成
種類はバナー広告にしました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/adb56e74-08a5-9717-0fa2-154f1188f583.png)

## 実装
Swift Package Manager (SPM) でGoogleMobileAdsライブラリを使うための準備
 
Xcode→File→Add Packages…を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/561806f9-a054-9ce7-1f0c-e943519bfa93.png)
 
下記を検索して、Add Package
“`
https://github.com/googleads/swift

元記事を表示

元Flutter使い、現iOSプログラマが、Compose Multiplatformに入門してみた

# はじめに

以前Flutterを使っていた経験から、現在はSESとしてiOSプログラマをしている[uehatsu](https://x.com/uehatsu)です。ちょっとCompose Multiplatformをいじる必要が出てきたので、連休を機会にさわり始めました。メモがてらまとめてみたいと思います。

https://www.jetbrains.com/ja-jp/compose-multiplatform/

# 環境構築

公式ホームページ通りにやったところ大きな問題はありませんでした。あえて言うなら以下の点で「あれ?」と思いました。

– Xcode 16.1をインストールした状態ではAndroid Studio上でシミュレータが正しく選べなかったので、Xcode 16.0にしたこと
– kdoctorがAndroid Studioのバージョンを正しく認識してくれなかったこと
– kdoctorが「Android Studio上で`Kotlin Multiplatform Mobile Plugin`をインストールしろ」と言うけど、そんなプラグインはなく`Kotli

元記事を表示

iOSエミュレータの時間を変更する方法

時間経過の処理をおこなった際に実装確認するため時間を変更する必要があると思います。

今回はエミュレータの時間を変更します。

Mac自体の時間を変更することでエミュレータの時間も変わります。

システム設定 → 一般 → 日付と時間 こちらの設定を変えると時間も変わります。

時間を変更したままだと、GoogleMeetがエラーになった為忘れず戻しましょう!

元記事を表示

iOS18でタブを押した際に画面がチラつく現象への対応

# どうした
iOS18でUITabBarControllerで実装したタブをタップしたら、遷移時に画面が一瞬チラつくようになった。
NavigationBarの色も反転して見栄えが悪いので何とかしたい

# 発生している環境
– Swift
– Xcode 16.0
– iOS18端末

# 対応
UITabBarControllerDelegateを実装して、遷移時のアニメーションを無効化する

“`Swift
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
// アニメーションだめー
UIView.setAnimationsEnabled(false)
return true
}

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UI

元記事を表示

[Swift] AppStorageとUserDefaultsについて

## 1. AppStorageとUserDefaultsの概要
AppStorageは、SwiftUIで使える便利な仕組みで、@プロパティラッパーとして簡単にユーザーデフォルトにデータを保存したり読み込んだりできます。UserDefaultsを裏で使っているため、SwiftUIのコードがよりシンプルに書けます。

UserDefaultsは、アプリ全体でKey-Valueの形でデータを保存できる仕組みです。アプリを再起動しても保存したデータを保持して、自動的に読み込むことができます。

つまり、AppStorageもUserDefaultsも基本的な機能は同じですが、AppStorageの方がSwiftUIと組み合わせて使うときにコードがスッキリするのが特徴です。

## 2. 基本データ型とサポート内容
**AppStorage**がサポートする基本データ型:
– **Bool、String、Data、Int、Double、URL**
– **RawRepresentable**に準拠し、RawValueが**String**または**Int**の型も保存可能

**UserDef

元記事を表示

OTHERカテゴリの最新記事