简体   繁体   English

如何在 SF 符号上应用内阴影,使其看起来如图所示?

[英]How to apply inner shadow on SF symbols to make them look like as shown in the picture?

I have been trying to get this debossed effect in SwiftUI but nothing is working out.我一直试图在 SwiftUI 中获得这种凹陷效果,但没有任何效果。 I tried shadow(color:radius:x:y:) modifier but it applies shadow on the outside of symbol.我尝试了 shadow(color:radius:x:y:) 修饰符,但它在符号外部应用了阴影。 Can you please tell me if there are any other APIs or tricks to achieve this ?您能否告诉我是否有任何其他 API 或技巧可以实现这一目标? Thank You !谢谢你 !

参考图像

Love the debossed effect, reminds me of iOS 6. The key was finding inverseMask and then I had a play around and came up with this:喜欢凹凸效果,让我想起了 iOS 6。关键是找到inverseMask ,然后我玩了一下,想出了这个:

在此处输入图像描述

import SwiftUI

extension View {
    // https://www.raywenderlich.com/7589178-how-to-create-a-neumorphic-design-with-swiftui
    func inverseMask<Mask>(_ mask: Mask) -> some View where Mask: View {
        self.mask(mask
            .foregroundColor(.black)
            .background(Color.white)
            .compositingGroup()
            .luminanceToAlpha()
        )
    }
}

struct DebossTest: View {
    static var lightPurple = UIColor(red: 212/255, green: 206/255, blue: 247/255, alpha: 1)
    
    var body: some View {
        ZStack {
            Color(uiColor: DebossTest.lightPurple)
            MyButton()
                .font(.system(size: 144))
        }
    }
}


struct MyButton: View {
    
    static var darkPurple = UIColor(red: 140/255, green: 134/255, blue: 211/255, alpha: 1)
    let trashName = "trash.fill"
    
    var body: some View {
        ZStack {
            
            // the darker inset image
            Image(systemName: trashName)
                .foregroundColor(Color(uiColor: MyButton.darkPurple))
            
            // black inner shadow
            Rectangle()
                .inverseMask(Image(systemName: trashName))
                .shadow(color: Color.black, radius: 1, x: 0, y: 1)
                .mask(Image(systemName: trashName))
                .clipped()
            
            // white bottom edges
            Image(systemName: trashName)
                .shadow(color: Color.white, radius: 1, x: 0, y: 1)
                .inverseMask(Image(systemName: trashName))
        }
        .frame(width: 185, height: 140)
    }
}

struct DebossTest_Previews: PreviewProvider {
    static var previews: some View {
        DebossTest()
    }
}

The answer of malhal is perfect, but my approach is deferent than his approach. malhal 的答案是完美的,但我的方法比他的方法要顺从。 My codes can get updated for clipping view via an Image which normally we can do with Shape, but that is for another day, here is my way:我的代码可以通过图像来更新剪辑视图,这通常我们可以使用 Shape 进行,但那是另一天,这是我的方式:

在此处输入图像描述

struct ContentView: View {
    var body: some View {
        
        Color.yellow
            .overlay(
                
                Circle()
                    .fill(Color.black)
                    .frame(width: 100, height: 100)
                    .opacity(0.1)
                    .overlay(
                        
                        ZStack {
                            
                            Circle()
                                .stroke(Color.black, lineWidth: 3)
                                .blur(radius: 5)
                            
                            ZStack {
                                
                                Image(systemName: "info")
                                    .resizable()
                                    .scaledToFit()
                                    .foregroundColor(Color.black)
                                    .blur(radius: 5)
                                    .opacity(0.5)
                                
                                Image(systemName: "info")
                                    .resizable()
                                    .scaledToFit()
                                    .foregroundColor(Color.yellow)
                                
                            }
                            .padding()
                            
                        }
                        
                    )
                    .clipShape(Circle())
                
            )
        
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM