ListLayoutand its associated types are now public, allowing you to make custom layouts. Note that these APIs are still experimental and subject to change.
0.29.3 - 2021-10-22
- Ensure we properly pass through the
ListEnvironmentwhen updating on-screen views.
0.29.2 - 2021-10-21
- Fixed an erroneous
weakreference inSupplementaryContainerViewwhich lead to contents being deallocated too early – this is not actually needed.HeaderFooterViewStatePairholds the reference to the containedAnyPresentationHeaderFooterState, there are not direct strong references fromAnyPresentationHeaderFooterStatetoSupplementaryContainerView.
0.29.1 - 2021-10-18
- Ensure that when comparing header/footer types during updates, we are comparing the correct underlying types in a
type(of:)check.
0.29.0 - 2021-10-13
- Introduced
swipeActionsStyleproperty inItemContentprotocol. This allows clients to configure and specify different visual styles for swipe action views (such asroundedswipe actions).
onTaponHeaderFooternow takes no parameters, to disambiguate it fromconfigure.
0.28.0 - 2021-09-28
-
Introduced
AnyHeaderFooterConvertibleforHeaderFooterscontained in lists and sections, so you no longer need to wrap yourHeaderFooterContentin aHeaderFooterto receive default values. Eg, you can now do:section.header = MyHeaderContent(title: "Albums")
Instead of:
section.header = HeaderFooter(MyHeaderContent(title: "Albums"))
0.27.1 - 2021-09-28
- Change the default sizing of
ItemandHeaderFooterto.thatFits(.noConstraint)from requiring the min from the layout. This is more common for self-sizing cells.
0.27.0 - 2021-09-15
clearsSelectionOnViewWillAppearwas moved toListViewController.
0.26.1 - 2021-09-03
- Includes fix for header reuse from 0.25.1.
0.26.0 - 2021-08-14
- You can now provide default list bounds for participating layouts via the
environment.listContentBoundsproperty. This allows your containing screen, eg, to provide default bounds to ensure content lays out correctly. Thetableandgridlayout types have been updated to read these content bounds.
ListSizingwas renamed toList.Measurement, to reflect that it affects measurement and to align with Blueprint's terminology for measurement.
0.25.0 - 2021-08-12
- Add support for
containerHeader, a header which can be added by the container which is displaying the list. This is useful for, eg, a custom navigation controller to add its large title view to the list's content. This header is not affected by the list's vertical padding.
0.24.0 - 2021-08-07
- Add support for
ReappliesToVisibleView, which allows controlling when an on-screen view should have its content re-applied.
0.23.2 - 2021-08-05
- Ensure that scroll actions work with horizontal lists.
0.23.1 - 2021-07-26
- Fix two reordering crashes, which could happen when 1) a reorder signal resulted in an immediate deletion at the end of the list, and 2) a crash during scrolling during a reorder event.
0.23.0 - 2021-06-29
- Introduce
defaultHeaderFooterPropertiesonHeaderFooterContent, to allow specifying default values for aHeaderFooterwhen values are not passed to the initializer.
0.22.2 - 2021-06-23
- Fixed
identifier(for:)onSectionto match name ofidentifier(with:)onItemContent.
0.22.1 - 2021-06-22
- Fixed
Identifiableconformance forItemContent.
0.22.0 - 2021-06-22
- Listable now depends on Blueprint
0.27.0which has major breaking changes. There are no public changes to Listable, except public interfaces determined by Blueprint protocol conformance.
0.21.0 - 2021-06-17
- When applying an update to visible views during content updates, the update now occurs within an animation block. This allows your view to inherit implicit animations more easily.
- Reordering between multiple sections is now supported.
- Introduced type safe access to
Sectioncontent following reorder events. SeeSection.filtered. ListStateObserver.onItemReorderedwas added to observe reorder events at a list-wide level.ListLayoutwas extended to allow customization of in-progress moves. Note thatListLayoutis not yet public.
Reorderinghas been renamed toItemReordering, and a newSectionReorderinghas been introduced. This allows finer-grained control over validating reorder events at both the item level and section level.ListReorderGestureandItemReordering.GestureRecognizerhave been heavily refactored to reduce visibility of internal state concerns.Item.identifierhas been renamed toItem.anyIdentifier. The newItem.identifierproperty is now a fully type safe identifier.ReorderingActionswas refactored to expose less public state and ease use in UIView-backed list elements.Identifier<Represented>is nowIdentifier<Represented, Value>; egIdentifier<MyContent, UUID>. This is done to support reacting to reordering events in a more type safe manner, and to makeIdentifiercreation more type safe. This is a large breaking change.- Changed how
identifiers forItemContentare represented.ItemContentnow returns a an identifier of a specificIdentifierValue(eg,String,UUID, etc), which is then assembled into anIdentifierby the containing item. Additional APIs have been added for creatingIdentifiers in a more type safe manner. This is a large breaking change.
0.20.2 - 2021-04-19
- Fixed the spacing between the header and the first section of a
TableListLayoutto not add the top padding.
0.20.1 - 2021-04-06
0.20.0 - 2021-03-29
- Changed how
ListView.contentSizeis implemented in order to improve performance. An internal list is no longer used, instead we create a layout and ask it to lay out its elements.List.Measurementalso moved toBlueprintUILists, as that is the only place it was used.
0.19.0 - 2021-03-22
- Add support for adjusting the content offset when the refresh control becomes visible with the
offsetAdjustmentBehaviorproperty.
Example usage:
list.content.refreshControl = RefreshControl(
isRefreshing: isRefreshing,
offsetAdjustmentBehavior: .displayWhenRefreshing(animate: true, scrollToTop: true),
onRefresh: onRefresh
)
0.18.0 - 2021-03-12
- When calling
scrollToItemwith a.topscroll position, the item no longer appears underneath sticky section headers.
- Adds
scrollToSectiontoListActionsandListView. To support this functionality,Sectioncan now be queried with anIdentifier. Also addedSectionPositionto specify the top or bottom within aSection.
Example usage:
listActions.scrolling.scrollToSection(
with: MyItem.identifier(with: id),
sectionPosition: .top,
scrollPosition: ScrollPosition(position: .centered)
)
0.17.0 - 2021-03-10
-
When swiping to delete, limit overscrolling to 20% of the cell width. This prevents undesirable visual state while maintaining swipe bounciness. Additionally, ignore initial swipes to the right which do not "open" the cell.
-
Fixed a crash that occurred when the list's width or height would become zero.
- Updates to
ItemContentCoordinatorto properly support animations in Blueprint-backed rows. This change also generalizes the contained animation type toViewAnimation, for use in both scrolling and content updates.
0.16.0 - 2021-02-08
- When updating
contentInset, retain the values pulled from theCollectionView. This is to avoid clobbering the content inset potentially set by other things like navigation controllers.
- Rename
buildparameters toconfigure, in order to be more consistent within the framework and with Blueprint.
0.15.1 - 2021-01-25
- Fix a memory leak in
ListViewthat caused allListViewswith content in them to leak.
0.15.0 - 2021-01-22
-
Introduce support for layout customization for
Item,HeaderFooter, andSectionfor allListLayouttypes, not just.table. -
Add
insertedandremoveditems to.onContentChanged, to easily determine what content was added or removed from the list a central location.
- Rename
.listlayout to.table, which is clearer, and also reduces confusion betweenListLayout(the base protocol for layouts), and the specific table-type layout.
SwipeActionsConfiguration.performsFirstActionWithFullSwipeis now respected when set tofalse.
0.14.1 - 2021-01-06
-
Ensure that
ItemContents andHeaderFooters are a value type. This is generally assumed by Listable, but was previously not validated. This is only validated inDEBUGbuilds, to avoid otherwise affecting performance. -
Fix a regression that caused content to be re-measured during each application of an
Appearance, even if the newAppearancewas equal.
- Adds a way to create items or header/footers for Blueprint lists without requiring the creation of a
BlueprintItemContentorBlueprintHeaderFooterContent.
0.13.0 - 2020-12-14
- Introduce
LocalizedItemCollator, a list-friendly version ofUILocalizedIndexedCollationwhich allows collating a list of content at one time.
0.12.1 - 2020-12-01
0.12.0 - 2020-12-01
-
Changed behavior of
scrollInsets(nowscrollIndicatorInsets), which now only affects the scroll indicator insets of the contained scroll view, and does not affect the content inset of the scroll view. Please usingpadding, etc, on the various list layout types instead to control visual padding. -
Ensure we respect both
frameandboundschanges to update the innerCollectionView's frame. We previously used to only respectframechanges, but we should also respectboundschanges, as these are used by auto layout. -
Fix support for
autolayoutitems and headers/footers by ensuring we pass through the correctsystemLayoutSizeFittingcalls to content. Add assertions that measured sizing is within a reasonable bound. -
Appearance.backgroundColornow respects the currentUITraitCollection.userInterfaceStyle. This means that the background color will default towhitein light mode, andblackin dark mode. -
Update
ListView.contentSize(in:for:)to properly validate the providedfittingSize. This ensures that.unconstrainedmeasurements along the wrong axis will now assert; instead of freeze.
-
Introduce
onSelectionChangedonListStateObserverto allow observing when the selected rows change. -
Pass through
BlueprintUI.Environmentto theElements being rendered fromBlueprintItemContentandBlueprintHeaderFooterContent. This ensures that the content you put into aListrespects theBlueprintUI.Environmentof theListitself. This PR also introducesListEnvironmentto facilitate this, which allows similar passthrough of environment variables within Listable. -
Add a
didPerformcallback toAutoScrollAction, which allows registering a callback when an auto scroll action occurs. -
Change
animatedoption on scrolling to ananimationoption`, to allow customizing the animation's behavior.
0.11.0 - 2020-10-20
- Allow setting the
sizingtype on aList. This controls how the list should be sized by Blueprint: Should it take up all allowed space, or should it size to fit based on its content.
0.10.1 - 2020-10-01
- Fixed import of Swift bridging header, so Cocoapods can build with or without
use_frameworks!.
0.10.0 - 2020-09-24
- Adjust calculated keyboard inset in both
setFrameandlayoutSubviews. This resolves issues that can occur if the list frame changes while the keyboard is visible.
- Add support for
onInsert,onRemove,onMove,onUpdate, onItemto track when when items are added, removed, moved, or updated. ChangedonContentChangedtoonContentUpdatedonListStateObserver; it is always called during updates; you can check thehadChangesproperty.
- Removed support for iOS 10. Future releases will only support iOS 11 and later.
-
Change how keyboard are observed to avoid a pitfall where the keyboard would not be accounted for if a
ListViewis created while a keyboard is already on screen. To avoid this problem, we switch to a globally sharedKeyboardObserverwhich is loaded at app startup time. -
isEmptyonContentandSectionhave been replaced withcontains(any:), which allows more granular comparison of the content in the whole list and in individual sections, respectively. This allows you to check if the list or sections contain headers, footers, items, all, or some combination of them. -
Listable has been renamed to ListableUI, and BlueprintLists is now named BlueprintUILists. This is done to be more consistent with other Square UI libraries, and to avoid a conflict with an existing published Cocoapod, also named Listable.
-
Simplify
Sizingnow that enums support default associated values.. Now instead of separate.thatFitsand.thatFitsWith(Constraint)enums, there is a single.thatFits(Constraint = .noConstraint)case (the same applies forautolayout). -
Changed how
zIndexesare assigned to header and items, and support tapping headers / footers. This allows registering anonTaphandler for any HeaderFooter, and providing a background to display while the tap's press is active.
-
Add support for
ListStateObserverso that you can observe changes made to the list such as insertions, removals, scroll events, etc. -
Add support for
ListActionswhich allows performing actions on the underlying list view when used in a declarative environment, or when you otherwise do not have access to the underlying view instance (ListStateViewController). -
Add support for Behavior.KeyboardAdjustmentMode, which allows for disabling automatic keyboard adjustment behavior. This is useful if your container view is managing the size of or insets on a
ListViewitself. -
Introduced
callAsFunctionsupport when building with Xcode 11.4 or later. This allows you to replace code like this:List { list in list += Section("first") { section in ... } }With this:
List { list in list("first") { section in ... } }Improving terseness when building sections in a list.
-
.paged()is now a supported layout type. This allows implementing your list to render similarly to aUIPageViewController, in either horizontal or vertical alignment.
- Removed support for .
horiztonallayouts on.table()layouts. Now only.verticalis supported (this could return at a later date if needed).
-
Changed
Sectioninitialization APIs fromSection(identifier: "my-id") { ... }toSection("my-id") { ... }– it's clear from the API what the first param is for, so the param name just made callsites longer. -
Renamed
setContentandsetPropertiesmethods onListViewtoconfigure. -
Significant refactors to how the custom layout APIs work. While this is mostly an internal concern, it continues to refine these APIs to set them up for public exposure and usage at a later date to customize layouts.
- Significant performance improvements for list updates which contain either no changes, or only in-place updates to existing items and sections. In many cases, these updates will now be 80% faster. This change also improves performance for other types of changes such as insertions, removals, or moves, but not to the same degree.
-
Added additional layout configuration options:
headerToFirstSectionSpacingandlastSectionToFooterSpacingnow let you control the spacing between the list header and content, and the content and the list footer. -
Add support for snapshot testing
Items via theItemPreviewViewclass. This is a view type which takes in some configuration options, and anItem, which you can then use in snapshot tests to verify the appearance of yourItemandItemContent.let view = ItemPreviewView() view.update( with: 300.0, state: .init(isSelected: false, isHighlighted: false), item: Item(MyItemContent(...)) ) self.takeSnapshot(of: view) -
Add support for Xcode previews via the
ItemPreviewtype. This allows easy previewing yourItemContentduring development like so:struct ElementPreview : PreviewProvider { static var previews: some View { ItemPreview.withAllItemStates( for: Item(XcodePreviewDemoContent( text: "Lorem ipsum dolor sit amet (...)" )) ) } }There are included options like
withAllItemStateswhich allow seeing previews across the various possible selection and highlight states. -
Add
customInterSectionSpacingproperty toSection.Layoutwhich allows the user to specify custom spacing after a section, overriding the calculated spacing. -
Add
insertAndRemoveAnimationstoItemto allow customizing the animations used when anItemis inserted or removed from a list. Note that customizing this option when responding toSwipeActionswill come at a later date. -
Add
ListViewControllermake it easy to create view controllers backed by a ListableListView.
-
Update
Itemcallbacks to allow for providing more info to the callback parameters. -
ListAppearance.Layout.paddingis now applied around all content in the list, not only around sections. To regain the previous behavior, useheaderToFirstSectionSpacingandlastSectionToFooterSpacing. -
Significantly change how layout configuration is done to make it clearer which type of layout is currently in use, and which options are available on which layouts.
Previously, to configure a layout, you would write code like this:
list.appearance.layoutType = .table list.appearance.table.layout.padding = UIEdgeInsets(...)Now, you configure the layout like this:
list.layout = .table { $0.layout.padding = UIEdgeInsets(...) }Or, for your custom layouts, like this:
list.layout = MyCustomLayout.describe { $0.myLayoutsProperty = .foo }
- Change
Item'sonSelectandonDeselectto be performed asynchronously after a single runloop spin, to giveUICollectionViewtime to schedule animations if these callbacks are slow. - Add improved signpost logging for selection and deselection, to more easily identify slow callbacks.
- Fixed multiple selection and highlight issues: Highlighting cells now only occurs if the
selectionStyleistappableorselectable. Ensure that whentappableis provided, the content of a cell is updated when the cell is deselected.
- Added type aliases for
HeaderFooterandHeaderFooterContentto reduce verbosity of use. Now instead of typingHeaderFooter(MyHeader()), you can useHeader(MyHeader()). - Replace unused / experimental
Bindingtype withCoordinator, which allows you to independently manage item state in a similar manner to SwiftUI'sUIViewRepresentable'sCoordinator.
- Major Change:
ItemElementandHeaderFooterElementwere renamed toItemContentandHeaderFooterContent, respectively. This is intended to be a clearer indicaton as to what they are for (the content of an item or header/footer), and fixes a name collision with Blueprint, where we overloaded the meaning ofElementwhen using Blueprint integration viaBlueprintUILists. - Changed
BlueprintHeaderFooter{Content/Element}'s main method to beelementRepresentationinstead ofelement. This allows easier conformance ofBlueprintUI.ProxyElementtypes toBlueprintHeaderFooter{Content/Element}. SelectionModewas moved fromContenttoBehavior, which is in line with other collection view behaviours like scrolling and underflow.- Rename
ItemSelectionStyle.nonetoItemSelectionStyle.notSelectable. This is to avoid conflicts withOptional.nonewhen working withItemSelectionStyleas anOptional.
- Added support for conditionally scrolling to items on insert, based on the
shouldPerformblock passed to theAutoScrollAction.
Earlier releases were ad-hoc and not tracked. To see all changes, please reference closed PRs on Github.