Fix compose reply avatar scroll effect not working on iOS 15
This commit is contained in:
parent
91f1a5195c
commit
8889261b6b
|
@ -23,21 +23,21 @@ struct ComposeReplyView: View {
|
||||||
HStack(alignment: .top, spacing: horizSpacing) {
|
HStack(alignment: .top, spacing: horizSpacing) {
|
||||||
GeometryReader(content: self.replyAvatarImage)
|
GeometryReader(content: self.replyAvatarImage)
|
||||||
.frame(width: 50)
|
.frame(width: 50)
|
||||||
|
|
||||||
VStack(alignment: .leading, spacing: 0) {
|
VStack(alignment: .leading, spacing: 0) {
|
||||||
HStack {
|
HStack {
|
||||||
AccountDisplayNameLabel(account: status.account, fontSize: 17)
|
AccountDisplayNameLabel(account: status.account, fontSize: 17)
|
||||||
.lineLimit(1)
|
.lineLimit(1)
|
||||||
.layoutPriority(1)
|
.layoutPriority(1)
|
||||||
|
|
||||||
Text(verbatim: "@\(status.account.acct)")
|
Text(verbatim: "@\(status.account.acct)")
|
||||||
.font(.system(size: 17, weight: .light))
|
.font(.system(size: 17, weight: .light))
|
||||||
.foregroundColor(.secondary)
|
.foregroundColor(.secondary)
|
||||||
.lineLimit(1)
|
.lineLimit(1)
|
||||||
|
|
||||||
Spacer()
|
Spacer()
|
||||||
}
|
}
|
||||||
|
|
||||||
ComposeReplyContentView(status: status) { (newHeight) in
|
ComposeReplyContentView(status: status) { (newHeight) in
|
||||||
self.contentHeight = newHeight
|
self.contentHeight = newHeight
|
||||||
}
|
}
|
||||||
|
@ -52,9 +52,20 @@ struct ComposeReplyView: View {
|
||||||
private func replyAvatarImage(geometry: GeometryProxy) -> some View {
|
private func replyAvatarImage(geometry: GeometryProxy) -> some View {
|
||||||
// using named coordinate spaces produces an incorrect scroll offset on iOS 13,
|
// using named coordinate spaces produces an incorrect scroll offset on iOS 13,
|
||||||
// so simply compare the geometry inside and outside the scroll view in the global coordinate space
|
// so simply compare the geometry inside and outside the scroll view in the global coordinate space
|
||||||
var scrollOffset = outerMinY - geometry.frame(in: .global).minY
|
let scrollOffset = outerMinY - geometry.frame(in: .global).minY
|
||||||
scrollOffset += stackPadding
|
|
||||||
let offset = min(max(scrollOffset, 0), geometry.size.height - 50 - stackPadding)
|
// add stackPadding so that the image is always at least stackPadding away from the top
|
||||||
|
var offset = scrollOffset + stackPadding
|
||||||
|
|
||||||
|
// offset can never be less than 0 (i.e., above the top of the in-reply-to content)
|
||||||
|
offset = max(offset, 0)
|
||||||
|
|
||||||
|
// subtract 50, because we care about where the bottom of the view is but the offset is relative to the top of the view
|
||||||
|
let maxOffset = (contentHeight ?? 0) - 50
|
||||||
|
|
||||||
|
// once you scroll past the in-reply-to-content, the bottom of the avatar should be pinned to the bottom of the content
|
||||||
|
offset = min(offset, maxOffset)
|
||||||
|
|
||||||
return ComposeAvatarImageView(url: status.account.avatar)
|
return ComposeAvatarImageView(url: status.account.avatar)
|
||||||
.frame(width: 50, height: 50)
|
.frame(width: 50, height: 50)
|
||||||
.cornerRadius(preferences.avatarStyle.cornerRadiusFraction * 50)
|
.cornerRadius(preferences.avatarStyle.cornerRadiusFraction * 50)
|
||||||
|
|
Loading…
Reference in New Issue