iOS / Programming / Swift

SwiftUIでMaterialDesignライクなIconText作ってみた

そもそもMaterial Designを使えばいいじゃんって話は置いておいて。。。

import SwiftUI
import SwiftUICore

struct IconText<LeadingImageContent, Content, TrailingImageContent>: View where LeadingImageContent: View, Content: View, TrailingImageContent: View {
    let backgroundColor: Color
    @ViewBuilder let leadingImage: () -> LeadingImageContent
    @ViewBuilder let content: () -> Content
    @ViewBuilder let trailingImage: () -> TrailingImageContent
    
    init(
        backgroundColor: Color,
        @ViewBuilder leadingImage: @escaping () -> LeadingImageContent = { EmptyView() },
        @ViewBuilder content: @escaping () -> Content,
        @ViewBuilder trailingImage: @escaping () -> TrailingImageContent = { EmptyView() }
    ) {
        self.backgroundColor = backgroundColor
        self.leadingImage = leadingImage
        self.content = content
        self.trailingImage = trailingImage
    }
    
    var body: some View {
        HStack {
            leadingImage().padding(5)
            
            content()
            
            trailingImage().padding(5)
        }
        .padding(.horizontal, 10)
        .padding(.vertical, 5)
        .background(
            RoundedRectangle(cornerRadius: 10)
                .fill(backgroundColor)
        )
        .padding(2)
    }
}

使い方はこんな感じ

#Preview {
    VStack {
        IconText(
            backgroundColor: .blue,
            content: {
                Text("アイコンなし")
            }
        )
        
        IconText(
            backgroundColor: .blue,
            leadingImage: {
                Image(systemName: "paperplane")
            },
            content: {
                Text("前アイコンのみ")
            }
        )
        
        IconText(
            backgroundColor: .blue,
            content: {
                Text("後ろアイコンのみ")
            },
            trailingImage: {
                Image(systemName: "paperplane")
            }
        )
        
        IconText(
            backgroundColor: .blue,
            leadingImage: {
                Image(systemName: "paperplane")
            },
            content: {
                Text("両アイコンあり")
            },
            trailingImage: {
                Image(systemName: "paperplane")
            }
        )
    }
}

見た目はこんな感じ

今日の一言
iOS勉強してわかる、Androidがいかに親切か、わかりやすいか
Kotlin Love

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です