Skip to content

Files

Latest commit

f457c6b · Dec 19, 2024

History

History
1175 lines (692 loc) · 51.9 KB

CHANGELOG.md

File metadata and controls

1175 lines (692 loc) · 51.9 KB

Fixed

Added

Removed

Changed

Misc

Internal

Past Releases

14.5.0 - 2024-12-18

Added

  • Added CacheCleaner which exposes a method to force Listable's static caches to be cleared.

14.4.1 - 2024-10-31

Changed

  • animatesChanges now always defaults to true.

Internal

  • BlueprintUILists now depends on BlueprintUI 5.0.0.

14.4.0 - 2024-08-27

Added

  • Added new isScrollEnabled property to Behavior to disable scrolling on a list if needed.

Removed

  • Revert: Fixed an issue where animations would occur when dequeuing / reusing cells. A layout is now forced without animation before presentation.

14.3.1 - 2024-08-08

Fixed

  • Fixed an issue where animations would occur when dequeuing / reusing cells. A layout is now forced without animation before presentation.

14.3.0 - 2024-07-31

Added

  • You may now control list update animations with the ListAnimation type.

14.2.0 – 2024-04-29

Internal

  • BlueprintUILists now depends on BlueprintUI 4.0.0.

14.1.0 – 2024-03-28

Fixed

  • ListReorderGesture no longer blocks child accessibility, now exposing a proxy element for accessible control.

14.0.3 – 2024-03-03

Fixed

  • Fixed an issue that could cause a crash during view reuse when the list contained different types of headers.

Internal

  • Generated documentation now uses a static copyright notice to avoid noisy diffs.

14.0.2 - 2024-02-29

Fixed

  • Fixed a bug that resulted in some swipe action buttons not being tappable.

14.0.1 - 2024-02-21

Fixed

  • Fix SPM dependency on listable

14.0.0 - 2024-02-21

Fixed

  • Fixed a bug that resulted in header/footer views not properly updating, by fixing the underlying tracking of collection view supplementary views.

Changed

  • Update the swipe action interactions to more closely match iOS behavior.
    • Maximum button size for .sizeThatFits style is now 120pts
    • Button text can span up to two lines now
    • Automatically adjust text size for text that is too long
    • Touching anywhere outside of the cell will close swipe actions
    • Tapping inside of a cell with open swipe actions will close them
    • Allow the panning gesture to remain interactive even when swipe actions are open
  • Updated deployment target from iOS 14.0 to iOS 15.0.

Internal

  • Bumped CI to use Xcode 15.1.
  • Updated Gems and set Ruby version to 3.2.2.

13.1.0 - 2023-11-30

Fixed

  • Fixed an issue where supplementary views (headers or footers) that contained a first responder would result in the view being duplicated when scrolled off-screen.
  • Fixed an issue where a crash would occur when applying an external update to list content while a live reorder event was occurring.

Internal

  • Remove override of performBatchUpdates from our internal UICollectionView subclass, it causes warnings for consumers.

13.0.0 - 2023-09-06

Fixed

  • KeyboardObserver has been updated to handle iOS 16.1+ changes that use the screen's coordinate space to report keyboard position. This can impact reported values when the app isn't full screen in Split View, Slide Over, and Stage Manager.
  • The verticalLayoutGravity behavior now takes into account frame changes so that the scroll position relative to the bottom remains unchanged when the frame changes.

Changed

  • KeyboardObserverDelegate now provides UIView.AnimationCurve instead of UIView.AnimationOptions.

12.0.0 - 2023-08-08

Added

  • ApplyItemContentInfo and ApplyHeaderFooterContentInfo are now available in the Blueprint Environment for each BlueprintItemContent.
  • A new isContentScrollable property is added to ListView to determine if the content size is large enough that the list can be scrolled to a new position without springing back to it's original position.
  • A new custom case is added to KeyboardAdjustmentMode which allows the consumer to fully customize the inset behavior. onKeyboardFrameWillChange and customScrollViewInsets have been added to ListView and updateScrollViewInsets is now public. All of these can be utilized in conjunction to respond to the keyboard and fully control the insets. For now, these are available through ListView only.
  • A new verticalLayoutGravity behavior to accomodate vertical-layout lists where the normal scroll position of the list is at the bottom of the list. Setting verticalLayoutGravity to .bottom enables the new behavior. It's designed to accomodate a messaging client. Adds a new demo called Chat App.

Changed

  • SwipeAction property names have been updated to better reflect what they're for. Completion also now takes in a more descriptive enum, instead of a boolean, to make reading callsites clearer. Eg, completion(.expandActions) instead of completion(true).

Internal

  • Update CI script to reference the xcodesorg/made/xcodes package for installing simulator runtimes.
  • Update CI script to install aria2 to improve simulator runtime download speeds.

11.0.0 - 2023-06-15

Removed

  • .paged layout's itemInsets has been removed; use bounds.padding instead.

Changed

  • .paged layouts now respect bounds for each page.

10.3.1 - 2023-06-06

Fixed

  • Enabled collection view first responder workaround for iOS 17.0; it is broken in the first beta.

10.3.0 - 2023-05-17

Added

  • You may now programatically reveal leading and trailing swipe actions, by calling the showLeadingSwipeActions or showTrailingSwipeActions closures on ApplyItemContentInfo.

10.2.0 - 2023-05-15

Fixed

  • Fixed a confusing compilation error when omitting the .content property on read-only KeyPath lookups on ListProperties.

Added

  • Added optional underlay view for item cells that can be styled

10.1.0 - 2023-05-08

Changed

  • BlueprintUILists now depends on Blueprint 2.0.

10.0.1 - 2023-04-26

Fixed

  • Fix an issue when a header or footer has an onTap handler, and no pressed background, the first tap would be ignored.

10.0.0 - 2023-04-25

Fixed

  • Swipe actions will now use the accessibilityLabel (if non-nil) when the user is using assistive technologies such as VoiceOver.

Added

  • Added containerCornerRadius, equalButtonWidths, and minWidth to DefaultSwipeActionsView.Style for additional swipe action style customization.
  • Added swipeActionsViewStyle to ListEnvironment. This allows a SwipeActionsView.Style to be set on the list environment when customizing the appearance of the swipe action view.
  • Added the ability to configure leading swipe actions on Items via the leadingSwipeActions property.
  • Added containerCornerRadius, buttonSizing, minWidth, and maxWidthRatio to DefaultSwipeActionsView.Style for additional swipe action style customization.
  • Added SwipeActionsView.Style.leadingContainerInsets to specify container insets for the leading swipe action container.

Removed

  • Removed the SwipeActionsView associated type on ItemContent.
  • Removed the ItemContentSwipeActionsView protocol.

Changed

  • Renamed DefaultSwipeActionsView to SwipeActionsView.
  • The type of the ItemContent.swipeActionsStyle protocol requirement is now SwipeActionsView.Style? (previously SwipeActionsView.Style). When an item returns nil for this property the style set on the list environment will be used instead.
  • Renamed Item.swipeActions to Item.trailingSwipeActions.
  • Renamed DefaultItemProperties.swipeActions to trailingSwipeActions.
  • Renamed SwipeActionsView.Style.containerInsets to SwipeActionsView.Style.trailingContainerInsets and changed the type to NSDirectionalEdgeInsets.
  • Renamed SwipeActionsView.Style to SwipeActionsViewStyle.
  • SwipeActionsView and SwipeActionState are no longer public types.

Misc

  • Improvement: Background and Selected Background views for rows and section headers will not be created unless requested. This reduces the overall number of views being allocated.

9.0.0 - 2023-04-19

Added

  • List adheres to Blueprint's new sizing contract when running in Caffeinated Layout mode.

Changed

  • BlueprintUILists now depends on Blueprint 1.0.

8.2.0 - 2023-04-18

Added

  • Introduce ListStateObserver.onDidEndDeceleration(_:) callback, which allows an observer to become notified when the scrollview finishes deceleration.
  • Introduce ListStateObserver.OnDidBeginDrag(_:) callback, which allows an observer to become notified when the scrollview will begin dragging.

8.1.2 - 2023-04-12

Fixed

  • A small defensive update to the iOS 16.4 Collection View workaround.

8.1.1 - 2023-04-11

Fixed

  • Fixed an issue that could cause the wrong swipe action view style being applied when multiple styles were used in a single list.

  • Fixed a regression in iOS 16.4, where on every collection view refresh, the collection view would force resign a first responder if it was within a header or footer (cells are not affected). See ListView+iOS16.4Workaround.swift for more.

8.1.0 - 2023-03-16

Added

  • Introduce an OverlayDecoration, which allows you to place a border, etc, around an item which is not affected by swipe action position.

8.0.5 - 2023-03-07

Misc

  • Updated BlueprintUI and BlueprintUICommonControls to version 0.50.0.

8.0.4 - 2023-02-24

Fixed

  • Do not call auto scroll action didPeform blocks if the scroll action did not succeed.

8.0.3 - 2023-02-17

Fixed

  • Speculative, low effort fix for a scrolling crash that occurred when the list view was under high update load, with many changes enqueued.

8.0.2 - 2023-02-09

Misc

  • Updated BlueprintUI and BlueprintUICommonControls to version 0.49.0.

8.0.1 - 2023-01-10

Fixed

  • Fix Catalyst version specifier in SPM package.

8.0.0 - 2022-12-19

Changed

  • iOS 12 and 13 have been deprecated.

  • Marks pod as APPLICATION_EXTENSION_API_ONLY

  • KeyboardObserver is now a SPI accessible API

    • When using SPM, you are responsible for initializing this singleton in non-extension contexts
    • ListView.configure(with: application) should be called when your app has finished launching
    • Failure to do so will continue to print() the existing LISTABLE WARNING

7.2.0 - 2022-10-24

Fixed

  • Fixed an issue where submitting many frequent updates in a large list would cause crashes due to state getting out of sync, hopefully.

Added

  • You may now control the stickiness of headers within individual sections, eg by setting section.layouts.table.isHeaderSticky = true/false/nil, or by implementing isStickySectionHeader on your HeaderFooterContent. Providing nil for either value falls back to the list-level stickiness setting.

Changed

  • ListHeaderPosition.fixed will now only apply if the list's top padding is zero, to avoid the header shifting around during layout if the position is changed.

7.1.2 - 2022-09-12

Removed

  • Revert from 7.0.0: "When a section is inserted or removed, and that section has only one item, and no header or footer, the insertion or removal animation for the section's singular item will be used instead." This was causing crashes in initialLayoutAttributesForAppearingItem and finalLayoutAttributesForDisappearingItem due to index path mismatches.

7.1.1 - 2022-09-06

Fixed

  • Fixed an issue where rowSpacing was used instead of itemSpacing in FlowListLayout.
  • Fixed SPM-based builds.

7.1.0 - 2022-09-06

Fixed

  • Fixed an issue where rowSpacing was used instead of itemSpacing in FlowListLayout.

Added

  • Behavior.decelerationRate - Controls the rate at which scrolling decelerates. The default value, normal, maintains the status quo.

  • ListPagingBehavior.firstVisibleItemCentered - When the user stops scrolling, the final offset of the scroll event will be adjusted so that the first visible item is centered within the visible bounds.

7.0.0 - 2022-08-16

Added

  • Introduces a .toggles selection type, to allow a second tap to deselect an item.

  • Swipe actions will now dismiss when touching outside of the actively swiped cell to match iOS behavior.

Removed

  • Removed RetailGridListLayout.

Changed

  • When a section is inserted or removed, and that section has only one item, and no header or footer, the insertion or removal animation for the section's singular item will be used instead.

6.0.0 - 2022-07-29

Fixed

  • Fixed an issue where ListHeaderPosition.fixed would cause the list header to overlap with the refresh control by falling back to sticky behavior if there's a refresh control.

Added

  • SwipeAction now allows you to provide an accessibility{Label,Value,Hint}, and requires either a title or accessibilityLabel.

Changed

  • The refresh control color has moved to Appearance from RefreshControl.

5.2.1 - 2022-07-21

Fixed

  • Fix a crash when initializing Item.

5.2.0 - 2022-07-20

Changed

  • DefaultItemProperties and DefaultHeaderFooterProperties now have all properties for each of Item and HeaderFooter.

5.1.0 - 2022-07-20

Fixed

  • Fixed an issue where ListHeaderPosition.fixed would cause the list header to overlap with the container header by falling back to sticky behavior if there's a container header.
  • Supplementary items will now animate when their position in the layout changes.
  • Fix an issue where horizontal list views would erroneously inset for the keyboard. Horizontal lists should not adjust for the keyboard, since it ends up causing vertical scrolling.

Added

  • Added a tint color to SwipeAction to configure DefaultSwipeActionsView. This allows customization of the text and image color (assuming a template image is used), where previously they were always white.

5.0.1 - 2022-07-19

Fixed

  • Ensure Optional values from DefaultItemProperties and DefaultHeaderFooterProperties are respected.

5.0.0 - 2022-07-18

Added

  • List measurement now has options to include the safeAreaInsets from the Environment if the contentInsetAdjustmentBehavior will affect the layout.

Changed

  • stickyListHeader has been replaced with listHeaderPosition, which has three possible values: inline, sticky, and fixed.

4.4.0 - 2022-07-18

Fixed

  • Fixed a bug where child accessibility views could be exposed when they should be hidden.

Added

  • Added stickyListHeader to layout / appearance, allowing you to pin list headers to the top of the content.

4.3.1 - 2022-07-11

Fixed

  • Ensure supplementary views are properly reused.

4.3.0 - 2022-07-02

Fixed

  • Supplementary views will now properly animate (fade) in and out when they are added or removed.

Added

  • Introduce ContentContext, an Equatable value which represents the overall context for all content presented in a list. Eg, you might pass a theme here, the traits for your screen (eg, dark mode, a11y settings, etc), or any other value which when changed, should cause the entire list to re-render. If the ContentContext changes across list renders, all list measurements will be thrown out and re-measured during the next render pass.

4.2.0 - 2022-06-01

Added

  • Added a pinning option pin(to:) which is very similar to scrollToItem(onInsertOf:) except that you don't specify an onInsertOf item.
  • Adds a bottomScrollOffset property to ListScrollPositionInfo. You can use this to fine-tune pinning by only pinning when within a certain distance of the bottom scroll position.

4.1.0 - 2022-05-23

Changed

  • Enabled accessibility ordering, but only propagating the accessibility label reordering is possible and VoiceOver is active to avoid conflicting matches in KIF tests.

  • containerHeaders in table and flow layouts now stretch to fill the available width of the view. Previously, they were inset with the content.

4.0.0 - 2022-04-07

Removed

  • When using BlueprintUILists, layout is no longer forced during element updates. This will cause animations to no longer be inherited. Please use .transition, etc. to control animations.

3.2.1 - 2022-03-25

Removed

  • Removed item reordering with VoiceOver as it caused issues with KIF tests.

3.2.0 - 2022-03-21

Fixed

  • Fixed list measurements with container headers.

Added

  • Item reordering is now possible when using VoiceOver.

3.1.0 - 2022-02-08

Added

  • ListReorderGesture.Begins added. This controls when the reorder gesture starts: onTap and onLongPress.

3.0.0 - 2022-01-15

Fixed

  • TableAppearance.ItemLayout now properly initializes the itemToSectionFooterSpacing value.
  • A swipe actions memory leak has been fixed for ItemCell.ContentContainerView.

Added

  • LayoutDescription now conforms to Equatable.
  • ListLayoutAppearance now has a func to modify the default layout.
  • You can now construct a layout description from a ListLayoutAppearance, allowing the underlying ListLayout to remain internal to a module.

2.0.0 - 2021-12-15

Changed

  • The signature of ListLayout.layout(delegate:in:) has been changed to return a ListLayoutResult value, to make it clearer which values must be provided as the output of a layout.

1.0.2 - 2021-12-14

Changed

  • When measuring a List in an unconstrained size constraint, and .fillParent is passed, a better assertion message is provided.

Fixed

  • Ensure that .fillParent List measurements returns the right height.

1.0.1 - 2021-12-06

Added

  • You may now set the contentInsetAdjustmentBehavior on .table layouts. This is useful when presenting in a sheet, to more directly control the safe area inset.

  • You can now control underflow bounce behavior on .table layouts, via bounceOnUnderflow.

1.0.0 - 2021-12-06

Fixed

  • Insert and removal animations for items now respect UIAccessibility.isReduceMotionEnabled, falling back to .fade if isReduceMotionEnabled is true.

Added

  • Added support for .horizontal .table layouts. To get a horizontal table; just set the layout.direction = .horizontal when configuring your list's layout. Additionally, some properties were renamed from left/right to leading/trailing to better reflect they can now be on the left/top and right/bottom of a list view, respectively.

  • Expose layoutAppearanceProperties on LayoutDescription, to access standard layout appearance properties without creating an instance of the backing layout.

  • The .flow layout type has been added, to support flow and grid style layouts.

  • ListView.contentSize will now also provide access to the natural width of a layout if the layout supports natural width calculation. This is useful, for example, to show a .table layout in a popover – you can now know how wide to render the popover.

  • Added .pagingBehaviour to .table and .flow style layouts, which allows implementing carousel-style layouts, by enabling scroll paging alongside item boundaries.

Removed

  • The .experimental_grid layout type has been removed; it is replaced by .flow.

  • Default sizes have been removed. Please ensure your elements correctly implement sizeThatFits, or use fixed sizes.

Changed

  • scrollViewProperties has moved from ListLayout to ListLayoutAppearance.

  • The various .table { ... }, .paged { ... }, etc, LayoutDescription functions no longer take an escaping closure.

  • precondition is now overridden within ListableUI and BlueprintUILists to point at an inlined function, which calls through to fatalError. This ensures that error messages are reported in crash reports.

0.30.1 - 2021-11-16

Fixed

  • Fix keyboard inset calculations by using adjustedContentInset.

0.30.0 - 2021-11-02

Added

  • Added support for result builders when creating lists, sections, and swipe actions:

    List {
        Section("id") {
            ExampleContent(text: "First Item")
            ExampleContent(text: "Second Item")
        } header: {
            ExampleHeader(title: "This Is My Section")
        } footer: {
            ExampleFooter(text: "Rules apply. Prohibited where void.")
        }
    }

Changed

  • ListLayout and 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

Fixed

  • Ensure we properly pass through the ListEnvironment when updating on-screen views.

0.29.2 - 2021-10-21

Fixed

  • Fixed an erroneous weak reference in SupplementaryContainerView which lead to contents being deallocated too early – this is not actually needed. HeaderFooterViewStatePair holds the reference to the contained AnyPresentationHeaderFooterState, there are not direct strong references from AnyPresentationHeaderFooterState to SupplementaryContainerView.

0.29.1 - 2021-10-18

Fixed

  • 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

Added

Changed

  • onTap on HeaderFooter now takes no parameters, to disambiguate it from configure.

0.28.0 - 2021-09-28

Changed

  • Introduced AnyHeaderFooterConvertible for HeaderFooters contained in lists and sections, so you no longer need to wrap your HeaderFooterContent in a HeaderFooter to 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

Changed

0.27.0 - 2021-09-15

Changed

0.26.1 - 2021-09-03

Fixed

  • Includes fix for header reuse from 0.25.1.

0.26.0 - 2021-08-14

Added

Removed

Changed

0.25.0 - 2021-08-12

Added

  • 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

Added

0.23.2 - 2021-08-05

Fixed

0.23.1 - 2021-07-26

Fixed

  • 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

Added

0.22.2 - 2021-06-23

Fixed

  • Fixed identifier(for:) on Section to match name of identifier(with:) on ItemContent.

0.22.1 - 2021-06-22

Fixed

  • Fixed Identifiable conformance for ItemContent.

0.22.0 - 2021-06-22

Misc

  • Listable now depends on Blueprint 0.27.0 which 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

Fixed

Added

Changed

Misc

0.20.2 - 2021-04-19

Fixed

0.20.1 - 2021-04-06

Fixed

0.20.0 - 2021-03-29

Changed

  • Changed how ListView.contentSize is 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.Measurement also moved to BlueprintUILists, as that is the only place it was used.

0.19.0 - 2021-03-22

Added

Example usage:

list.content.refreshControl = RefreshControl(
    isRefreshing: isRefreshing,
    offsetAdjustmentBehavior: .displayWhenRefreshing(animate: true, scrollToTop: true),
    onRefresh: onRefresh
)

0.18.0 - 2021-03-12

Fixed

Added

  • Adds scrollToSection to ListActions and ListView. To support this functionality, Section can now be queried with an Identifier. Also added SectionPosition to specify the top or bottom within a Section.

Example usage:

listActions.scrolling.scrollToSection(
  with: MyItem.identifier(with: id),
  sectionPosition: .top,
  scrollPosition: ScrollPosition(position: .centered)
)

0.17.0 - 2021-03-10

Fixed

  • 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.

Changed

  • Updates to ItemContentCoordinator to properly support animations in Blueprint-backed rows. This change also generalizes the contained animation type to ViewAnimation, for use in both scrolling and content updates.

0.16.0 - 2021-02-08

Fixed

Changed

0.15.1 - 2021-01-25

Fixed

0.15.0 - 2021-01-22

Added

Changed

  • Rename .list layout to .table, which is clearer, and also reduces confusion between ListLayout (the base protocol for layouts), and the specific table-type layout.

[0.14.2] - 2021-01-21

Fixed

  • SwipeActionsConfiguration.performsFirstActionWithFullSwipe is now respected when set to false.

0.14.1 - 2021-01-06

Fixed

Added

0.13.0 - 2020-12-14

Added

0.12.1 - 2020-12-01

Fixed

0.12.0 - 2020-12-01

Fixed

Added

0.11.0 - 2020-10-20

Added

  • Allow setting the sizing type on a List. 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

Fixed

Added

Removed

Changed

  • Change how keyboard are observed to avoid a pitfall where the keyboard would not be accounted for if a ListView is created while a keyboard is already on screen. To avoid this problem, we switch to a globally shared KeyboardObserver which is loaded at app startup time.

  • isEmpty on Content and Section have been replaced with contains(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.

0.9.0 - Internal Only

Added

Changed

0.8.0 - Internal Only

Added

  • Add support for ListStateObserver so that you can observe changes made to the list such as insertions, removals, scroll events, etc.

  • Add support for ListActions which 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 ListView itself.

  • Introduced callAsFunction support 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 a UIPageViewController, in either horizontal or vertical alignment.

Removed

Changed

0.7.0 - Internal Only

Fixed

  • 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

  • Added additional layout configuration options: headerToFirstSectionSpacing and lastSectionToFooterSpacing now 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 the ItemPreviewView class. This is a view type which takes in some configuration options, and an Item, which you can then use in snapshot tests to verify the appearance of your Item and ItemContent .

    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 ItemPreview type. This allows easy previewing your ItemContent during 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 withAllItemStates which allow seeing previews across the various possible selection and highlight states.

  • Add customInterSectionSpacing property to Section.Layout which allows the user to specify custom spacing after a section, overriding the calculated spacing.

  • Add insertAndRemoveAnimations to Item to allow customizing the animations used when an Item is inserted or removed from a list. Note that customizing this option when responding to SwipeActions will come at a later date.

  • Add ListViewController make it easy to create view controllers backed by a Listable ListView.

Changed

  • Update Item callbacks to allow for providing more info to the callback parameters.

  • ListAppearance.Layout.padding is now applied around all content in the list, not only around sections. To regain the previous behavior, use headerToFirstSectionSpacing and lastSectionToFooterSpacing.

  • 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
    }
    

0.6.1 - Internal Only

Changed

  • Change Item's onSelect and onDeselect to be performed asynchronously after a single runloop spin, to give UICollectionView time to schedule animations if these callbacks are slow.
  • Add improved signpost logging for selection and deselection, to more easily identify slow callbacks.

0.6.0 - Internal Only

Fixed

  • Fixed multiple selection and highlight issues: Highlighting cells now only occurs if the selectionStyle is tappable or selectable. Ensure that when tappable is provided, the content of a cell is updated when the cell is deselected.

Added

  • Added type aliases for HeaderFooter and HeaderFooterContent to reduce verbosity of use. Now instead of typing HeaderFooter(MyHeader()), you can use Header(MyHeader()).
  • Replace unused / experimental Binding type with Coordinator, which allows you to independently manage item state in a similar manner to SwiftUI's UIViewRepresentable's Coordinator.

Changed

  • Major Change: ItemElement and HeaderFooterElement were renamed to ItemContent and HeaderFooterContent, 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 of Element when using Blueprint integration via BlueprintUILists.
  • Changed BlueprintHeaderFooter{Content/Element}'s main method to be elementRepresentation instead of element. This allows easier conformance of BlueprintUI.ProxyElement types to BlueprintHeaderFooter{Content/Element}.
  • SelectionMode was moved from Content to Behavior, which is in line with other collection view behaviours like scrolling and underflow.
  • Rename ItemSelectionStyle.none to ItemSelectionStyle.notSelectable. This is to avoid conflicts with Optional.none when working with ItemSelectionStyle as an Optional.

0.5.0 - Internal Only

Added

Earlier - Internal Only

Earlier releases were ad-hoc and not tracked. To see all changes, please reference closed PRs on Github.