iOS

Swiftの文字列補間をカスタマイズする

以下の3つのProtocolを用いることで、Swiftの文字列補間(式展開, 変数展開などとも言う)をカスタマイズすることができる。 ExpressibleByStringLiteral ExpressibleByStringInterpolation StringInterpolationProtocol 文字列リテラルで任意の型を初期化す…

機能のモジュール化

機能単位でモジュール分割するにあたってどのように依存解決したら良いかを考えてみた。 以下のリポジトリであれこれしながら考えた。 github.com 機能モジュールとは 機能単位でモジュールを作成していくこと 上記の図のように Feature A 画面と Feature B …

WWDC2021 で発表された App Store の In-App Events

Meet in-app events on the App Store の内容まとめ。 developer.apple.com developer.apple.com In-App Events とは Meet in-app events on the App Store - WWDC21 - Videos - Apple Developer 下記のようなタイムリーなイベントを App Store 上で紹介する…

WWDC2021 で発表された App Store プロダクトページのカスタマイズと最適化

Get ready to optimize your App Store product page の動画の内容まとめ。 developer.apple.com この発表では、 App Store のプロダクトページにおける新機能である下記の2つの機能について紹介している。 任意の目的のためのプロダクトページカスタマイズ…

SwiftUI で画面下部にボタンを置く

NG 画面下部にボタンを置く場合、 bottom の Safe Area に被らないように置かないといけない。 何も考えずに置くと、下記のように Safe Area まで拡張されずに残念な感じになる。 VStack(spacing: .zero) { List(0..<100) { index in Text("\(index)") } But…

SwiftUI のボーダーボタン と clipped

四角ボタン 四角のボタンにボーダーをつける場合は .border modifier を指定すれば作れる。 Button("四角のボーダーボタン", action: {}) .frame(height: height) .padding() .background(Color.orange) .border(Color.red, width: borderWidth) 四角のボー…

The Composable Architecture(TCA)メモ

ViewStore binding public func binding<LocalState>( get: @escaping (State) -> LocalState, send localStateToViewAction: @escaping (LocalState) -> Action ) -> Binding<LocalState> https://github.com/pointfreeco/swift-composable-architecture/blob/main/Sources/Composab</localstate></localstate>…

SwiftUI の ScrollView を CustomShape で clip すると内部の View まで clip される

下記のように ScrollView に対して clippedShae(_:) で CustomShape を適用して clip すると、 ScrollView 内の View まで clip されてしまって View が途中で切れてしまう。 Rectangle 等の組み込みの Shape や、List に対してであれば問題は生じない。 Sta…

SwiftUI で透明な View に Gesture を設定する

下記のように、Color.clear のような透明のビューにジェスチャーを追加したかったけど反応しなかった。 import SwiftUI struct ExampleView: View { @State var text: String = "ケバブ" var body: some View { ZStack { Color.clear .onTapGesture { text =…

Compositional Layouts Self-Sizing のはまりどころと複雑なレイアウト例

github.com 紹介するコードは上記リポジトリにあげてあります。 はまりどころ 1. itemSize と groupSize を .estimated にする必要がある 例えば、height が可変の場合、グループの heightDimension を .estimated にして、レイアウトアイテムの heightDimen…

Compositional Layout におけるレイアウト構築のおすすめ

Compositional Layout の2列表示 Compositional Layout を使って、上記のような一方向のみスクロールできるグリッドレイアウトを構築する場合の実装方法についてのおすすめ。 基本 制約との二重管理になってしまうので可能な限り .absolute の使用は避け、 S…

DiffableDataSource で apply 後の UICollectionView の contentSize を取得する

問題 UICollectionViewDataSource を使っている場合では、 下記のように reloadData 直後には collectionView の contentSize が更新されている。 collectionView.reloadData() collectionView.layoutIfNeeded() // collectionView.contentSize が更新されて…

Appearance の設定方法

iOS 13 から Appearance の設定方法が追加されていた。 以前の方法もまだ非推奨になっておらず引き続き利用できるみたいだけど、 Legacy Customizations と表記されていて新しい設定方法が推奨されている。 新しい設定方法は standardAppearance プロパティ…

LaunchScreen の変更が反映されないとき

LaunchScreen の storyboard に加えた変更が全く反映されなくなった。 Target の設定で LaunchScreen File のファイルを変更してみたところ、ファイル自体の変更は効くようだった。 変更前の内容がキャッシュされているのかと思って、 Xcode で Clean Build …

AssociatedValue の有りと無しの case を複数持つ Enum を Decode する

AssociatedValue が無い case が1つ enum Food { case hamburger(topping: String) case pizza } 上記のような Enum がありまして、これを Decodable に準拠すると extension Food: Decodable { enum CodingKeys: String, CodingKey { case hamburger case …

Carthage で Framework を公開する

先日 Framework を作って Carthage でインストールできるようにしたので、その手順を書いておきます。 作ったものはこちらで紹介しています。 komaji504.hateblo.jp Workspace や Project を作る ディレクトリ構成 Workspace や Project のディレクトリ構成…

グラデーションをアニメーションさせるライブラリ作った【iOS】

Facebook の iOS アプリでは、起動時にコンテンツを表示するまでの間、テキストや画像を表す灰色で塗りつぶした View を表示しています。そうすることで、この後にどういったコンテンツが表示されるのかということを伝えることができます。 加えて、ローディ…

UICollectionView の UICollectionReusableView の位置がおかしい時

class SampleListViewController: UIViewController, UICollectionViewDatasource, UICollectionDelegate { @IBOutlet weak var collectionView: UICollectionView! { didSet { collectionView.register( UINib(nibName: "FooterIndicatorView", bundle: nil…

for-case 文【Swift実践入門読書メモ】

Swift実践入門を読んでみて、気になったところのメモです。 for-case 文 第3章 3節 pp.91-92 Sequence プロトコルに準拠した型の要素のうち、パターンにマッチするものだけを列挙する繰り返し文です。 for 文にも case によるパターンマッチが行えて let num…

引数のクロージャの属性【Swift実践入門読書メモ】

Swift実践入門を読んでみて、気になったところのメモです。 引数のクロージャの属性 第4章 3節 pp.120-124 @escaping 属性 関数に引数として渡されたクロージャが、関数のスコープ外で保持される可能性があることを示す属性です。 こんな感じで使われます。 …

if-case 文 【Swift実践入門読書メモ】

Swift実践入門を読んでみて、気になったところのメモです。 if-case 文 第3章 2節 p.81 if-case を用いることで、以下のようなパターンマッチによる分岐が行えます。 if case 0...5 = 3 { print ("パターンにマッチしています") } 比較対象が式の右辺にくる…

画面遷移のアニメーションをカスタムする

UINavigationController を使った画面遷移のアニメーションのデフォルトは、横からスライドするアニメーションですが、これをカスタムすることができます。 最近、アニメーションをカスタムしたりといったようにカスタムトランジションについて学んでみたの…

UIPickerView に UILabel を表示するライブラリをつくった

タイトルの通り、 UIPickerView に UILabel を表示するライブラリを作りました。 github.com これを使うとこんな感じにコンポーネントごとに簡単にラベルを表示することができます。 なお、Carthage からインストールできます。 使い方 LabelPickerComponent…

iPhone用のアラームアプリを作った【iOS】

初の個人アプリをリリースしました! そのアプリがこちらです。 バイブアラームTatsuya Kojimaライフスタイル無料 簡単に言うとアラームアプリです。 アラームアプリは App Store にたくさんあるのですが、自分が欲しかった 秒まで指定できる 通知はバイブレ…

Auto Layout の Content Hugging Priority と Content Compression Resistance Priority

iOS

すぐ忘れるので。 Content Hugging Priority コンテンツの表示サイズに沿って表示されることの優先度。 そのため、この値が大きい方が優先的にコンテンツと同じサイズになる。 Content Compression Resistance Priority コンテンツが圧縮されないことの優先…

iOS の時間表示設定を取得する

iOS の日付と時刻の設定の24時間表示が ON になっていれば24時間表示用の UILabel を、そうでなければ12時間表示用の UILabel を表示するという用に、時間表示設定によって View を切り替えたいと思ってググってみたのですが、解決策が見つからなかったので…

UnitTest 用のデータを共通化する【Swift】

テストをする際には複数のオブジェクトの初期化をする必要があり、この作業が面倒でテストを書くのが面倒になってしまうことがあったので、どうにかできないかと思い調べてみたところ、良さそうな方法がありました。 clean-swift.com これを、自分が使いやす…

Swift化開発合宿 in 熱海♨️

先日、会社のモバイルエンジニア5名でSwift化開発合宿に行ってきました! 普段はなかなか Swift 化を進めることができないので、こういった機会を設けてガガガっと進めてしまおうということから、今回の合宿が決まりました。 この開発合宿記録を書いていき…

iOSアプリ開発で実機のログに filter をかける

アプリ起動中のログであれば Xcode のコンソールから確認できますが、 アプリを起動したり終了させたときのログを確認したい場合には、Xcode のコンソールでは確認できないので実機のログを確認する必要があるかと思います。 このとき Xcode のツールバーの …

try! Swift 記録 2日目

try! Swift に参加してきました! www.tryswift.co ので、メモっていたことを書きます。 本当に雑なので、間違っているかもしれません。 2日目の分です。 1日目の分はこちら。 テスト可能なコードを書くということの2つの側面 なぜテスト バグを防げる テ…