SwiftUI:上下文菜单后出现阴影故障

kir*_*oyx 6 swiftui

我有一个带有阴影和上下文菜单的矩形。当我关闭此上下文菜单时,矩形的阴影会出现延迟(约 0.5 秒)。完整矩形的阴影以及内部元素的阴影。我不确定我做错了什么。

在此输入图像描述

struct Playground: View {
    var body: some View {
        VStack(alignment: .leading, spacing: 4.0) {
            Spacer()
            HStack {
                Spacer()
                Image(systemName: "house")
                    .font(.system(size: 50))
                Spacer()
            }
            Text("SwiftUI for iOS 14").fontWeight(.bold).foregroundColor(Color.white)
            Text("20 Sections").font(.footnote).foregroundColor(Color.white)
        }
        .frame(width: 200, height: 300)
        .padding(.all)
        .background(Color.blue)
        .cornerRadius(20.0)
        .shadow(radius: 10)
        .contentShape(RoundedRectangle(cornerRadius: 20))
        .contextMenu(menuItems: {
            Text("Menu Item 1")
            Text("Menu Item 2")
            Text("Menu Item 3")
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*ang 2

我找到了一种巧妙的方法来缓解这个问题。这是使用纯 UIKit 和 Objective-C,但也可以通过某种方式在 SwiftUI 中完成。

这是对动画视图的临时直接通过子视图访问,我只是在其上附加了一个阴影。这样,动画视图将具有阴影,并且当真实阴影弹出时,它会在该阴影下方弹出。结果看起来不错。

-(void)contextMenuInteraction:(UIContextMenuInteraction *)interaction 
      willEndForConfiguration:(UIContextMenuConfiguration *)configuration 
                     animator:(id<UIContextMenuInteractionAnimating>)animator {
  // TODO: Find view dynamically /safer
  UIView *platter = (UIView*)self.view.window.subviews[1].subviews[1].subviews[0];
  platter.clipsToBounds = NO;
  platter.layer.shadowOffset = CGSizeMake(0, 0);
  platter.layer.shadowRadius = 5;
  platter.layer.shadowOpacity = 0.5;
  platter.layer.shadowColor = [UIColor blackColor].CGColor;
}
Run Code Online (Sandbox Code Playgroud)

这适用于 iOS 13。尚未在 iOS 14 上尝试过。