SlideShare a Scribd company logo
1 of 23
Download to read offline
試して感覚を掴んでみる

UICollectionViewCompositionalLayout	

&

Combine
potatotips	#66	@	Yappli様
2019/11/11
Fumiya	Sakai
自己紹介
・Fumiya	Sakai
・Freelance	iOS	Engineer
アカウント:
・Twitter:	https://twitter.com/fumiyasac

・Facebook:	https://www.facebook.com/fumiya.sakai.37

・Github:	https://github.com/fumiyasac	

・Qiita:	https://qiita.com/fumiyasac@github
発表者:
・Born	on	September	21,	1984
これまでの歩み:
Web	Designer
2008	~	2010
Web	Engineer
2012	~	2016
App	Engineer
2017	~	Now
技術書典7でiOSのUI実装本の続編を頒布しました!
少しの工夫で実現できるTIPS集 ライブラリ表現の活用集
書籍に掲載したサンプルのバージョンアップや続編等に現在着手中です。
iOS13~	UICollectionViewCompositionalLayout
個人的にはSwiftUIやCombineに負けないぐらいのトピックス
https://developer.apple.com/videos/play/wwdc2019/215
Advances in Collection View Layout:
https://developer.apple.com/videos/play/wwdc2019/220
Advances in UI Data Sources:
☺ 複雑なレイアウトへの対応が柔軟に可能。 ☺ 表示データの反映を伴うUI更新処理の改善。
App	StoreのUI構造の例WWDC19での発表
1つの画面の中に異なる属性の要素が多数存在する場合
自分が試した経験のあるアプローチを何個かピックアップしてみる
⭐ 	どの実装もメリット・デメリットがある	&	構成するための部品が増えるし管理も煩雑になりがち
① UITableView + UICollectionViewの合わせ技:
セル要素の中にUICollectionViewやUITableViewを入れ子にする
② ContainerView + UICollectionViewの合わせ技:
小さなViewController単位で切り出して管理と集約をする
③ IGListKit等のライブラリを活用する:
複雑な構造の管理や差分更新の実施
出来れば
1つの画面で
済ませたい!
これまでのアプローチ例
https://qiita.com/_atsushisakai/items/524f2a48e7f671ef61d8
(参考)IGListKitでフィードUIをリファクタする
特集バナー
おすすめアイテム
紹介コンテンツ
新着アイテム一覧
構成要素の属性が
それぞれ異なるも
のを表示する必要
⭐ 	例:	TOP画面
簡単なAPIリクエストを伴う画面構築を試してみる
UICollectionViewCompositionalLayout	+	Combineの実装
⭐ 	新しいUICollectionViewとCombineを試す: https://github.com/fumiyasac/ComplexCollectionViewStyleExample
単一のUICollectionViewだけで複雑なレイアウトを実装:
①	実装における必要なポイント
②	レイアウトを考える上でのポイント
③	データの更新方法とAPI関連処理を繋げる
今回は”試してみた”実装を準備しました。
⭐ 	UICollectionViewCompositionalLayout
⭐ 	Combine	Framework
まずは必要な設定と準備の部分について
下記3つの必要なものを定義して切り出しておく
// MEMO: UICollectionViewを差分更新するためのNSDiffableDataSourceSnapshot(※悩ましい: AnyHashableではなくもっと厳密に制限したい)
private var snapshot: NSDiffableDataSourceSnapshot<MainSection, AnyHashable>!
// MEMO: UICollectionViewを組み立てるためのDataSource(※悩ましい: AnyHashableの部分を型で縛りたい)
private var dataSource: UICollectionViewDiffableDataSource<MainSection, AnyHashable>! = nil
// MEMO: UICollectionViewCompositionalLayoutの設定(※Sectionごとに読み込ませて利用する)
private lazy var compositionalLayout: UICollectionViewCompositionalLayout = {
let layout = UICollectionViewCompositionalLayout { [weak self] (sectionIndex: Int, layoutEnvironment: NSCollectionLayoutEnvironment) ->
NSCollectionLayoutSection? in
switch sectionIndex {
case MainSection.FeaturedArticles.getSectionValue():
return self?.createFeaturedArticlesLayout()
・・・ (以下セクション毎にレイアウトを作成して適用する)・・・
}
}
return layout
}()
enum MainSection: CaseIterable {
case FeaturedArticles, RecentKeywords, NewArrivalArticles, RegularArticles
func getSectionValue() -> Int {
switch self {
case .FeaturedArticles: return 0
・・・ (以下セクション毎にレイアウトを作成して適用する)・・・
}
}
}
Section毎のEnum値
✨ Section毎にNSLayoutCollectionを組み立てる
// MEMO: UICollectionViewDelegateについては従来通り
collectionView.delegate = self
// MEMO: UICollectionViewCompositionalLayoutを利用してレイアウトを組み立てる
collectionView.collectionViewLayout = compositionalLayout
// MEMO: DataSourceはUICollectionViewDiffableDataSourceを利用してUICollectionViewCellを継承したクラスを組み立てる
dataSource = UICollectionViewDiffableDataSource<MainSection, AnyHashable>(collectionView: collectionView) { (collectionView: UICollectionView, indexPath:
IndexPath, model: AnyHashable) -> UICollectionViewCell? in
・・・(indexPathの値とmodelを元にセルを組み立てる)・・・
}
// MEMO: Header・Footerの表記についてもUICollectionViewDiffableDataSourceを利用して組み立てる
dataSource.supplementaryViewProvider = { (collectionView: UICollectionView, kind: String, indexPath: IndexPath) -> UICollectionReusableView? in
・・・(indexPathの値とkindを元にHeader/Footerを組み立てる)・・・
}
セル要素およびHeader・Footerの組み立て
基本的なデータ表示や要素配置については従来手法と似ている
✨ セルに反映させるデータについてはHashableである。
Modelの型(例.○○	in	△△)で条件分岐する方針等を取る。
UICollectionView.elementKindSectionHeader(Footer)
✨ Header	/	Footerの区別とSection値の利用は従来通り。
UICollectionViewCompositionalLayoutのレイアウト
お互いの部品の影響と組み立てていく順序を意識すると良い
⭐ 	小さな粒度の「Itemのサイズ設定	→	Groupのサイズ設定	→	Sectionのインスタンスを作る」という順番で構造を考える
全体のLayoutの中にSectionが配置され、さらにその中に複数のItemを内包するGroupがある:
Layout	⊇	Section	⊇	Group	⊇	Item	という関係を持つ。
(1)	.fractionalWidth[Height](CGFloat)	→	割合から算出した値
(2)	.absolute(CGFloat)	→	固定値
(3)	.estimate(CGFloat)	→	設定した値より大きい場合には可変
レイアウトの設定方法
この構造と設定値を組み合わせて様々なバリエーションを生み出す!
サンプル内で実現しているレイアウトパターン
このサンプルでは5パターン実装しています。
Section内水平スクロール セル高さが可変タイル状の配置Section内水平スクロール
※セルの慣性スクロール
※ページングスクロール
※セルの高さを固定配置
右2つのレイアウトパターンについては、従来のUICollectionViewの実装よりも手軽に実装できるのが嬉しい点。
// 1. Itemのサイズ設定
let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .fractionalHeight(1))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
item.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 6, bottom: 0, trailing: 6)
// 2. Groupのサイズ設定
// MEMO: 1列に表示するカラム数を1として設定し、itemのサイズがgroupのサイズで決定する形にしている
let groupSize = NSCollectionLayoutSize(widthDimension: .absolute(160), heightDimension: .absolute(40))
let group = NSCollectionLayoutGroup.vertical(layoutSize: groupSize, subitem: item, count: 1)
// 3. Sectionのサイズ設定
let section = NSCollectionLayoutSection(group: group)
// MEMO: HeaderとFooterのレイアウトを決定する
let headerSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(65))
let header = NSCollectionLayoutBoundarySupplementaryItem(layoutSize: headerSize, elementKind: UICollectionView.elementKindSectionHeader, alignment: .top)
let footerSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .absolute(28))
let footer = NSCollectionLayoutBoundarySupplementaryItem(layoutSize: footerSize, elementKind: UICollectionView.elementKindSectionFooter, alignment: .bottom)
section.boundarySupplementaryItems = [header, footer]
section.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 6, bottom: 16, trailing: 6)
// MEMO: スクロール終了時に水平方向のスクロールが可能で速度が0になった位置で止まる
section.orthogonalScrollingBehavior = .continuousGroupLeadingBoundary
return section
まずはベーシックな例を考えてみましょう
下記のような感じでセクションのレイアウトを組み立てる
// MEMO: 該当のセルを基準にした高さの予測値を設定する
let estimatedHeight = UIScreen.main.bounds.width * 0.5 + 180.0
// 1. Itemのサイズ設定
let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(estimatedHeight))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
item.contentInsets = .zero
// 2. Groupのサイズ設定
let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(estimatedHeight))
let group = NSCollectionLayoutGroup.vertical(layoutSize: groupSize, subitems: [item])
group.contentInsets = .zero
// 3. Sectionのサイズ設定
let section = NSCollectionLayoutSection(group: group)
section.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 0, bottom: 16, trailing: 0)
return section
Instagramのフィード表示のようなDynamicHeightSizing
ItemとGroupの幅を画面いっぱい・高さを予測値に設定する点がポイント
(1)	widthDimension:	.fractionalWidth(1)
(3)	contentInset	=	.zero
(2)	heightDimension:	.estimated(X)	[	X:	セル高さ予測値	]
(4)	group.vertical(layoutSize:	groupSize,	subitems:	[item])
押さえたいポイント
Instagramの写真表示のようなMosaicLayout
Groupを入れ子にして左に幅2/3の正方形を1つ	&	幅1/3の正方形を縦に2つ
// 1. Itemのサイズ設定
// MEMO: 全体幅2/3の正方形を作るために左側の幅を.fractionalWidth(0.67)に決める
let twoThirdItemSet = NSCollectionLayoutItem(layoutSize: NSCollectionLayoutSize(widthDimension: .fractionalWidth(0.67),
heightDimension: .fractionalHeight(1)))
twoThirdItemSet.contentInsets = NSDirectionalEdgeInsets(top: 0.5, leading: 0.5, bottom: 0.5, trailing: 0.5)
// MEMO: 右側に全体幅1/3の正方形を2つ作るために高さを.fractionalHeight(0.5)に決める
let oneThirdItem = NSCollectionLayoutItem(layoutSize: NSCollectionLayoutSize(widthDimension: .fractionalWidth(1),
heightDimension: .fractionalHeight(0.5)))
oneThirdItem.contentInsets = NSDirectionalEdgeInsets(top: 0.5, leading: 0.5, bottom: 0.5, trailing: 0.5)
// MEMO: 1列に表示するカラム数を2として設定し、Group内のアイテムの幅を1/3の正方形とするためにGroup内の幅を.fractionalWidth(0.33)
に決める
let oneThirdItemSet = NSCollectionLayoutGroup.vertical(layoutSize:
NSCollectionLayoutSize(widthDimension: .fractionalWidth(0.33), heightDimension: .fractionalHeight(1)), subitem: oneThirdItem,
count: 2)
// 2. Groupのサイズ設定
// MEMO: leadingItem(左側へ表示するアイテム1つ)とtrailingGroup(右側へ表示するアイテム2個のグループ1個)を合わせる
let group = NSCollectionLayoutGroup.horizontal(layoutSize: NSCollectionLayoutSize(widthDimension: .fractionalWidth(1),
heightDimension: .fractionalHeight(0.33)), subitems: [twoThirdItemSet, oneThirdItemSet])
https://github.com/zenangst/Blueprints(同様な表現をするライブラリ)Blueprints:
UICollectionViewCompositionalLayoutを利用しない場合
Pinterestのフィード表示のようなWaterFallLayout
従来のUICollectionViewLayoutを継承して頑張る手法よりもシンプルな感想
セル1個分の構成
●●●●●●●●●●●●●●
●●●●●●
△△△△△△△△△△△△△△
△△△△△…
xxxxxxxx
2行固定
2行固定
1行固定
写真の

縦横比に

合わせる
(実装例&解説)
実装におけるアイデア
https://gist.github.com/breeno/f16330c5ef06075b0fc476c65d9b00d8
(1)	データを表示するためのAPIレスポンス内に写真の縦横比を計
算するための値を持っておく。
(3)	NSCollectionLayoutSectionを作成する処理を実行する際に
に表示用データを利用した写真の縦横比を基く高さ計算ロジック
を仕込んでおく。
(2)	表示用のデータをNSDiffableDataSourceSnapshotに格納する
がレイアウトを計算する際にも利用する。
セルに表示するデータの更新と反映部分について
データ更新はNSDiffableDataSourceSnapshotを利用する
snapshot.appendItems(featuredBanners, toSection: .FeaturedBanners)
dataSource.apply(snapshot, animatingDifferences: false)
②	受け取ったデータを反映する①	データの初期化
// MEMO: NSDiffableDataSourceSnapshotの初期化
snapshot = NSDiffableDataSourceSnapshot<MainSection, AnyHashable>()
snapshot.appendSections(MainSection.allCases)
for mainSection in MainSection.allCases {
snapshot.appendItems([], toSection: mainSection)
}
dataSource.apply(snapshot, animatingDifferences: false)
⭐ 	How	to	use	UICollectionViewDiffableDataSource:
https://medium.com/flawless-app-stories/how-to-use-uicollectionviewdiffabledatasource-55c60e9d3897
snapshot.appendItems(featuredBanners, toSection: .FeaturedInterviews)
dataSource.apply(snapshot, animatingDifferences: false)
snapshot.appendItems(newArrivals, toSection: .NewArrivalArticles)
dataSource.apply(snapshot, animatingDifferences: false)
(1)	NSDiffableDataSourceSnapshotに定義したセクションに該当するデータをセットする
(2)	UICollectionViewDiffableDataSourceのapplyメソッドでDiffableDataSourceSnapshotの内容を反映する
データを

受け取る
データ反映までの流れ
Combineを利用したAPI通信処理とUI表示の結合
現在の実務ではModel	-	ViewModel	-	ViewControllerの構造を利用
正解かどうかは自信ないけど、慣れた形に似た形にする。
状態更新のリクエスト
ViewController ViewModel Model
利用するデータの作成
UI側への変更を伝える 利用するデータの受取
⭐ 	Kickstarter-iOS	でも利用している	Input	/	Output	のアプローチ
https://tech.mercari.com/entry/2019/06/12/120000
APIRequestManager
https://qiita.com/muukii/items/045b12405f7acff1a9fd
// RxSwift:
viewModel.inputs.fetchFeaturedBannersTrigger.onNext(())
// Combine:
viewModel.inputs.fetchFeaturedBannersTrigger.send()
// RxSwift:
viewModel.outputs.newArrivals.drive(onNext: { … 後続処理 … })
// Combine:
viewModel.outputs.newArrivals.subscribe(on: RunLoop.main).sink( … 後続処理 … )
Inputs
Outputs
Combineを利用したAPI通信部分の処理
今回はAPIのリクエストを一度だけ発行する形にする
private func handleSessionTask<T: Decodable & Hashable>(_ dataType: T.Type, request: URLRequest) -> Future<[T], APIError> {
return Future { promise in
let task = URLSession.shared.dataTask(with: request) { data, response, error in
・・・(APIからのエラーレスポンスやステータスコードを元にしたエラーハンドリング)・・・
→ 例. promise(.failure(APIError.error(“エラー発生時のメッセージを引き渡す")))
do {
let hashableObjects = try JSONDecoder().decode([T].self, from: data)
promise(.success(hashableObjects))
} catch {
promise(.failure(APIError.error(error.localizedDescription)))
}
}
task.resume()
}
}
⭐ 	[Swift]	はじめてのCombine	|	Apple製の非同期フレームワークを使ってみよう:
https://dev.classmethod.jp/smartphone/swift-combine-framework-for-beginners/
Futureを利用して1度だけ値を発行して終了する形にする
https://developer.apple.com/documentation/combine/future
実装におけるポイント
リクエスト用のURLとDecodable	/	Hashableを適用した
表示用Modelの型を設定する形にする。
→	RxSwiftの「Single<T>」と似ている感じ
このサンプルにおけるViewModel構造と値の関係
InputのfetchArticlesTriggerが実行されるとOutputの変数が更新される
// MARK: - MainViewModelType
var inputs: MainViewModelInputs { return self }
var outputs: MainViewModelOutputs { return self }
// MARK: - MainViewModelInputs
let fetchArticlesTrigger = PassthroughSubject<Void, Never>()
// MARK: - MainViewModelOutputs
var articles: AnyPublisher<[Article], Never> {
return $_articles.eraseToAnyPublisher()
}
// MARK: - @Published
@Published private var _articles: [Article] = []
// MARK: - Initializer
init(api: APIRequestManagerProtocol) {
・・・(途中省略)・・・
fetchArticlesTrigger
.sink(receiveValue: { [weak self] in
self?.fetchArticles()
})
.store(in: &cancellables)
}
}
private func fetchArticles() {
api.getArticles()
.receive(on: RunLoop.main)
.sink(
receiveCompletion: { completion in
switch completion {
case .failure(let error):
print("error getArticles(): (error.localizedDescription)")
}
}, receiveValue: { [weak self] hashableObjects in
print(hashableObjects)
self?._articles = hashableObjects
}
)
.store(in: &cancellables)
}
}
APIからのデータ取得と内部変数への反映を行うInputとリクエスト処理の結合※ BehaviorRelayのような感じの結合
@Publishedの値を変換しOutPutを更新
ViewControllerでのデータの更新と反映に関する流れ
ViewModelで受け取った値をNSDiffableDataSourceSnapshot反映させる
// ViewModelのOutputsを経由した特集データの取得とNSDiffableDataSourceSnapshotの入れ替え処理
viewModel.outputs.articles
.subscribe(on: RunLoop.main)
.sink(
receiveValue: { [weak self] articles in
guard let self = self else { return }
self.snapshot.appendItems(articles, toSection: .FeaturedArticles)
self.dataSource.apply(self.snapshot, animatingDifferences: false)
}
)
.store(in: &cancellables)
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// MEMO: ViewModelのInputsを経由したAPIでのデータ取得処理を実行する
viewModel.inputs.fetchArticlesTrigger.send()
・・・(省略)・・・
}
②	APIへのデータリクエストを実行①	データの初期化
③	取得できたレスポンスを反映する
// MEMO: NSDiffableDataSourceSnapshotの初期化
snapshot = NSDiffableDataSourceSnapshot<MainSection, AnyHashable>()
snapshot.appendSections(MainSection.allCases)
for mainSection in MainSection.allCases {
snapshot.appendItems([], toSection: mainSection)
}
dataSource.apply(snapshot, animatingDifferences: false)
ViewModelへ命令を送る・ViewModelから値を受け取
る処理をCombineでつなぎ、

・UICollectionViewDiffableDataSource

・NSDiffableDataSourceSnapshot

を更新する形としている点。
この処理のポイント
※Outputs
※Inputs
参考資料(1)
UICollectionViewCompositionalLayoutと関連処理の参考
https://jayeshkawli.ghost.io/new-collection-view-apis-composite-layout/
https://www.raywenderlich.com/5436806-modern-collection-views-with-compositional-layouts
⭐ 	時代の変化に応じて進化するCollectionView	~Compositional	LayoutsとDiffable	Data	Sources~:
https://qiita.com/shiz/items/a6032543a237bf2e1d19
⭐ 	Modern	Collection	Views	with	Compositional	Layouts:
https://medium.com/shopback-engineering/move-your-cells-left-to-right-up-and-down-on-ios-13-part-1-1a5e010f48f9
⭐ 	Move	your	cells	left	to	right,	up	and	down	on	iOS	13:
https://medium.com/shopback-engineering/move-your-cells-left-to-right-up-and-down-on-ios-13-part-2-fbc430802227
⭐ 	New	Collection	View	APIs	in	iOS	13	-	UICollectionView	Compositional	Layout:
参考資料(2)
Combine	&	MVVMパターン関連処理の参考
https://github.com/mcichecki/Combine-MVVM
https://medium.com/@alfianlosari/fetching-remote-async-api-with-apple-combine-framework-f7c067c7bb3
⭐ 	Problem	Solving	with	Combine	Swift:
https://medium.com/flawless-app-stories/problem-solving-with-combine-swift-4751885fda77
⭐ 	Fetching	Remote	Async	API	with	Apple	Combine	Framework:
	
⭐ 	Combineを利用したSwiftUI・UIKitのどちらにも対応するUnidirectionalな設計を実現するには:
https://speakerdeck.com/martysuzuki/combinewoli-yong-sitaswiftuiuikitfalsedotiranimodui-ying-
suruunidirectionalnashe-ji-woshi-xian-suruniha
⭐ 	Combine-MVVM	(Github	Repository):
まとめ
改めて自分で色々検証してみた中で便利さを感じる部分が多かった。
1. 苦戦しやすいUICollectionViewLayoutの実装が更に扱いやすくなっている:
従来のUICollectionViewLayoutを継承した上でLayoutAttributesの値をレイアウトを満たすように調整するためのロジックを書
くよりもシンプルかつ直感的な印象を持った。
2. 使いこなすポイントとなりそうなのは「レイアウトの設定方法」と「データ反映処理」の2点:
UICollectionViewCompositionalLayoutのレイアウト設定方法や更新方法が変わっているが、UICollectionViewで複雑な実装をす
る際に泣き所になっている部分が強力にサポートされていたので今後積極的に使っていきたい。
まだまだ作りながら、試しながらを続けていこうと思います。
3. CombineもRxSwift等とイメージ比較して考えられる部分もあった:
今回はRxSwiftでの構成を元に置き換えてみたが当初よりもイメージが少し具体的になった気がする。
Thank	you	for	listening	!

More Related Content

What's hot

デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略
デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略
デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略Fumiya Sakai
 
アプリ開発におけるテキスト装飾のアイデア集
アプリ開発におけるテキスト装飾のアイデア集アプリ開発におけるテキスト装飾のアイデア集
アプリ開発におけるテキスト装飾のアイデア集Fumiya Sakai
 
少しずつキャッチアップしていくAndroidアプリ開発
少しずつキャッチアップしていくAndroidアプリ開発少しずつキャッチアップしていくAndroidアプリ開発
少しずつキャッチアップしていくAndroidアプリ開発Fumiya Sakai
 
部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装
部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装
部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装Fumiya Sakai
 
ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介
ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介
ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介Fumiya Sakai
 
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説Fumiya Sakai
 
iOSのUI構築小技集(小さなとこから始められる編)
iOSのUI構築小技集(小さなとこから始められる編)iOSのUI構築小技集(小さなとこから始められる編)
iOSのUI構築小技集(小さなとこから始められる編)Fumiya Sakai
 
iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方
iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方
iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方Fumiya Sakai
 
RxSwiftとMVVMパターンと仲良くなる次のステップ
RxSwiftとMVVMパターンと仲良くなる次のステップRxSwiftとMVVMパターンと仲良くなる次のステップ
RxSwiftとMVVMパターンと仲良くなる次のステップFumiya Sakai
 
Approach of Prototyping for making Application User Interface about iOS
Approach of Prototyping for making Application User Interface about iOSApproach of Prototyping for making Application User Interface about iOS
Approach of Prototyping for making Application User Interface about iOSFumiya Sakai
 
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめできるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめFumiya Sakai
 
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)Fumiya Sakai
 
iOS側のUIの特徴と見比べるAndroid側でのUI実装のヒント
iOS側のUIの特徴と見比べるAndroid側でのUI実装のヒントiOS側のUIの特徴と見比べるAndroid側でのUI実装のヒント
iOS側のUIの特徴と見比べるAndroid側でのUI実装のヒントFumiya Sakai
 
SwiftとReactNativeで似たようなUIを作った際の記録
SwiftとReactNativeで似たようなUIを作った際の記録SwiftとReactNativeで似たようなUIを作った際の記録
SwiftとReactNativeで似たようなUIを作った際の記録Fumiya Sakai
 
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ(追加版)
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ(追加版)できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ(追加版)
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ(追加版)Fumiya Sakai
 
iOSアプリ開発のためのSwiftビギナーズ勉強会 第6回 @Co-Edo
iOSアプリ開発のためのSwiftビギナーズ勉強会 第6回    @Co-EdoiOSアプリ開発のためのSwiftビギナーズ勉強会 第6回    @Co-Edo
iOSアプリ開発のためのSwiftビギナーズ勉強会 第6回 @Co-EdoMegumi Otani(Czenhe)
 
ReactNative + Redux + NativeBaseでつくるサンプル実装をのぞく
ReactNative + Redux + NativeBaseでつくるサンプル実装をのぞくReactNative + Redux + NativeBaseでつくるサンプル実装をのぞく
ReactNative + Redux + NativeBaseでつくるサンプル実装をのぞくFumiya Sakai
 
まずはできるところから始める UnitTestとテストができる実装について
まずはできるところから始める UnitTestとテストができる実装についてまずはできるところから始める UnitTestとテストができる実装について
まずはできるところから始める UnitTestとテストができる実装についてFumiya Sakai
 
少しずつ手厚くして不具合や仕様漏れを防ぐために
少しずつ手厚くして不具合や仕様漏れを防ぐために少しずつ手厚くして不具合や仕様漏れを防ぐために
少しずつ手厚くして不具合や仕様漏れを防ぐためにFumiya Sakai
 
メディアアプリでよく見る無限スクロールするタブの動きへの考察
メディアアプリでよく見る無限スクロールするタブの動きへの考察メディアアプリでよく見る無限スクロールするタブの動きへの考察
メディアアプリでよく見る無限スクロールするタブの動きへの考察Fumiya Sakai
 

What's hot (20)

デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略
デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略
デザイナー→Webエンジニア→iOSエンジニアと渡り歩いた僕なりのSwiftとの向き合い方と生かす戦略
 
アプリ開発におけるテキスト装飾のアイデア集
アプリ開発におけるテキスト装飾のアイデア集アプリ開発におけるテキスト装飾のアイデア集
アプリ開発におけるテキスト装飾のアイデア集
 
少しずつキャッチアップしていくAndroidアプリ開発
少しずつキャッチアップしていくAndroidアプリ開発少しずつキャッチアップしていくAndroidアプリ開発
少しずつキャッチアップしていくAndroidアプリ開発
 
部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装
部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装
部品に切り分けて考えるView構造とライブラリを上手に活用したUI実装
 
ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介
ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介
ライブラリやView構造を有効活用して iOSアプリのUIをオシャレにするワザ紹介
 
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
動画プレイヤーアプリの開発を通じて学んだ機能を実現するための要点解説
 
iOSのUI構築小技集(小さなとこから始められる編)
iOSのUI構築小技集(小さなとこから始められる編)iOSのUI構築小技集(小さなとこから始められる編)
iOSのUI構築小技集(小さなとこから始められる編)
 
iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方
iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方
iOSアプリUIとの触れ合いと歩む僕なりのSwiftの楽しみ方
 
RxSwiftとMVVMパターンと仲良くなる次のステップ
RxSwiftとMVVMパターンと仲良くなる次のステップRxSwiftとMVVMパターンと仲良くなる次のステップ
RxSwiftとMVVMパターンと仲良くなる次のステップ
 
Approach of Prototyping for making Application User Interface about iOS
Approach of Prototyping for making Application User Interface about iOSApproach of Prototyping for making Application User Interface about iOS
Approach of Prototyping for making Application User Interface about iOS
 
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめできるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ
 
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)
 
iOS側のUIの特徴と見比べるAndroid側でのUI実装のヒント
iOS側のUIの特徴と見比べるAndroid側でのUI実装のヒントiOS側のUIの特徴と見比べるAndroid側でのUI実装のヒント
iOS側のUIの特徴と見比べるAndroid側でのUI実装のヒント
 
SwiftとReactNativeで似たようなUIを作った際の記録
SwiftとReactNativeで似たようなUIを作った際の記録SwiftとReactNativeで似たようなUIを作った際の記録
SwiftとReactNativeで似たようなUIを作った際の記録
 
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ(追加版)
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ(追加版)できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ(追加版)
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ(追加版)
 
iOSアプリ開発のためのSwiftビギナーズ勉強会 第6回 @Co-Edo
iOSアプリ開発のためのSwiftビギナーズ勉強会 第6回    @Co-EdoiOSアプリ開発のためのSwiftビギナーズ勉強会 第6回    @Co-Edo
iOSアプリ開発のためのSwiftビギナーズ勉強会 第6回 @Co-Edo
 
ReactNative + Redux + NativeBaseでつくるサンプル実装をのぞく
ReactNative + Redux + NativeBaseでつくるサンプル実装をのぞくReactNative + Redux + NativeBaseでつくるサンプル実装をのぞく
ReactNative + Redux + NativeBaseでつくるサンプル実装をのぞく
 
まずはできるところから始める UnitTestとテストができる実装について
まずはできるところから始める UnitTestとテストができる実装についてまずはできるところから始める UnitTestとテストができる実装について
まずはできるところから始める UnitTestとテストができる実装について
 
少しずつ手厚くして不具合や仕様漏れを防ぐために
少しずつ手厚くして不具合や仕様漏れを防ぐために少しずつ手厚くして不具合や仕様漏れを防ぐために
少しずつ手厚くして不具合や仕様漏れを防ぐために
 
メディアアプリでよく見る無限スクロールするタブの動きへの考察
メディアアプリでよく見る無限スクロールするタブの動きへの考察メディアアプリでよく見る無限スクロールするタブの動きへの考察
メディアアプリでよく見る無限スクロールするタブの動きへの考察
 

Similar to 試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine

RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介Fumiya Sakai
 
ReduxとSwiftの組み合わせ:改訂版
ReduxとSwiftの組み合わせ:改訂版ReduxとSwiftの組み合わせ:改訂版
ReduxとSwiftの組み合わせ:改訂版Fumiya Sakai
 
UIViewController in XIB + IBDesignable
UIViewController in XIB + IBDesignableUIViewController in XIB + IBDesignable
UIViewController in XIB + IBDesignableFukaya Akifumi
 
Tinder風なUIを実装する際のアイデアと実装例紹介
Tinder風なUIを実装する際のアイデアと実装例紹介Tinder風なUIを実装する際のアイデアと実装例紹介
Tinder風なUIを実装する際のアイデアと実装例紹介Fumiya Sakai
 
個人開発したモバイルアプリを紹介したパワポ資料です。転職活動時にポートフォリオとして使用しました。
個人開発したモバイルアプリを紹介したパワポ資料です。転職活動時にポートフォリオとして使用しました。個人開発したモバイルアプリを紹介したパワポ資料です。転職活動時にポートフォリオとして使用しました。
個人開発したモバイルアプリを紹介したパワポ資料です。転職活動時にポートフォリオとして使用しました。ssusere75907
 
Css nite(2010.09.23)
Css nite(2010.09.23)Css nite(2010.09.23)
Css nite(2010.09.23)Yoshiki Ushida
 
デザイナーと一緒にコラボして仕上げるアニメーション実装とショーケース紹介
デザイナーと一緒にコラボして仕上げるアニメーション実装とショーケース紹介 デザイナーと一緒にコラボして仕上げるアニメーション実装とショーケース紹介
デザイナーと一緒にコラボして仕上げるアニメーション実装とショーケース紹介 Fumiya Sakai
 
Mapkitframework io9week
Mapkitframework io9weekMapkitframework io9week
Mapkitframework io9weekYuki Hirai
 
デザイナーとエンジニアが話す、iOSアプリケーション開発
デザイナーとエンジニアが話す、iOSアプリケーション開発デザイナーとエンジニアが話す、iOSアプリケーション開発
デザイナーとエンジニアが話す、iOSアプリケーション開発Kenta Ohsugi
 
IBDesignable / IBInspectable で UIプロトタイピンガブル
IBDesignable / IBInspectable で UIプロトタイピンガブルIBDesignable / IBInspectable で UIプロトタイピンガブル
IBDesignable / IBInspectable で UIプロトタイピンガブルMasaki Oshikawa
 
Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).
Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).
Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).Fumiya Sakai
 
Unityの夕べ in Fukuoka
Unityの夕べ in FukuokaUnityの夕べ in Fukuoka
Unityの夕べ in FukuokaShinobu Izumi
 
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会Mori Tetsuya
 
ニコニコ超デザイン-Metro考察編-
ニコニコ超デザイン-Metro考察編-ニコニコ超デザイン-Metro考察編-
ニコニコ超デザイン-Metro考察編-Mizushima Kazuhiro
 
Endo kitura on_bluemix
Endo kitura on_bluemixEndo kitura on_bluemix
Endo kitura on_bluemixjoohoun song
 
Ginとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebAppGinとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebAppAkihiko Horiuchi
 
FlutterをRenderObjectまで理解する
FlutterをRenderObjectまで理解するFlutterをRenderObjectまで理解する
FlutterをRenderObjectまで理解するKeisukeKiriyama
 
Potatotips3 hoshi gaki_akira_iwaya
Potatotips3 hoshi gaki_akira_iwayaPotatotips3 hoshi gaki_akira_iwaya
Potatotips3 hoshi gaki_akira_iwayaAkira Iwaya
 
React Nativeで開発するマルチプラットフォームアプリ
React Nativeで開発するマルチプラットフォームアプリReact Nativeで開発するマルチプラットフォームアプリ
React Nativeで開発するマルチプラットフォームアプリMasayuki Iwai
 

Similar to 試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine (20)

RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
 
ReduxとSwiftの組み合わせ:改訂版
ReduxとSwiftの組み合わせ:改訂版ReduxとSwiftの組み合わせ:改訂版
ReduxとSwiftの組み合わせ:改訂版
 
UIViewController in XIB + IBDesignable
UIViewController in XIB + IBDesignableUIViewController in XIB + IBDesignable
UIViewController in XIB + IBDesignable
 
Tinder風なUIを実装する際のアイデアと実装例紹介
Tinder風なUIを実装する際のアイデアと実装例紹介Tinder風なUIを実装する際のアイデアと実装例紹介
Tinder風なUIを実装する際のアイデアと実装例紹介
 
個人開発したモバイルアプリを紹介したパワポ資料です。転職活動時にポートフォリオとして使用しました。
個人開発したモバイルアプリを紹介したパワポ資料です。転職活動時にポートフォリオとして使用しました。個人開発したモバイルアプリを紹介したパワポ資料です。転職活動時にポートフォリオとして使用しました。
個人開発したモバイルアプリを紹介したパワポ資料です。転職活動時にポートフォリオとして使用しました。
 
Css nite(2010.09.23)
Css nite(2010.09.23)Css nite(2010.09.23)
Css nite(2010.09.23)
 
デザイナーと一緒にコラボして仕上げるアニメーション実装とショーケース紹介
デザイナーと一緒にコラボして仕上げるアニメーション実装とショーケース紹介 デザイナーと一緒にコラボして仕上げるアニメーション実装とショーケース紹介
デザイナーと一緒にコラボして仕上げるアニメーション実装とショーケース紹介
 
Mapkitframework io9week
Mapkitframework io9weekMapkitframework io9week
Mapkitframework io9week
 
デザイナーとエンジニアが話す、iOSアプリケーション開発
デザイナーとエンジニアが話す、iOSアプリケーション開発デザイナーとエンジニアが話す、iOSアプリケーション開発
デザイナーとエンジニアが話す、iOSアプリケーション開発
 
IBDesignable / IBInspectable で UIプロトタイピンガブル
IBDesignable / IBInspectable で UIプロトタイピンガブルIBDesignable / IBInspectable で UIプロトタイピンガブル
IBDesignable / IBInspectable で UIプロトタイピンガブル
 
Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).
Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).
Hint of“Passcode Lock”Screen and Logic (with LocalAuthentication).
 
Unityの夕べ in Fukuoka
Unityの夕べ in FukuokaUnityの夕べ in Fukuoka
Unityの夕べ in Fukuoka
 
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会
 
既存アプリのiOS8対応 #ios8yahoo
既存アプリのiOS8対応 #ios8yahoo既存アプリのiOS8対応 #ios8yahoo
既存アプリのiOS8対応 #ios8yahoo
 
ニコニコ超デザイン-Metro考察編-
ニコニコ超デザイン-Metro考察編-ニコニコ超デザイン-Metro考察編-
ニコニコ超デザイン-Metro考察編-
 
Endo kitura on_bluemix
Endo kitura on_bluemixEndo kitura on_bluemix
Endo kitura on_bluemix
 
Ginとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebAppGinとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebApp
 
FlutterをRenderObjectまで理解する
FlutterをRenderObjectまで理解するFlutterをRenderObjectまで理解する
FlutterをRenderObjectまで理解する
 
Potatotips3 hoshi gaki_akira_iwaya
Potatotips3 hoshi gaki_akira_iwayaPotatotips3 hoshi gaki_akira_iwaya
Potatotips3 hoshi gaki_akira_iwaya
 
React Nativeで開発するマルチプラットフォームアプリ
React Nativeで開発するマルチプラットフォームアプリReact Nativeで開発するマルチプラットフォームアプリ
React Nativeで開発するマルチプラットフォームアプリ
 

More from Fumiya Sakai

Measures for Growth with Firebase Remote Config & Unit Testing Using RxSwift
Measures for Growth with Firebase Remote Config & Unit Testing Using RxSwiftMeasures for Growth with Firebase Remote Config & Unit Testing Using RxSwift
Measures for Growth with Firebase Remote Config & Unit Testing Using RxSwiftFumiya Sakai
 
既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった
既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった
既存プロジェクトで使っていたDIをお引っ越し&DIYすることになったFumiya Sakai
 
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)UI実装に関するセッションを 簡単ながら振り返ってみる(仮)
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)Fumiya Sakai
 
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察するUIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察するFumiya Sakai
 
Hint of a little ingenuity about UI.
Hint of a little ingenuity about UI.Hint of a little ingenuity about UI.
Hint of a little ingenuity about UI.Fumiya Sakai
 
書籍執筆からの今後に向けてのロードマップ
書籍執筆からの今後に向けてのロードマップ書籍執筆からの今後に向けてのロードマップ
書籍執筆からの今後に向けてのロードマップFumiya Sakai
 

More from Fumiya Sakai (6)

Measures for Growth with Firebase Remote Config & Unit Testing Using RxSwift
Measures for Growth with Firebase Remote Config & Unit Testing Using RxSwiftMeasures for Growth with Firebase Remote Config & Unit Testing Using RxSwift
Measures for Growth with Firebase Remote Config & Unit Testing Using RxSwift
 
既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった
既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった
既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった
 
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)UI実装に関するセッションを 簡単ながら振り返ってみる(仮)
UI実装に関するセッションを 簡単ながら振り返ってみる(仮)
 
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察するUIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
UIKitやSwiftUIで表現や動きが特徴的なUI実装事例を考察する
 
Hint of a little ingenuity about UI.
Hint of a little ingenuity about UI.Hint of a little ingenuity about UI.
Hint of a little ingenuity about UI.
 
書籍執筆からの今後に向けてのロードマップ
書籍執筆からの今後に向けてのロードマップ書籍執筆からの今後に向けてのロードマップ
書籍執筆からの今後に向けてのロードマップ
 

Recently uploaded

新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 

Recently uploaded (7)

新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 

試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine