iOS15+下反转ScrollView的ContextMenu异常问题求助
感谢您抽出时间帮助他人!我已查阅了Stack Overflow上相关帖子的所有解决方案,但均无效。我也在Apple开发者论坛发布了该问题,在此再次发布希望能得到解决,谢谢!
Bug描述
我们正在开发一款聊天应用,需要消息以与List/ScrollView默认顺序相反的方式显示,因此将整个UI进行反转。在iOS15和iOS16(iOS14无此问题)中,反转后的List/ScrollView在显示contextMenu时出现异常行为(疑似bug),根据使用的反转方法不同,甚至会出现contextMenu消失的情况。
相关考量
反转UI的目的是让聊天列表在底部显示最新消息,且向上滚动查看历史消息,与默认行为相反。
- 曾尝试反转数组并在视图出现时滚动到底部,但在iOS14中scrollTo存在诸多问题,性能表现不佳;
- 选择反转UI是因为这种方式效率更高,且除了本文提及的bug外无其他额外问题。
复现代码
import SwiftUI struct ContentView: View { var body: some View { ScrollView { // 使用List(替代ScrollView + LazyVStack)时也会出现该问题 LazyVStack { ForEach(1..<101, id: \.self) { msg in messageView(msg) .upsideDown() // 反转每个元素,可尝试.upsideDownBis() } } } .upsideDown() // 反转整个ScrollView,可尝试.upsideDownBis() } private func messageView(_ msg: Int) -> some View { Text("Msg no. \(msg)") .padding() .background(Color.red.cornerRadius(8)) .contextMenu { Button(action: { print("A") }) { Text("Button A") } Button(action: { print("B") }) { Text("Button B") } } } } // 用于反转列表/ScrollView的扩展 extension View { func upsideDown() -> some View { self .rotationEffect(Angle(radians: .pi)) .scaleEffect(x: -1, y: 1, anchor: .center) } // 仅旋转,不会导致消失 func upsideDownBis() -> some View { self .rotationEffect(Angle(radians: .pi)) } }
iOS15和16下的行为
- 使用
upsideDown()modifier时的bug:
- 使用
upsideDownBis()modifier时的异常动画:
已尝试的方案
已尝试相关帖子中的所有解决方案及其他方案:
- 由于scaleEffect是导致严重bug的原因,尝试在触发contextMenu手势时将x从-1改为1,但响应速度慢于长按手势识别器;
- 类似方案1,针对
upsideDownBis()尝试禁用动画或在触发时不应用该modifier,但无法在contextMenu出现前识别长按手势。
问题
- 是否有办法解决
upsideDownBis()的异常动画问题? - 是否有办法解决
upsideDown()的消失bug?
内容的提问来源于Stack Exchange,提问作者MglSaRu
相关产品推荐
相关产品推荐

