diff --git a/ElementX/Sources/Screens/RoomScreen/View/TimelineItemList.swift b/ElementX/Sources/Screens/RoomScreen/View/TimelineItemList.swift index df7ddaacd..8ce2d45c9 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/TimelineItemList.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/TimelineItemList.swift @@ -82,20 +82,12 @@ struct TimelineItemList: View { } } } - .onChange(of: pinnedItem) { item in - guard let item else { - return - } - - if item.animated { - withAnimation(Animation.elementDefault) { - proxy.scrollTo(item.id, anchor: item.anchor) - } - } else { - proxy.scrollTo(item.id, anchor: item.anchor) - } - - pinnedItem = nil + .onChange(of: timelineItems) { _ in + // Run this multiple times on first appearance to fix offset issues + updatePinnedOffset(scrollViewProxy: proxy) + } + .onChange(of: pinnedItem) { _ in + updatePinnedOffset(scrollViewProxy: proxy) } } .scrollDismissesKeyboard(.immediately) @@ -148,8 +140,6 @@ struct TimelineItemList: View { let pinnedItem = PinnedItem(id: currentFirstItem.id, anchor: .top, animated: false) timelineItems = context.viewState.items self.pinnedItem = pinnedItem - - return } // Otherwise just update the items @@ -198,6 +188,25 @@ struct TimelineItemList: View { return selectedItemId == item.id ? 1.0 : 0.5 } + private func updatePinnedOffset(scrollViewProxy proxy: ScrollViewProxy) { + guard let item = pinnedItem else { + return + } + + if item.animated { + withAnimation(.elementDefault) { + proxy.scrollTo(item.id, anchor: item.anchor) + } + } else { + proxy.scrollTo(item.id, anchor: item.anchor) + } + + // Need to delay this for a bit to fix offset problems when loading the initial page + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + pinnedItem = nil + } + } + private var isRunningPreviews: Bool { #if DEBUG return ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" diff --git a/changelog.d/pr-327.bugfix b/changelog.d/pr-327.bugfix new file mode 100644 index 000000000..cbcf2d97e --- /dev/null +++ b/changelog.d/pr-327.bugfix @@ -0,0 +1 @@ +Fixed timelines not sticking to the bottom on first appearance and when message heights change \ No newline at end of file