From 7f8c1e4b0d90eeb4385e8fd9a5300ff09978866a Mon Sep 17 00:00:00 2001 From: Zach Waugh Date: Thu, 20 May 2021 18:16:21 -0400 Subject: [PATCH 1/2] Use a list layout so we get free swipe actions --- .../DocumentViewController.swift | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/Source/View Controllers/DocumentViewController.swift b/Source/View Controllers/DocumentViewController.swift index 95a6fee..9f2dc48 100644 --- a/Source/View Controllers/DocumentViewController.swift +++ b/Source/View Controllers/DocumentViewController.swift @@ -359,17 +359,20 @@ final class DocumentViewController: UIViewController { }() private func makeCollectionViewLayout() -> UICollectionViewCompositionalLayout { - let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .estimated(Metrics.estimatedBlockHeight)) - let item = NSCollectionLayoutItem(layoutSize: itemSize) - - let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .fractionalHeight(1)) - let group = NSCollectionLayoutGroup.vertical(layoutSize: groupSize, subitems: [item]) - group.interItemSpacing = .fixed(Metrics.blockSpacing) - - let section = NSCollectionLayoutSection(group: group) - section.contentInsets = NSDirectionalEdgeInsets(top: Metrics.sectionTopPadding, leading: 0, bottom: 0, trailing: 0) + var config = UICollectionLayoutListConfiguration(appearance: .plain) + config.backgroundColor = .white + config.showsSeparators = false + + config.trailingSwipeActionsConfigurationProvider = { indexPath in + UISwipeActionsConfiguration(actions: [ + UIContextualAction(style: .destructive, title: "Delete", handler: { _, _, handler in + self.deleteBlock(at: indexPath) + handler(true) + }) + ]) + } - return UICollectionViewCompositionalLayout(section: section) + return UICollectionViewCompositionalLayout.list(using: config) } } From 0776c2c376477d5887849f2988fec640b3379513 Mon Sep 17 00:00:00 2001 From: Zach Waugh Date: Thu, 20 May 2021 18:17:15 -0400 Subject: [PATCH 2/2] Incorporate block spacing into cells --- Source/Views/Cells/ListItemBlockCellView.swift | 6 +++--- Source/Views/Cells/QuoteBlockCellView.swift | 8 ++++---- Source/Views/Cells/TextBlockCellView.swift | 4 ++-- Source/Views/Cells/TodoBlockCellView.swift | 4 ++-- Source/Views/Metrics.swift | 6 +++--- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Source/Views/Cells/ListItemBlockCellView.swift b/Source/Views/Cells/ListItemBlockCellView.swift index 45715dc..fea868d 100644 --- a/Source/Views/Cells/ListItemBlockCellView.swift +++ b/Source/Views/Cells/ListItemBlockCellView.swift @@ -21,13 +21,13 @@ final class ListItemBlockCellView: BaseTextCellView { contentView.addSubview(textView) NSLayoutConstraint.activate([ - listItemLabel.topAnchor.constraint(equalTo: contentView.topAnchor), + listItemLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: Metrics.blockContentVerticalPadding), listItemLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: Metrics.blockContentHorizontalPadding), textView.leadingAnchor.constraint(equalTo: listItemLabel.trailingAnchor, constant: Metrics.listItemLabelContentSpacing), textView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -Metrics.blockContentHorizontalPadding), - textView.topAnchor.constraint(equalTo: contentView.topAnchor), - textView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor), + textView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: Metrics.blockContentVerticalPadding), + textView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -Metrics.blockContentVerticalPadding), ]) } diff --git a/Source/Views/Cells/QuoteBlockCellView.swift b/Source/Views/Cells/QuoteBlockCellView.swift index 9168ab0..f9a8199 100644 --- a/Source/Views/Cells/QuoteBlockCellView.swift +++ b/Source/Views/Cells/QuoteBlockCellView.swift @@ -23,14 +23,14 @@ final class QuoteBlockCellView: BaseTextCellView { NSLayoutConstraint.activate([ quoteBorderView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: Metrics.blockContentHorizontalPadding), - quoteBorderView.topAnchor.constraint(equalTo: contentView.topAnchor), - quoteBorderView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor), + quoteBorderView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: Metrics.blockContentVerticalPadding), + quoteBorderView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -Metrics.blockContentVerticalPadding), quoteBorderView.widthAnchor.constraint(equalToConstant: Metrics.quoteBorderWidth), textView.leadingAnchor.constraint(equalTo: quoteBorderView.trailingAnchor, constant: Metrics.quoteBorderSpacing), textView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -Metrics.blockContentHorizontalPadding), - textView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: Metrics.quoteContentVerticalPadding), - textView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -Metrics.quoteContentVerticalPadding), + textView.topAnchor.constraint(equalTo: quoteBorderView.topAnchor, constant: Metrics.quoteContentVerticalPadding), + textView.bottomAnchor.constraint(equalTo: quoteBorderView.bottomAnchor, constant: -Metrics.quoteContentVerticalPadding), ]) } diff --git a/Source/Views/Cells/TextBlockCellView.swift b/Source/Views/Cells/TextBlockCellView.swift index 5924db3..98ab667 100644 --- a/Source/Views/Cells/TextBlockCellView.swift +++ b/Source/Views/Cells/TextBlockCellView.swift @@ -21,8 +21,8 @@ final class TextBlockCellView: BaseTextCellView { NSLayoutConstraint.activate([ textView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: Metrics.blockContentHorizontalPadding), textView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -Metrics.blockContentHorizontalPadding), - textView.topAnchor.constraint(equalTo: contentView.topAnchor), - textView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor), + textView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: Metrics.blockContentVerticalPadding), + textView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -Metrics.blockContentVerticalPadding), ]) } } diff --git a/Source/Views/Cells/TodoBlockCellView.swift b/Source/Views/Cells/TodoBlockCellView.swift index 672e006..ec4cf67 100644 --- a/Source/Views/Cells/TodoBlockCellView.swift +++ b/Source/Views/Cells/TodoBlockCellView.swift @@ -37,14 +37,14 @@ final class TodoBlockCellView: BaseTextCellView { NSLayoutConstraint.activate([ checkboxButton.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: Metrics.blockContentHorizontalPadding), - checkboxButton.topAnchor.constraint(equalTo: contentView.topAnchor), + checkboxButton.topAnchor.constraint(equalTo: contentView.topAnchor, constant: Metrics.blockContentVerticalPadding), checkboxButton.heightAnchor.constraint(equalToConstant: Metrics.checkboxSize.height), checkboxButton.widthAnchor.constraint(equalToConstant: Metrics.checkboxSize.width), textView.leadingAnchor.constraint(equalTo: checkboxButton.trailingAnchor, constant: Metrics.checkboxTextContentSpacing), textView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -Metrics.blockContentHorizontalPadding), textView.topAnchor.constraint(equalTo: checkboxButton.topAnchor, constant: Metrics.checkboxTextContentVerticalOffset), - textView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor), + textView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -Metrics.blockContentVerticalPadding), contentView.heightAnchor.constraint(greaterThanOrEqualToConstant: Metrics.checkboxSize.height) ]) diff --git a/Source/Views/Metrics.swift b/Source/Views/Metrics.swift index 5871de8..c3425fe 100644 --- a/Source/Views/Metrics.swift +++ b/Source/Views/Metrics.swift @@ -3,12 +3,12 @@ import UIKit enum Metrics { static let sectionTopPadding: CGFloat = 16 - /// Spacing in-between adjacent blocks - static let blockSpacing: CGFloat = 12 - /// Leading/trailing padding of content blocks static let blockContentHorizontalPadding: CGFloat = 16 + /// Top/Bottom padding added to each cell that controls block spacing in list + static let blockContentVerticalPadding: CGFloat = 6 + static let estimatedBlockHeight: CGFloat = 40 static let listItemLabelContentSpacing: CGFloat = 4