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 …

DarkMode 対応したらアプリ起動時にクラッシュするようになってしまった

事象 DarkMode 対応したら、アプリ起動時にクラッシュするようになってしまった。 クラッシュ内容は、アプリ起動時に表示する VC である TopViewController の viewDidLoad() 内での EXC_BREAKPOINT で、 iOS 13 系の端末のみで発生する模様。 スタックトレ…

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 …

Swiftにおけるインポートとリンクの復習

先日行われた iOSDC 2019 に参加してきました。 岸川さんによる「Swiftにおけるインポートとリンクの仕組みを探る」を聞いてきました。 ふわっとしか理解できていなかった部分だったので発表内容を復習しようと思い、改めて資料の内容を書き出し、 Xcodeで触…

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 を切り替えたいと思ってググってみたのですが、解決策が見つからなかったので…

Swift の Date の操作

Date の操作方法が全く覚えられないので、調べたことをここにまとめていく。 日時を指定して Date 生成 Calendar(identifier: .gregorian).date(from: DateComponents(year: 2017, month: 8, day: 13)) ある Date の次の日の Date 生成 Calendar(identifier:…

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

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