Releases: nalu-development/nalu
10.7.1
🧰 Maintenance
- Adding workarounds trying to prevent a non-reproducible random crash on iPads
NSInternalInconsistencyException Reason: Preferred size is ZERO for auxiliary item <NSCollectionLayoutBoundarySupplementaryItem 0x145c75740; name=(null); size={.containerWidthFactor(1), .estimated(64)}; edgeSpacing=<leading=<NSCollectionLayoutSpacing - 0x130114040: fixed:0>; top=<NSCollectionLayoutSpacing - 0x130114040: fixed:0>; trailing=<NSCollectionLayoutSpacing - 0x130114040: fixed:0>; bottom=<NSCollectionLayoutSpacing - 0x130114040: fixed:0>; outsets=@{0,0,0,0}>; identfier=4DD3F5DD-45FA-42C4-A9AC-F1518C63778C; contentInsets={0,0,0,0}> in container <_UICollectionLayoutContainer: 0x145c38880 contentSize={0, 915}; contentInsets={0, 0, 0, 0}}> - Prevent potential mid-animation crash from happening:
System.ArgumentOutOfRangeException in object VirtualScrollNotifyCollectionChangedAdapter<ReadOnlyObservableCollection<IBundleItemBaseViewModel>>.GetItem(int, int)
👨🏼💻 Contributors
@albyrock87, @dependabot[bot] and dependabot[bot]
10.7.0
🧰 Bug fixes
- Prevent a potential crash on iOS VirtualScroll when the user tries to drag a non-draggable
VirtualScroll - Fixes
VirtualScrollScrolledEventArgsnever reaching1.0scroll percentage (#126)
✨ Improvements
- VirtualScroll: Enhanced
VirtualScrollScrolledEventArgswith new properties for better scroll handling:- Added
ViewportWidthandViewportHeightto get the viewport dimensions - Added
RemainingScrollXandRemainingScrollYto easily detect proximity to scroll boundaries - useful for infinite scroll scenarios (#126) - [BREAKING CHANGE]
ScrollPercentageXandScrollPercentageYnow return1.0(instead of0.0) when content is not scrollable, which better represents "fully scrolled" state (#126)
- Added
👨🏼💻 Contributors
10.6.2
🧰 Maintenance
- Fix
VirtualScrollon iOS causing crashes under some specific layout / data source changes conditions - Fix
NaluTabBar-enabled Shell pages not resizing correctly upon orientation change or iPad free-window resizing - Fix
VirtualScrollcarousel layout on iOS not snapping automatically during window resize
👨🏼💻 Contributors
10.6.1
🚀 New Features
- BETA Windows Platform support for
VirtualScrollby @albyrock87 (#122)
🧰 Maintenance
- Fix
NaluTabBardescendants window insets detection on Android by @albyrock87 (https://github.com/nalu-development/nalu/discussions/124#discussioncomment-15632865)
👨🏼💻 Contributors
10.6.0
Release Notes
🎠 Carousel Layout Support
VirtualScroll now supports carousel layout!
Use HorizontalCarouselVirtualScrollLayout or VerticalCarouselVirtualScrollLayout to create full-screen, page-snapping carousels.
Features:
- Items automatically fill the available viewport space
- Smooth page snapping behavior
- Two-way
CurrentRangebinding to track the current visible item CurrentRangecan be bound tointfor simple use cases
Example:
<vs:VirtualScroll ItemsLayout="{vs:HorizontalCarouselVirtualScrollLayout}"
vs:CarouselVirtualScrollLayout.CurrentRange="{Binding CurrentIndex}">
<!-- ItemTemplate -->
</vs:VirtualScroll>📜 Enhanced Scroll Events
New scroll lifecycle events for better control over scroll behavior:
OnScrollStarted/ScrollStartedCommand- Fired when user begins scrollingOnScrollEnded/ScrollEndedCommand- Fired when scrolling completes (after deceleration)
These events are particularly useful for carousel layouts to update the current page indicator.
🔧 Improvements
VirtualScrollRangenow supports implicit conversion to/fromintfor simpler carousel index binding- Improved layout update handling for better carousel synchronization
- Fixed an issue on Android where removing all the items from a flat list and adding a new one was causing an empty item to appear right after leading to further unwanted behaviors
📚 Documentation
Updated documentation with comprehensive carousel layout examples and scroll event usage. See the VirtualScroll documentation for details.
10.5.2
🧰 Bug fixes
- Fixes a regression caused by AOT compatibility where
IEnteringAware<TIntent>andIAppearingAware<TIntent>where not being invoked when passing aTwhich inherits fromTIntent34b03e3
👨🏼💻 Contributors
10.5.1
Bug fixes
- Fix
NaluTabBaron iOS not applying safe area insets when popping a page while having a different tab bar visibility, resulting in having content not reachable behind the tab bar
👨🏼💻 Contributors
10.5.0
AOT Compatibility is here!!
Overview
This release makes Nalu libraries fully AOT-compatible (Ahead-of-Time compilation).
To achieve AOT compatibility, we've removed reflection-based code paths and made APIs more explicit.
This ensures Nalu works correctly with .NET Native AOT compilation, which is required for certain deployment scenarios and provides better performance.
Breaking Changes
Navigation
NavigationConfigurator.AddPages()is now marked with[RequiresUnreferencedCode]and is not AOT/trim-compatible.- Migration: Use
AddPage<TPageModel, TPage>()for each page instead ofAddPages(). - Example: Replace
.AddPages()with.AddPage<MainPageModel, MainPage>().AddPage<SettingsPageModel, SettingsPage>()
- Migration: Use
This is the same concept used by dependency injection.
VirtualScroll
-
Automatic adapter creation for
INotifyCollectionChangedcollections is not supported in AOT mode.- When using AOT, binding
ObservableCollection<T>orReadOnlyObservableCollection<T>directly toItemsSourcewill throwNotSupportedException. - Migration: Use factory methods to create adapters explicitly:
// Instead of: ItemsSource="{Binding Items}" where Items is ObservableCollection<T> // Use: var adapter = VirtualScroll.CreateObservableCollectionAdapter(items); ItemsSource = adapter;
- When using AOT, binding
-
Factory method return types have changed for
ReadOnlyObservableCollection<T>-based adapters.- Factory methods that accept
ReadOnlyObservableCollection<T>now returnIVirtualScrollAdapterinstead ofIReorderableVirtualScrollAdapter. - This is correct since read-only collections cannot be reordered.
- Migration: If you were using the return value as
IReorderableVirtualScrollAdapter, change the target variable toIVirtualScrollAdapteror use a different collection type.
- Factory methods that accept
-
Preset Adapter classes have changed:
VirtualScrollObservableCollectionAdapter<TItemCollection>→VirtualScrollObservableCollectionAdapter<TItem>- The generic type parameter now represents the item type, not the collection type.
- Migration: Change
VirtualScrollObservableCollectionAdapter<ObservableCollection<MyItem>>toVirtualScrollObservableCollectionAdapter<MyItem>.
VirtualScrollGroupedObservableCollectionAdapter<TSectionCollection, TItemCollection>→VirtualScrollGroupedObservableCollectionAdapter<TSectionCollection, TItem>- The second generic type parameter now represents the item type (
TItem), not the items collection type. - The items collection type is now fixed to
ObservableCollection<TItem>. - Migration: Change
VirtualScrollGroupedObservableCollectionAdapter<ObservableCollection<Section>, ObservableCollection<Item>>toVirtualScrollGroupedObservableCollectionAdapter<ObservableCollection<Section>, Item>.
- The second generic type parameter now represents the item type (
- If you were extending these classes to provide custom behavior (e.g., overriding
CanDragItem,MoveItem, etc.), you need to update your class declarations to use the new generic parameter types.
Navigation Extensions
NavigationExtensions.Matches()no longer uses reflection-based intent comparer lookup.- The default
Matches()method now usesEqualityComparer<object>.Defaultfor intent comparison. - Custom intent comparers can still be provided via the overloaded
Matches()methods.
- The default
Recommendations
For AOT Compatibility
- Navigation: Use
AddPage<TPageModel, TPage>()for each page instead ofAddPages(). - VirtualScroll: Always provide an
IVirtualScrollAdapterexplicitly using factory methods (CreateObservableCollectionAdapter,CreateStaticCollectionAdapter, etc.) instead of binding collections directly.
Migration Strategy
- For new projects: Use
IVirtualScrollAdapterand explicitAddPage()calls from the start for AOT compatibility. - For existing projects: Migrate gradually, starting with VirtualScroll adapters, then navigation registration.
👨🏼💻 Contributors
10.4.0
🚀 New Features
- Add Drag&Drop support to VirtualScroll by @albyrock87 (#118)
Simulator_Screen_Recording_-_iPhone_16e_-_2026-01-08_at_20.19.45.mov
👨🏼💻 Contributors
10.3.4
🧰 Bug fixes
- [BREAKING CHANGE] The XAML namespace of
VirtualScrollis now correctly set tohttps://nalu-development.github.com/nalu/virtualscroll(previously it was clashing with thelayoutsnamespace - Fix iOS SoftKeyboardManager crashing when a field is inside a popup not driven by a view controller