|
27 | 27 | namespace winrt::Microsoft::ReactNative::Composition::implementation { |
28 | 28 |
|
29 | 29 | constexpr float c_scrollerLineDelta = 16.0f; |
30 | | -constexpr auto c_maxSnapPoints = 1000; |
31 | 30 |
|
32 | 31 | enum class ScrollbarHitRegion : int { |
33 | 32 | Unknown = -1, |
@@ -741,15 +740,6 @@ void ScrollViewComponentView::updateBackgroundColor(const facebook::react::Share |
741 | 740 | } |
742 | 741 | } |
743 | 742 |
|
744 | | -winrt::Windows::Foundation::Collections::IVector<float> ScrollViewComponentView::CreateSnapToOffsets( |
745 | | - const std::vector<float> &offsets) { |
746 | | - auto snapToOffsets = winrt::single_threaded_vector<float>(); |
747 | | - for (const auto &offset : offsets) { |
748 | | - snapToOffsets.Append(offset); |
749 | | - } |
750 | | - return snapToOffsets; |
751 | | -} |
752 | | - |
753 | 743 | void ScrollViewComponentView::updateProps( |
754 | 744 | facebook::react::Props::Shared const &props, |
755 | 745 | facebook::react::Props::Shared const &oldProps) noexcept { |
@@ -817,17 +807,12 @@ void ScrollViewComponentView::updateProps( |
817 | 807 | } |
818 | 808 |
|
819 | 809 | if (oldViewProps.snapToStart != newViewProps.snapToStart || oldViewProps.snapToEnd != newViewProps.snapToEnd || |
820 | | - oldViewProps.snapToOffsets != newViewProps.snapToOffsets || |
821 | | - oldViewProps.snapToInterval != newViewProps.snapToInterval) { |
822 | | - if ((newViewProps.snapToInterval > 0 || oldViewProps.snapToInterval != newViewProps.snapToInterval) && |
823 | | - (newViewProps.decelerationRate >= 0.99)) { |
824 | | - // Use the comprehensive updateSnapPoints method when snapToInterval is involved |
825 | | - // Typically used in combination with snapToAlignment and decelerationRate="fast". |
826 | | - updateSnapPoints(); |
827 | | - } else { |
828 | | - auto snapToOffsets = CreateSnapToOffsets(newViewProps.snapToOffsets); |
829 | | - m_scrollVisual.SetSnapPoints(newViewProps.snapToStart, newViewProps.snapToEnd, snapToOffsets.GetView()); |
| 810 | + oldViewProps.snapToOffsets != newViewProps.snapToOffsets) { |
| 811 | + const auto snapToOffsets = winrt::single_threaded_vector<float>(); |
| 812 | + for (const auto &offset : newViewProps.snapToOffsets) { |
| 813 | + snapToOffsets.Append(static_cast<float>(offset)); |
830 | 814 | } |
| 815 | + m_scrollVisual.SetSnapPoints(newViewProps.snapToStart, newViewProps.snapToEnd, snapToOffsets.GetView()); |
831 | 816 | } |
832 | 817 | } |
833 | 818 |
|
@@ -878,9 +863,6 @@ void ScrollViewComponentView::updateContentVisualSize() noexcept { |
878 | 863 | m_verticalScrollbarComponent->ContentSize(contentSize); |
879 | 864 | m_horizontalScrollbarComponent->ContentSize(contentSize); |
880 | 865 | m_scrollVisual.ContentSize(contentSize); |
881 | | - |
882 | | - // Update snap points if snapToInterval is being used, as content size affects the number of snap points |
883 | | - updateSnapPoints(); |
884 | 866 | } |
885 | 867 |
|
886 | 868 | void ScrollViewComponentView::prepareForRecycle() noexcept {} |
@@ -1453,33 +1435,4 @@ void ScrollViewComponentView::updateShowsVerticalScrollIndicator(bool value) noe |
1453 | 1435 | void ScrollViewComponentView::updateDecelerationRate(float value) noexcept { |
1454 | 1436 | m_scrollVisual.SetDecelerationRate({value, value, value}); |
1455 | 1437 | } |
1456 | | - |
1457 | | -void ScrollViewComponentView::updateSnapPoints() noexcept { |
1458 | | - const auto &viewProps = *std::static_pointer_cast<const facebook::react::ScrollViewProps>(this->viewProps()); |
1459 | | - const auto snapToOffsets = CreateSnapToOffsets(viewProps.snapToOffsets); |
1460 | | - |
1461 | | - // snapToOffsets has priority over snapToInterval (matches React Native behavior) |
1462 | | - if (viewProps.snapToInterval > 0) { |
1463 | | - // Generate snap points based on interval |
1464 | | - // Calculate the content size to determine how many intervals to create |
1465 | | - float contentLength = viewProps.horizontal |
1466 | | - ? std::max(m_contentSize.width, m_layoutMetrics.frame.size.width) * m_layoutMetrics.pointScaleFactor |
1467 | | - : std::max(m_contentSize.height, m_layoutMetrics.frame.size.height) * m_layoutMetrics.pointScaleFactor; |
1468 | | - |
1469 | | - float interval = static_cast<float>(viewProps.snapToInterval) * m_layoutMetrics.pointScaleFactor; |
1470 | | - |
1471 | | - // Ensure we have a reasonable minimum interval to avoid infinite loops or excessive memory usage |
1472 | | - if (interval >= 1.0f && contentLength > 0) { |
1473 | | - // Generate offsets at each interval, but limit the number of snap points to avoid excessive memory usage |
1474 | | - int snapPointCount = 0; |
1475 | | - |
1476 | | - for (float offset = 0; offset <= contentLength && snapPointCount < c_maxSnapPoints; offset += interval) { |
1477 | | - snapToOffsets.Append(offset); |
1478 | | - snapPointCount++; |
1479 | | - } |
1480 | | - } |
1481 | | - } |
1482 | | - |
1483 | | - m_scrollVisual.SetSnapPoints(viewProps.snapToStart, viewProps.snapToEnd, snapToOffsets.GetView()); |
1484 | | -} |
1485 | 1438 | } // namespace winrt::Microsoft::ReactNative::Composition::implementation |
0 commit comments