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

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

Swiftでセマフォ(semaphore)にさわってみよう

# はじめに

最近セマフォ(semaphore)について振り返る機会があり、Swiftでの動作を確認する意味もあってSwiftでセマフォの[サンプルソースコード](https://github.com/BlueEventHorizon/SemaphoreExample)を作成しました。

そのソースコードを用いて、「セマフォって聞いたことはあるけど??」と思っているエンジニアのために本記事を書いてみました。

# セマフォ(semaphore)とは

下記は[wikipediaからの引用](https://ja.wikipedia.org/wiki/セマフォ)です

>セマフォ(英: semaphore)とは、計算機科学において、並列プログラミング環境での複数の実行単位(主にプロセス)が共有する資源にアクセスするのを制御する際の、単純だが便利な抽象化を提供する変数または抽象データ型である。

セマフォを理解するキーワードは、**「並列」**と**「資源」**だと思います。

**「並列」**な動作を行う複数のスレッドやプロセスが、共有する**「資源」**を正しく利用できる(アクセス制

元記事を表示

NeumorphismなUIButton

※ **gifは、影の大きさを調節する関数を実装する前のものです。**
# はじめに
NeumorphismなUIButtonを作ったときのことを記録に残しておきます。
![index.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352824/cbe42ea2-8a34-5137-9506-8e39d67b9071.gif)

## このButtonのしくみ
見てもらうとすぐわかるんですが、
image.png
クリックされていないときは、このボタンは

– ボタンの外側の上と左に光があたっている。
– ボタンの外側の下と右に影がついている。

というような特徴をもっています。
それだけでなく、

FlutterアプリでonResume的なタイミングの処理をする

# 状況
カレンダー式表示のアプリを作成しています。「今日」が分かりやすいように、その日付のセルだけ背景色を変えています。
しかし、特にiOSで問題になるのですが、アプリをホームボタンでバックグラウンドに移動していて、もう一度アプリを立ち上げたときに、そのタイミングで日付が変わっていても「今日のセル」が移動してくれません。
Androidでいう、”onResume”のタイミングで処理ができれば解決できると思い、調査しました。

# 環境など

|ツールなど|バージョンなど|
|:–|:–|
| MacBook Air Early2015|macOS Mojave 10.14.6|
|Android Studio |3.6.1|
|Java |1.8.0_131|
|Flutter|1.12.13+hotfix.9|
|Dart |2.7.2|
|Xcode |11.3.1|

# 解決策

`SystemChannels.lifecycle.setMessageHandler`を使います。
詳しくはこちら。
https://api.flutter.dev/flutter/servi

元記事を表示

UITableViewCell の UIView-Encapsulated-Layout-Height について

## この記事について

デバッグによって得られたテーブルビューセルの高さの挙動についてのメモです。

##### 環境

Xcode Version 11.5 (11E608c)

## Self-sizing Table View Cells

UITableView は次のような設定によって、オートレイアウトベースでセルの高さを決定できるようになります。

“`swift
tableView.estimatedRowHeight = 85.0
tableView.rowHeight = UITableView.automaticDimension
“`

要点は2点です。

– `estimatedRowHeight` に `0` 以外の適切な値を設定する
– `rowHeight` に `UITableView.automaticDimension` を設定する

この設定によって、オートレイアウトベースでセルの高さを決定することができます。あとは、セルのコンテンツビュー内のレイアウト制約を過不足なく配置するだけです。
![carbon (3).png](https://q

元記事を表示

iosのショートカットで現在時刻の年月日時分を別々の変数に入れる

iosに搭載されているショートカットは魅力的なプログラミング環境なんだけど、情報が少ないので、見つけたtipsを記録しておく

#現在時刻の文字列
現在時刻を取得して年月日時分を別々に得るまで
##取得
下の図のアクションで現在時刻を取得して、それを文字列テキストに変換します
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535482/9bc8fa39-29c7-1ef8-a41b-d651e8b91e74.jpeg)
以下の説明では、最初のアクションを

[日時/{現在の日付}] (1)

次のアクションを

[書類/{日時}からテキストを取得] (2)

と表記します。{}は変数を示します
日時はアクション(2)で「日付として」、日付けフォーマット「中」、時間フォーマット「短」としたとき
2020/05/28 22:47 (a)
あるいは
2020/05/28 5:24 (b)
というフォーマットになります
##年月日の取り出し
正規表現を使って日時文字列から年月日を取り出します

元記事を表示

iOSでmd2pdf

# はじめに

## 自己紹介

H1ronoです。趣味でiOSでプログラミングをしています。

## この記事でやること

[Pythonista3](https://apps.apple.com/jp/app/pythonista-3/id1085978097)と[ショートカット](https://apps.apple.com/jp/app/ショートカット/id915249334)を使用し、iOSで`.md`から`.pdf`を作成しました。詳細を共有することで、iOSの開発能力が伝わればなと思っています。

※筆者の環境はiPhone 8, iOS 13.4.1(OSはこの記事を書いている時点で最新)です。

# 準備

## 1. Pythonista

### 1-1. モジュール

マークダウンからHTMLへの変換に[mistune](https://pypi.org/project/mistune/)モジュール、コードハイライト用に[pygments](https://pypi.org/project/Pygments/)を使用します。

pygmentsは最初からPyth

元記事を表示

XcodeGenを使ってUI Testing Bundle (UIテスト用ターゲット) を追加する

Product Typeに `bundle.ui-testing` を指定するとUIテスト用ターゲットを追加できます。
https://github.com/yonaskolb/XcodeGen/blob/master/Docs/ProjectSpec.md#product-type

project.ymlでUIテスト用ターゲットの定義と、メインのターゲットでのtestTargetの定義をすれば追加できます。

“`project.yml
targets:
ExampleApp:
type: application

scheme:
testTargets:
– ExampleAppUITests
ExampleAppUITests:
type: bundle.ui-testing
platform: iOS
scheme: {}
sources: ExampleAppUITests
dependencies:
– target: ExampleApp

元記事を表示

実機とシミュレータでフォントサイズが違う?UITableViewCellのカスタムビューのフォントサイズをポイント固定で指定してはいけない

## 実機とシミュレータのフォントサイズが違う?
UITableViewに配置するカスタムTableViewCellをつくったときの話。

– 参考:[カスタムTableViewCellを作るときにはだいたいこうやってます\-プロトタイプで作るか、xibで作るか \- Qiita](https://qiita.com/naochi___/items/dcbf58acb925fc716af5)

実機テストのとき **「カスタムTableViewCellのフォントサイズが小さい」** という現象がありました。調べた結果、UILabelのFont設定をポイント指定していたことが原因だったのですが、そこに至るまでに時間を吸われたので、おなじ沼にハマらないように :memo:

### シミュレータでの見え方
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883/79e67f6f-f180-df46-2baa-dd51ff7f599d.png)
>
> 上:標準のUITableViewCe

元記事を表示

Objective-Cで三項演算子のYESの場合を省略する

## 背景
案件のコード見てたらすごく簡潔に書かれた三項演算子があった!
まさかこんな書き方ができるとは知らなかったので、メモしておきます。

## コード
“`objc

NSDictionary *dic = @{@”a”: @”AAA”, @”b”: @”BBB”};

NSString *str = dic[@”b”] ? : @””;
NSLOG(@”str: %@”, str);
// str: BBB

str = dic[@”c”] ? : @””;
NSLOG(@”str: %@”, str);
// str:
“`

## Swift だったら…
Swiftならデフォルト値入れるだけで?‍♀️
Swift便利だな〜

“`swift
let dic = [“a”: “AAA”, “b”: “BBB”]
var str = dic[“b”] ?? “”
// str : BBB
print(“str : \(str)”)

str = dic[“c”] ?? “”
print(“str : \(str)”)
// str :
“`

## まとめ
Obj

元記事を表示

【Flutter】Flutter製アプリをリリースしてみた、あとARとかも使ってみた話

## アプリ概要

ゴルフの[オリンピックゲーム](https://www.clunk.jp/golf-olympic-rules#1)の計算やボールとピンまでの距離のAR測定,1−18までの乱数を生成することができる、ゴルフ幹事向けのアプリです。

[App Store はこちら](https://apps.apple.com/jp/app/engolf/id1507668448?l=en)
[Google Play Store はこちら](https://play.google.com/store/apps/details?id=com.tetsukick.engolf)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/67933117-6fcb-fd17-a67e-2c6f9c547368.png)

CleanArchitecture ファイルの自動生成(iOS・Swift)

CleanArchitectureではファイルを大量に生成するので、できれば手動ではなく自動で行いたい。そのための手段をまとめた。

### Xcodeのテンプレート機能

#### メリット

Xcodeの機能として、テンプレートファイルを用意しておいておくと、ファイル生成時に選ぶことができる。
Xcodeの機能にすぎず、特別な設定は不要でプロジェクトの中身に何ら影響がない。テンプレートファイルは~/Library/Developer/Xcode/Templatesに置く。

#### デメリット

テンプレートファイルは何処かから拾ってくるか自分で書く・編集する必要がある。自分は下記から拾った。

#### 参考
https://medium.com/swift2go/installing-the-clean-swift-template-in-xcode-6b4367006827

### Kuri

#### メリット

普通に使いやすい

#### デメリット

ymlファイル・テンプレートファイルをプロジェクトルートに置かないといけない(プロジェクトの構成に影響がある)

元記事を表示

RxSwiftで検索+ページネーションをいい感じにする

iOSアプリの以下のような条件の検索画面を RxSwift でいい感じに実装する方法をメモします。

– キーワードを入力して検索ボタンをタップすると検索開始する
– 検索APIは結果が多い場合を想定して、ページ番号指定によるページネーションができる
– 検索結果一覧の最後のアイテムを表示するタイミングで自動で次のページを読み込む
– 最後のページまで読み込んだら終了する

### 実装方法

以下、検索画面 `SearchView` を想定したコードです。細かい説明はコメントとして書いてあります。また、ところどころに動作確認用の print 文が入っています。

– 検索ボタンを押した時は `search(by keyword: String)` を実行する
– 結果一覧の最後のアイテムを表示するタイミングで `requestNextPage()` を実行する

“`swift:SearchView.swift
/// 検索画面
class SearchView {
/// キーワードを入力して検索ボタンを押した時に実行する処理
func search(by key

元記事を表示

iOSの各種シミュレーターをfzfで選んで起動する

プリミティブな方法だと

“`console
$ xcrun simctl list
“`

で、起動したいシミュレーターのUUIDを確認して

“`console
$ xcrun instruments -w 208E5166-9C5D-4CA5-A9DE-529AD562D311 # iPhone 11 Pro Max
“`

とすると指定したシミュレーターが起動するのだが、Xcodeをアプデするとシミュレーターも更新されてしまうので、以前書き留めておいたUUIDが使えなくなる。また調べないといけなくてめんどくさい。

ということで、インクリメンタルに端末名で検索してEnterで起動するようにした。

`.zshrc` に以下を追記

“`zsh:.zshrc
function simc() {
xcrun instruments -w $(xcrun simctl list | grep -v unavailable | grep -E “^\s” | grep -v “:” | fzf | grep -oE “\((.+?)\)” | grep -oE “.{2

元記事を表示

ローカライズファイルをAndroidとiOSで共通管理する

## はじめに
AndroidとiOSでサービスを展開している場合、同じ文言を使っている。
プラットフォームごとに管理することで文言の誤字が発生しやすく、コストも上がる。
ローカライズファイルを効率よく管理する方法を考えました

## 前提条件
– AndroidとiOSで共通のリソースを扱う
– 差分を追いやすいこと

## githubを使って管理
– オリジナルデータとなる文言とkeyはjsonにして管理
– githubを使うことで差分を追いやすくなる
– CIを使うことで自動化できる

## ローカライズファイルを更新するツール
– JSONからローカライズファイルを生成するのを簡単にするためにツールを作成した
– [t-osawa-009/JSONToString](https://github.com/t-osawa-009/JSONToString)

### 使い方
1.オリジナルデータとなるJSONファイルを追加

“`json
[
{
“key”: “hoge”,
“key_android”: “hoge”,
“key

元記事を表示

【Swift】選択上限のある複数選択可能なTableViewの実装+スクロールしてもチェックマークがズレないようにする

選択上限をつけた複数選択可能なTableViewの実装が調べても出てこなかったので、簡単に作ってみました。

##### 今回実現したいTableView

1. 複数選択可能
2. 選択状態がスクロールによって他のCellにズレない
3. 選択できる数に上限をつける

[サンプルプログラム](https://github.com/asa08/multiple-select-table)

## 1. 複数選択を可能にする
“`MultipleTableView.swift
// tableViewのisMultipleTouchEnabledをtrueにする
isMultipleTouchEnabled = true
“`
これだけで複数選択が可能になる。

## 2. 選択状態がスクロールによって他のCellにズレない
`Model`に選択状態を持って、その値を元に`Cell`を`init`する。

“`MultipleTableView.swift
func tableView(_ tableView: UITableView, cellForRowAt indexPat

元記事を表示

iOSにユーザーデータを保存する方法と、そのためのコードの書き方: UserDefaults、Core Data、Key Chain、CloudKit

データの保存はiOSアプリの持つ主要な機能です。たとえば、ユーザーが指定した色などの環境設定を保存したり、ウェブサイトのトークンをアプリに保存したり、ToDoリストのアプリを作ってタスクを保存したりすることができます。データをシステムに保存する方法はいくつもあります。

## 目次

[User Defaults](https://qiita.com/MaShunzhe/items/e7263507e07919a6adab#user-defaults)
[Core Data](https://qiita.com/MaShunzhe/items/e7263507e07919a6adab#core-data)
[Keychain](https://qiita.com/MaShunzhe/items/e7263507e07919a6adab#keychain-キーホルダー)
[iCloud CloudKit](https://qiita.com/MaShunzhe/items/e7263507e07919a6adab#cloudkit)

この記事では、上記の方法それぞれについて、サンプルコ

元記事を表示

tns run iosよ、あなたはなぜiPad Airを起動するのか?NativeScript-VueのiOSエミュレータの初期デバイスをiPhoneに変更する

# TL;DR

`package.json`に

“`
“scripts”: {
“ios-iphone”: “tns run ios –device ‘iPhone 8′”
},
“`

を追加する

# 教えてくれた人

# tns run iosよ、あなたはなぜiPad Airを起動するのか

NativeScript−VueのアプリをMac OS Catalina10.15.4で開発中にiOSエミュレータを`tns run ios`(デフォルト)や`npm run serve:ios`(`vue-cli-plugin-nativescript-vue`でコードシェアリングしている場合)で起動すると、iPad AirのSimulatorが起動する。
image.pngUIWebViewを使っているFrameworkを探す

アプリにUIWebViewが含まれている場合、App Store Connectへのアップロード時にITMS-90809の警告がメールで送信されたりするかと思います。

> ITMS-90809: Deprecated API Usage – App updates that use UIWebView will no longer be accepted as of December 2020. Instead, use WKWebView for improved security and reliability. Learn more (https://developer.apple.com/documentation/uikit/uiwebview).

警告にもある通り、既存アプリでUIWebViewを利用している場合は2020年12月で受け付けがされなくなるようなので、それまでに対応が必要です。
(参考: [ウェブビューを使ったAppのアップデート \- ニュース \- Apple Developer](https://developer.apple.com/jp/news

元記事を表示

iOSアプリにYouTube動画を埋めこもう2020

iOSアプリにYouTube動画を埋めこんだので、その覚書です。

# 基本
YouTubeの公式ドキュメントを見ると、[YouTube-Player-iOS-Helper](https://github.com/youtube/youtube-ios-player-helper)というOSSを使うのを推奨されます。
基本WebViewをベースに、いい感じのサイズにしたYouTube動画を埋めこんで、コントローラーをつけるという感じです。

(公式ドキュメント)
[Embed YouTube Videos in iOS Applications with the YouTube Helper Library](https://developers.google.com/youtube/v3/guides/ios_youtube_helper)

(わかりやすいチュートリアル)
[[Swift] YouTube-Player-iOS-Helper を使って YouTube 動画を再生してみる](https://dev.classmethod.jp/articles/youtube-pla

元記事を表示

OTHERカテゴリの最新記事