Skip to content

Latest commit

 

History

History
697 lines (411 loc) · 33.1 KB

CHANGELOG.md

File metadata and controls

697 lines (411 loc) · 33.1 KB

Fixed

Added

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

Removed

Changed

Misc

Past Releases

[4.1.0] - 2022-05-23

Changed

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

Removed

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
    }
    

Misc

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.

Removed

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.