The markdown parsing is broken/disabled for release notes. Sorry about that, I'm chasing the source of a crash that's been bringing this website down for the last couple of days.
### Added
- Added a weak reference from `TopBarContainer` / `BottomBarContainer` to their parent bar installer
- Added a `BarInstallerConfiguration` type to allow both global and per-instance configuration of
bar installers.
- Added an `applyBars` closure to `BarInstallerConfiguration` to allow consumers to configure _when_
bars are applied to the underlying `BarContainer` by a bar installer, e.g. to defer bar model
updates that might conflict with an in-flight shared element transition.
- Support for hitting 120 FPS on iPhone ProMotion displays when programmatically scrolling to an
item in a collection view.
- Added `itemModel(β¦)`, `barModel(β¦)` methods to host a SwiftUI `View` within an Epoxy container and
the `swiftUIView(β¦)` method to host an `EpoxyableView` within a SwiftUI `View`
- Added a SwiftUI environment value for requesting size invalidation of the containing Epoxy collection view cell.
### Fixed
- Fixes an issue that could cause `CollectionView` scroll animation frames to have an incorrect
content offset when paired with a non-zero `adjustedContentInset`.
- Fixes an issue that could cause `VGroupView` and `HGroupView` to grow too tall when nested in
containers that give them a larger height than their natural height.
- Fixes a bug in the `KeyboardPositionWatcher` that would consider an even slightly offscreen view
as having a keyboard overlap when the keyboard is dismissed, resulting in incorrect keyboard
offsets.
- Fixes an issue when mutating state synchronously does not pick up the current SwiftUI transaction.
- Fixes a bug where the `avoidsKeyboard` parameter would be disregarded in a `BottomBarInstaller`
initializer.
### Changed
- Removed the default bar installer behavior where bar model updates were deferred while a view
controller transition is in progress.
### Added
- Added an `insetMargins` property to `TopBarContainer` and `BottomBarContainer` that configures whether or not the container sets layout margins derived from the `safeAreaInsets` of its `viewController`.
### Fixed
- Fixed incorrect assertion logging when accessing an item with an invalid index path.
- Mitigated a `EXC_BAD_ACCESS`Β crash that caused by a bad `nonnull` bridge in `CollectionViewCell`.
- Fixed an issue where styles were not being used in the `diffIdentifier` calculation of `GroupItems`.
### Changed
- The `SectionModel` initializer now requires a `dataID` to make it harder to have sections with duplicate identity that causes a runtime warning and potentially unexpected diffing behavior.
### Added
- Added an `UpdateStrategy` to `CollectionView` to allow specifying that it should update using non-
animated `performBatchUpdates(β¦)`, which can be more performant and behave more predictably than
`reloadData()`.
- Added `reflowsForAccessibilityTypeSizes` and `forceVerticalAccessibilityLayout` properties to `HGroup.Style`.
### Fixed
- Improved `CollectionView` logic for deciding when to `reloadData(β¦)` over `performBatchUpdates(β¦)`
in specific scenarios.
- Fixed an issue where the `accessibilityAlignment` property of `HGroup` was not being respected.
- Fixed an issue where `accessibilityAlignment` and `horizontalAlignment` would overwrite one another
- Break a temporary retain cycle in `.system` presentation style
### Changed
- `CollectionViewConfiguration.usesBatchUpdatesForAllReloads` now defaults to `true`.
- Changed `CollectionViewConfiguration` from an immutable `class` to a `struct` to make it easier to
modify an existing configuration.
### Added
- Added an example with text field to show how can we use `avoidsKeyboard` feature
- Add EpoxyLayoutGroups, a declarative API for creating components
### Fixed
- `AnyItemModel` is selectable when there are no `DidSelect` callbacks on the underlying model
### Added
- Added support for `Array` and `Optional` expressions to model result builders
- Added support for `Optional` expressions to `PresentationModel` result builders
- Made `AnyItemModel` and `AnySupplementaryItemModel` conform to `DidChangeStateProviding`,
`DidChangeStateProviding` and `SetBehaviorsProviding`
- Made `AnyItemModel`, `AnySupplementaryItemModel`, and `AnyBarModel` conform to `StyleIDProviding`
- Adds a `keyboardContentInsetAdjustment` property to `UIScrollView` with the amount that the that its `contentInset.bottom` has been adjusted to accommodate for the keyboard by a `KeyboardPositionWatcher`
- Made `ItemSelectionStyle` conform to `Hashable`
- `ReuseIDStore` has a new method to vend a previously registered reuse ID, `registeredReuseID(for:)`
### Fixed
- Bar installers gracefully handle redundant calls to install/uninstall
- `CollectionView` more gracefully handles styleID mutations after registration
### Changed
- `ReuseIDStore.registerReuseID(for:)` has been renamed to `ReuseIDStore.reuseID(byRegistering:)`
### Added
- Added result builders for `SectionModel`, `ItemModel`, `BarModel`, `PresentationModel`, and
`NavigationModel`
- Added initializers and methods to `CollectionViewController` that take an array of `ItemModel`s
and transparently wrap them in a `SectionModel` for consumers.
### Changed
- Updated public let properties of public structs with memberwise initializers to be public var
- `BarStackView` now handles selection of bar models and can be used as an `EpoxyableView`
- The cases of `BarStackView.ZOrder` have been renamed to be more semantically accurate
- Enables `CollectionView` prefetching by default, as the issues preventing it from being enabled by
default are now resolved in recent iOS versions
- Support animated moves in `BarStackView`
- Fixed ordering when inserting and removing bar models
- Crossfade between bars of the same view type with different style IDs in `BarStackView`