diff --git a/client/ios/DivKit/Extensions/DivGallery/DivGalleryProtocol.swift b/client/ios/DivKit/Extensions/DivGallery/DivGalleryProtocol.swift index f2604ee9c..f393c0198 100644 --- a/client/ios/DivKit/Extensions/DivGallery/DivGalleryProtocol.swift +++ b/client/ios/DivKit/Extensions/DivGallery/DivGalleryProtocol.swift @@ -22,7 +22,7 @@ extension DivGalleryProtocol { scrollMode: GalleryViewModel.ScrollMode, columnCount: Int? = nil, infiniteScroll: Bool = false, - bufferSize: Int = 1, + layoutMode: PagerBlock.LayoutMode? = nil, scrollbar: GalleryViewModel.Scrollbar = .none, transformation: ElementsTransformation? = nil ) throws -> GalleryViewModel { @@ -41,10 +41,10 @@ extension DivGalleryProtocol { ) } - if let itemBuilder { - children = itemBuilder.makeBlocks(context: context, mappedBy: blockMapper) + children = if let itemBuilder { + itemBuilder.makeBlocks(context: context, mappedBy: blockMapper) } else { - children = nonNilItems.makeBlocks( + nonNilItems.makeBlocks( context: context, sizeModifier: DivGallerySizeModifier( context: context, @@ -54,7 +54,10 @@ extension DivGalleryProtocol { mappedBy: blockMapper ) } - + + let itemsCount = children.count + let bufferSize = layoutMode.map { min($0.bufferSize(itemsCount: itemsCount), itemsCount) } ?? 1 + if infiniteScroll { let leadingBuffer = children[.. Int { + switch self { + case let .pageSize(relativeValue): + Int(1 / relativeValue.rawValue) + 1 + case .neighbourPageSize: + 2 + case .pageContentSize: + itemsCount + } + } +} diff --git a/client/ios/DivKit/Extensions/DivPagerExtensions.swift b/client/ios/DivKit/Extensions/DivPagerExtensions.swift index 6cde912ab..7f837b3a8 100644 --- a/client/ios/DivKit/Extensions/DivPagerExtensions.swift +++ b/client/ios/DivKit/Extensions/DivPagerExtensions.swift @@ -37,7 +37,7 @@ extension DivPager: DivBlockModeling, DivGalleryProtocol { defaultCrossAlignment: crossAlignment, scrollMode: .autoPaging(inertionEnabled: false), infiniteScroll: resolveInfiniteScroll(expressionResolver), - bufferSize: min(layoutMode.bufferSize(itemsCount: items.count), items.count), + layoutMode: layoutMode, transformation: pageTransformation?.resolve( expressionResolver, scrollDirection: scrollDirection @@ -73,19 +73,6 @@ extension DivPager: DivBlockModeling, DivGalleryProtocol { } } -extension PagerBlock.LayoutMode { - fileprivate func bufferSize(itemsCount: Int) -> Int { - switch self { - case let .pageSize(relativeValue): - Int(1 / relativeValue.rawValue) + 1 - case .neighbourPageSize: - 2 - case .pageContentSize: - itemsCount - } - } -} - extension DivPager.Orientation { var direction: ScrollDirection { switch self { diff --git a/client/ios/LayoutKit/LayoutKit/ViewModels/InfiniteScroll.swift b/client/ios/LayoutKit/LayoutKit/ViewModels/InfiniteScroll.swift index 9e469c153..8a77a0411 100644 --- a/client/ios/LayoutKit/LayoutKit/ViewModels/InfiniteScroll.swift +++ b/client/ios/LayoutKit/LayoutKit/ViewModels/InfiniteScroll.swift @@ -15,6 +15,11 @@ enum InfiniteScroll { alignment: Alignment = .center, insetMode: InsetMode = .fixed(values: .zero) ) -> Position? { + guard bufferSize > 0 else { + assertionFailure("Buffer size couldn't be less than one element for infinite scroll") + return nil + } + let itemsCount = origins.count let cycleStartIndex = bufferSize let cycleEndIndex = itemsCount - bufferSize - 1