diff --git a/TelegramUI/ItemListControllerNode.swift b/TelegramUI/ItemListControllerNode.swift index ac14e61282..35b749e45b 100644 --- a/TelegramUI/ItemListControllerNode.swift +++ b/TelegramUI/ItemListControllerNode.swift @@ -47,6 +47,7 @@ private struct ItemListNodeTransition { let searchItem: ItemListControllerSearch? let focusItemTag: ItemListItemTag? let ensureVisibleItemTag: ItemListItemTag? + let scrollToItem: ListViewScrollToItem? let firstTime: Bool let animated: Bool let animateAlpha: Bool @@ -63,8 +64,9 @@ struct ItemListNodeState { let crossfadeState: Bool let focusItemTag: ItemListItemTag? let ensureVisibleItemTag: ItemListItemTag? + let initialScrollToItem: ListViewScrollToItem? - init(entries: [Entry], style: ItemListStyle, focusItemTag: ItemListItemTag? = nil, ensureVisibleItemTag: ItemListItemTag? = nil, emptyStateItem: ItemListControllerEmptyStateItem? = nil, searchItem: ItemListControllerSearch? = nil, crossfadeState: Bool = false, animateChanges: Bool = true) { + init(entries: [Entry], style: ItemListStyle, focusItemTag: ItemListItemTag? = nil, ensureVisibleItemTag: ItemListItemTag? = nil, emptyStateItem: ItemListControllerEmptyStateItem? = nil, searchItem: ItemListControllerSearch? = nil, initialScrollToItem: ListViewScrollToItem? = nil, crossfadeState: Bool = false, animateChanges: Bool = true) { self.entries = entries self.style = style self.emptyStateItem = emptyStateItem @@ -73,6 +75,7 @@ struct ItemListNodeState { self.animateChanges = animateChanges self.focusItemTag = focusItemTag self.ensureVisibleItemTag = ensureVisibleItemTag + self.initialScrollToItem = initialScrollToItem } } @@ -259,7 +262,13 @@ class ItemListControllerNode: ASDisplayNode, UIScrollV if previous?.style != state.style { updatedStyle = state.style } - return ItemListNodeTransition(theme: theme, entries: transition, updateStyle: updatedStyle, emptyStateItem: state.emptyStateItem, searchItem: state.searchItem, focusItemTag: state.focusItemTag, ensureVisibleItemTag: state.ensureVisibleItemTag, firstTime: previous == nil, animated: previous != nil && state.animateChanges, animateAlpha: previous != nil && state.animateChanges, crossfade: state.crossfadeState, mergedEntries: state.entries) + + var scrollToItem: ListViewScrollToItem? + if previous == nil { + scrollToItem = state.initialScrollToItem + } + + return ItemListNodeTransition(theme: theme, entries: transition, updateStyle: updatedStyle, emptyStateItem: state.emptyStateItem, searchItem: state.searchItem, focusItemTag: state.focusItemTag, ensureVisibleItemTag: state.ensureVisibleItemTag, scrollToItem: scrollToItem, firstTime: previous == nil, animated: previous != nil && state.animateChanges, animateAlpha: previous != nil && state.animateChanges, crossfade: state.crossfadeState, mergedEntries: state.entries) }) |> deliverOnMainQueue).start(next: { [weak self] transition in if let strongSelf = self { strongSelf.enqueueTransition(transition) @@ -423,7 +432,9 @@ class ItemListControllerNode: ASDisplayNode, UIScrollV let focusItemTag = transition.focusItemTag let ensureVisibleItemTag = transition.ensureVisibleItemTag var scrollToItem: ListViewScrollToItem? - if self.listNode.experimentalSnapScrollToItem, let ensureVisibleItemTag = ensureVisibleItemTag { + if let item = transition.scrollToItem { + scrollToItem = item + } else if self.listNode.experimentalSnapScrollToItem, let ensureVisibleItemTag = ensureVisibleItemTag { for i in 0 ..< transition.mergedEntries.count { if let tag = transition.mergedEntries[i].tag, tag.isEqual(to: ensureVisibleItemTag) { scrollToItem = ListViewScrollToItem(index: i, position: ListViewScrollPosition.visible, animated: true, curve: .Default(duration: nil), directionHint: .Down) diff --git a/TelegramUI/SettingsController.swift b/TelegramUI/SettingsController.swift index 131eeca2f1..b2d8c770c2 100644 --- a/TelegramUI/SettingsController.swift +++ b/TelegramUI/SettingsController.swift @@ -1143,7 +1143,7 @@ public func settingsController(context: AccountContext, accountManager: AccountM }) let (hasPassport, hasWatchApp) = hasPassportAndWatch - let listState = ItemListNodeState(entries: settingsEntries(account: context.account, presentationData: presentationData, state: state, view: view, proxySettings: proxySettings, notifyExceptions: preferencesAndExceptions.1, notificationsAuthorizationStatus: preferencesAndExceptions.2, notificationsWarningSuppressed: preferencesAndExceptions.3, unreadTrendingStickerPacks: unreadTrendingStickerPacks, archivedPacks: featuredAndArchived.1, hasPassport: hasPassport, hasWatchApp: hasWatchApp, accountsAndPeers: accountsAndPeers.1, inAppNotificationSettings: inAppNotificationSettings), style: .blocks, searchItem: searchItem) + let listState = ItemListNodeState(entries: settingsEntries(account: context.account, presentationData: presentationData, state: state, view: view, proxySettings: proxySettings, notifyExceptions: preferencesAndExceptions.1, notificationsAuthorizationStatus: preferencesAndExceptions.2, notificationsWarningSuppressed: preferencesAndExceptions.3, unreadTrendingStickerPacks: unreadTrendingStickerPacks, archivedPacks: featuredAndArchived.1, hasPassport: hasPassport, hasWatchApp: hasWatchApp, accountsAndPeers: accountsAndPeers.1, inAppNotificationSettings: inAppNotificationSettings), style: .blocks, searchItem: searchItem, initialScrollToItem: ListViewScrollToItem(index: 0, position: .top(-navigationBarSearchContentHeight), animated: false, curve: .Default(duration: 0.0), directionHint: .Up)) return (controllerState, (listState, arguments)) }