[SPT-1555] Universal StackView
Что сделано?
- Добавлено
StackViewпо стандартам библиотеки компонентов - Усовершенствован StackCellGenerator для построения вьюшек из Nib
- Проставлен
intrisinctContentSizeдля отображенияTitleTableViewCellвнутри стека - Добавлен пример использования нового StackView внутри коллекции и таблицы
- Добавлена возможность декорировать инстанс базового генератора
- Добавлены трансформации в Foldable и Diffable
-
BaseCellGeneratorиDiffableCellGeneratorтеперь привязаны одновременно кUITableViewCellиUICollectionCell. Дубли коллекции удалены. - FoldableItem и FoldableCellGenerator теперь универсальные и используют generic extensions для связки с таблицей/коллекцией
- Добавлена возможность декорировать BaseCellGenerator и трансформировать в Foldable или Diffable
- ...
Зачем это сделано?
Чтобы уменьшить количество сопровождающих классов при создании сложных ячеек на основе сочетания стека и уже готовых ячеек
На что обратить внимание?
- ПР драфтовый для раннего обсуждения
- ~~TBD разрешить todo в TableWrappedCell и CollectionWrappedCell~~ Добавлен EmptyViewGenerator для генерации View, но без установки Model Установка модели будет произведена в ViewWrapper.
- TBD https://github.com/surfstudio/ReactiveDataDisplayManager/pull/254#issuecomment-1649500915 ~поправить расчет стека при внедрении ячейки внутрь стека (нетиповое использование)~ исправлено добавлением intrinsicContentSize ячейке
- ~~TBD generic функция generator для контекстно-зависимого вызова и возможного отбрасывания
SomeView.rddm.для упрощения синтаксиса~~ добавлены Context для упрощения синтакциса - TableStack, CollectionStack и пр. ~~пока не~~ удалены ~~, но будут после улучшения синтаксиса билдера~~. Добавлено все неободимое чтобы приблизить синтаксис к эталонному желаемому варианту.
- Использование ячейки внутри стека нецелевое, но нужно для показа возможности
- Напоминаю, что
mutatingиPropertyспрячутся за макрос, который ожидает релиза Xcode 15 - Надо придумать как ограничить трансформации генераторов ведь синтаксис позволяет сделать
asFoldable.asDiffableно последняя трансформация в текущей реализации "перекроет" первую.. - ...
Как протестировать?
- Тапнуть в примере на строчку "Table with stack cell"
| Warnings | |
|---|---|
| :warning: | Oops! We have found some issues. It's better to fix them to keep code clean |
SwiftLint found issues
| Severity | File | Reason |
|---|---|---|
| Warning | BakgroundStyle.swift:32 | Shorthand syntactic sugar should be used, i.e. Int? instead of Optional<Int>. (syntactic_sugar) |
| Warning | BorderStyle.swift:42 | Shorthand syntactic sugar should be used, i.e. Int? instead of Optional<Int>. (syntactic_sugar) |
| Error | ComponentsOverviewTableViewController.swift:26 | Line should be 145 characters or less: currently 589 characters (line_length) |
Generated by :no_entry_sign: Danger Swift against b75c607e3522baae33d837353a9c615e057711ac
Codecov Report
Patch coverage: 13.33% and project coverage change: -40.02% :warning:
Comparison is base (
cbf811a) 72.66% compared to head (ea60f8c) 32.64%.
Additional details and impacted files
@@ Coverage Diff @@
## develop #253 +/- ##
============================================
- Coverage 72.66% 32.64% -40.02%
============================================
Files 161 166 +5
Lines 4905 5113 +208
Branches 2224 2285 +61
============================================
- Hits 3564 1669 -1895
- Misses 1221 3378 +2157
+ Partials 120 66 -54
| Flag | Coverage Δ | |
|---|---|---|
| uitests | ? |
|
| unittests | 32.64% <13.33%> (-1.39%) |
:arrow_down: |
Flags with carried forward coverage won't be shown. Click here to find out more.
| Files Changed | Coverage Δ | |
|---|---|---|
| Source/Collection/CollectionCell+RDDM.swift | 0.00% <0.00%> (-100.00%) |
:arrow_down: |
| Source/Collection/CollectionSection.swift | 0.00% <0.00%> (-100.00%) |
:arrow_down: |
| ...rs/CalculatableHeightCollectionCellGenerator.swift | 0.00% <0.00%> (-100.00%) |
:arrow_down: |
| ...ors/CalculatableWidthCollectionCellGenerator.swift | 0.00% <0.00%> (ø) |
|
| ...urce/Collection/Generators/CollectionContext.swift | 0.00% <0.00%> (ø) |
|
| ...lugins/PluginAction/CollectionFoldablePlugin.swift | 6.97% <0.00%> (-74.42%) |
:arrow_down: |
| ...ollection/Protocols/CollectionChildrenHolder.swift | 0.00% <0.00%> (ø) |
|
| ...ollection/Wrapper/CollectionWrappedCell+RDDM.swift | 0.00% <0.00%> (ø) |
|
| ...rce/Collection/Wrapper/CollectionWrappedCell.swift | 0.00% <0.00%> (ø) |
|
| ...urce/Common/Generators/DiffableCellGenerator.swift | 0.00% <0.00%> (ø) |
|
| ... and 20 more |
:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.
Обновил синтаксис. По-моему уже лучше, но не идеал конечно.
2 проблемы, с которыми столкнулся
- resultBuilder не позволяет использовать статические инициализаторы Решено также как в Editor.Property классе передачей типа: равно точки входа на фабрику (ViewContext, TableContext, CollectionContext). Контексты можно расширять своими функциями и шорткатами.
- generic функции надо конкретизировать
Пришлось в generic функцию добавить параметр для конкретизации.
it.viewNib(type: TitleTableViewCell.self, model: "1")противTitleTableViewCell.rddm.viewGenerator(with: "1", and: .nib)Надо оценить насколько это интуитивно.
Таким образом контекст определяет для какой коллекции нужен генератор. Генераторы создаются через контекст.
В случае со стеком вернул в примере установку children вместо выноса в отдельный параметр, чтобы исключить неочевидные ошибки и конфликты при построении стека и для более древовидной структуры.
Очередное обновление и сразу 2 варианта синтаксиса.
-
it.gen(CellOrViewType.self, model: Model)Полностью рабочий, но читаемость все еще далека.
-
CellOrViewType.build(in: Context, with: Model)По сути extension к предыдущему решению. Есть проблема с TableCell классами. Они не выходят на создание baseGenerator из-за чего получаем ~~краш~~
TableWrappedCell<SomeOtherCell>вместо генератора дляSomeOtherCell.
Пока склоняюсь ко второму варианту, но его еще надо починить.
Кстати, оба варианта (плюс предыдущий) заваливают варнингами типа такого
Это напоминает о том, что если уж надо какую-то верстку из ячейки запинуть в стек, то лучше отрефакторить, вынеся необходимый кусок во вью.
Отобразить ячейку возможно, но могут быть проблемы с ресайзом, что впринципе и показывает a11y аудит.
Убрал ready for review и поставил blocker.
Изменений много. Их надо влить чтобы не мучаться потом с конфликтами.
Синтаксис оригинала достигнут. Добавлена возможность декорировать и трансформировать генераторы.
Тесты на Xcode 15 с performAccessibilityAudit успешны.