iosswiftuser-interfaceswiftuitoast

How to create a toast UI with SwiftUI


I'm learning SwiftUI and need to create a Toast notification for an iOS app with a user interface similar to the illustration UI image list toast . I tried following the instructions in this link: https://medium.com/better-programming/swiftui-create-a-fancy-toast-component-in-10-minutes-e6bae6021984 but the user interface didn't quite match the design; it only displayed as this image UI image of the code below.
I need to create a notification (toast item) with a left-hand sidebar and a user interface like this UI image on the left side of each item. Can you help me?

struct FancyToastView: View {
    var type: FancyToastStyle
    var title: String
    var message: String
    var onCancelTapped: (() -> Void)
    var body: some View {
        VStack(alignment: .leading) {
            HStack(alignment: .top) {
                Image(systemName: type.iconFileName)
                    .foregroundColor(type.themeColor)
                
                VStack(alignment: .leading) {
                    Text(title)
                        .font(.system(size: 14, weight: .semibold))
                    
                    Text(message)
                        .font(.system(size: 12))
                        .foregroundColor(Color.black.opacity(0.6))
                }
                
                Spacer(minLength: 10)
                
                Button {
                    onCancelTapped()
                } label: {
                    Image(systemName: "xmark")
                        .foregroundColor(Color.black)
                }
            }
            .padding()
        }
        .background(Color.white)
        .overlay(
            Rectangle()
                .fill(type.themeColor)
                .frame(width: 6)
                .clipped()
            , alignment: .leading
        )
        .frame(minWidth: 0, maxWidth: .infinity)
        .cornerRadius(8)
        .shadow(color: Color.black.opacity(0.25), radius: 4, x: 0, y: 1)
        .padding(.horizontal, 16)
    }
}

Solution

  • To make an overlap effect. I suggest using ZStack.

    enter image description here

    I didn't touch the other margins and elements, just tried to add a background effect behind the rounded corners.

    struct FancyToastView: View {
        var type: FancyToastStyle
        var title: String
        var message: String
        var onCancelTapped: (() -> Void)
        var body: some View {
            ZStack {
                HStack(alignment: .top) {
                    Image(systemName: type.iconFileName)
                        .foregroundColor(type.themeColor)
    
                    VStack(alignment: .leading) {
                        Text(title)
                            .font(.system(size: 14, weight: .semibold))
    
                        Text(message)
                            .font(.system(size: 12))
                            .foregroundColor(Color.black.opacity(0.6))
                    }
    
                    Spacer(minLength: 10)
    
                    Button {
                        onCancelTapped()
                    } label: {
                        Image(systemName: "xmark")
                            .foregroundColor(Color.black)
                    }
                }
                .padding()
                .frame(maxWidth: .infinity)
                .background(
                    RoundedRectangle(cornerRadius: 8, style: .continuous)
                        .fill(.white)
                )
                .padding(.leading, 6)
            }
            .frame(maxWidth: .infinity)
            .background(
                RoundedRectangle(cornerRadius: 8, style: .continuous)
                    .fill(.red)
            )
            .shadow(color: Color.black.opacity(0.25), radius: 4, x: 0, y: 1)
            .padding(.horizontal, 16)
        }
    }