mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 16:10:20 +00:00
Force the timeline to stay at the bottom when first loading
This commit is contained in:
committed by
Stefan Ceriu
parent
3e1fde6442
commit
ef8d230328
@@ -82,20 +82,12 @@ struct TimelineItemList: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.onChange(of: pinnedItem) { item in
|
.onChange(of: timelineItems) { _ in
|
||||||
guard let item else {
|
// Run this multiple times on first appearance to fix offset issues
|
||||||
return
|
updatePinnedOffset(scrollViewProxy: proxy)
|
||||||
}
|
}
|
||||||
|
.onChange(of: pinnedItem) { _ in
|
||||||
if item.animated {
|
updatePinnedOffset(scrollViewProxy: proxy)
|
||||||
withAnimation(Animation.elementDefault) {
|
|
||||||
proxy.scrollTo(item.id, anchor: item.anchor)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
proxy.scrollTo(item.id, anchor: item.anchor)
|
|
||||||
}
|
|
||||||
|
|
||||||
pinnedItem = nil
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.scrollDismissesKeyboard(.immediately)
|
.scrollDismissesKeyboard(.immediately)
|
||||||
@@ -148,8 +140,6 @@ struct TimelineItemList: View {
|
|||||||
let pinnedItem = PinnedItem(id: currentFirstItem.id, anchor: .top, animated: false)
|
let pinnedItem = PinnedItem(id: currentFirstItem.id, anchor: .top, animated: false)
|
||||||
timelineItems = context.viewState.items
|
timelineItems = context.viewState.items
|
||||||
self.pinnedItem = pinnedItem
|
self.pinnedItem = pinnedItem
|
||||||
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Otherwise just update the items
|
// Otherwise just update the items
|
||||||
@@ -198,6 +188,25 @@ struct TimelineItemList: View {
|
|||||||
return selectedItemId == item.id ? 1.0 : 0.5
|
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 {
|
private var isRunningPreviews: Bool {
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
return ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1"
|
return ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1"
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Fixed timelines not sticking to the bottom on first appearance and when message heights change
|
||||||
Reference in New Issue
Block a user