You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:
    iOS15/16使用upsideDown() modifier出现Bug
  • 使用upsideDownBis() modifier时的异常动画:
    iOS15/16使用upsideDownBis() modifier出现异常动画
已尝试的方案

已尝试相关帖子中的所有解决方案及其他方案:

  1. 由于scaleEffect是导致严重bug的原因,尝试在触发contextMenu手势时将x从-1改为1,但响应速度慢于长按手势识别器;
  2. 类似方案1,针对upsideDownBis()尝试禁用动画或在触发时不应用该modifier,但无法在contextMenu出现前识别长按手势。
问题
  1. 是否有办法解决upsideDownBis()的异常动画问题?
  2. 是否有办法解决upsideDown()的消失bug?

内容的提问来源于Stack Exchange,提问作者MglSaRu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:25:39