IconCard ๐Ÿ“ฆ

ไปฅใ€ŒSF Symbol ็‚บๅ‰ๆ™ฏ๏ผŒ้€ๆ˜Žๆ–น็ด™็‚บ่ƒŒๆ™ฏใ€็š„ๅ…ƒไปถ๏ผŒ้ฉๅˆ็”จๆ–ผ็•ถ้ฎ็ฝฉๆˆ–ๅ้ข้ฎ็ฝฉใ€‚

ๅฆ‚ๆžœ้ฎ็ฝฉๅœ–่ˆ‡่ฆๅ‰ช็š„็ด™ไธ€ๆจฃๅคง๏ผŒ็”จ SystemImage ๐Ÿ“ฆ ๅฐฑๅฏไปฅใ€‚ ๅฆ‚ๆžœ้ฎ็ฝฉๅœ–่ผƒๅฐใ€่ฆๅ‰ช็š„็ด™่ผƒๅคง๏ผŒ็”จ IconCard ๐Ÿ“ฆ ใ€‚

ไธ‹ๅœ–้กฏ็คบ img (IconCard) ๅพžๅฅ—็”จ .foregroundColor(.black)ใ€.background(Color.white)ใ€.compositingGroup()ใ€.luminanceToAlpha()๏ผŒไธ€็›ดๅˆฐ paper (็ด…่‰ฒๆ˜Ÿ้ปž็ด™) ๅฅ—็”จ .mask() ็š„ๆ•ดๅ€‹้Ž็จ‹ใ€‚

้€™ๅ€‹้Ž็จ‹ๅพŒไพ†่ขซๆฟƒ็ธฎๆˆไธ€ๅ€‹ View extension๏ผš.inverseMask() ๐ŸŒ€

import SwiftUI
import Workaround   // for `SystemImage`

/// # ๐Ÿ“ฆ IconCard
/// - icon: SF Symbol ๅ็จฑใ€‚
/// - size: โš ๏ธ ๆณจๆ„๏ผš้€™ๆ˜ฏๅœ–็คบๅคงๅฐ๏ผŒไธๆ˜ฏๆ•ดๅผตๅก็š„ๅคงๅฐโ€ผ๏ธ
/// ## Example
/// ````
/// IconCard(icon: "heart.fill", size: 32)
/// ````
public struct IconCard: View {
    
    // properties
    let iconSize: CGFloat   // icon size
    let icon    : String    // icon name
    
    /// public init
    public init(_ icon: String, size: CGFloat = 32) {
        self.icon     = icon
        self.iconSize = size
    }
    
    // body
    public var body: some View {
        
        // 1. ้ธ็”จ ZStack๏ผŒ่ฎ“็‰ฉไปถๅฏไปฅๅœจไธŠไธ‹ๅฑค้–“่ผ•้ฌ†ๅ †็–Šใ€‚
        // โญ๏ธ ๅ…ˆไธ้™ๅˆถ ZStack ็š„ๅคงๅฐ๏ผŒๅฎƒ็š„ๅคงๅฐ็”ฑๅค–้ƒจ็’ฐๅขƒๆฑบๅฎšใ€‚
        ZStack {
            
            // 2. ๅ…ˆๆบ–ๅ‚™ไธ€ๅผตใ€Œ้€ๆ˜Ž็ด™ใ€๏ผš้€™่ฃกๆœ‰ๅ…ฉๅ€‹็”จๆ„ โญ๏ธ 
            //    1. ็”จ Rectangle ไพ†ๅฎš็พฉๆญคใ€Œๅ…ƒไปถ็š„ๅคงๅฐใ€(ๅฆๅ‰‡ๆœƒไปฅไธ‹้ข็š„ SystemImage ็‚บๆบ–)ใ€‚
            //    2. ๅ…ˆๆŒ‡ๅฎš fg = .clear๏ผŒๅฐ‡ไพ†ๅฆ‚ๆžœๆ•ดๅ€‹ๅ…ƒไปถๅ†่ขซ่จญๅฎš .foreground() ๆ™‚๏ผŒ
            //       - Rectangle ็š„ fg ้‚„ๆ˜ฏ .clear (ไธๆœƒ่ขซ overriddenโ€ผ๏ธ)
            //       - SystemImage ็š„ fg ๅ› ็‚บ้‚„ๆฒ’่ขซ่จญๅฎš้Ž๏ผŒๆ‰€ไปฅๅฐฑๅฏไปฅ่ขซๆ”นๅฏซใ€‚
            Rectangle()
                .foregroundColor(.clear)             // โญ๏ธ ๆŒ‡ๅฎšใ€Œ้€ๆ˜Ž่‰ฒใ€๏ผ
            
            // 3. ็„ถๅพŒๅœจไธŠ้ข็•ซๅœ–็คบ๏ผŒไธฆ่จญๅฎšๅœ–็คบๅคงๅฐใ€‚
            // โญ๏ธ ๆณจๆ„๏ผš้›–็„ถๆฒ’ๆœ‰ๆŒ‡ๅฎšๅ‰ๆ™ฏ่‰ฒ๏ผŒไฝ†ๅœจๆทฑ่‰ฒๆจกๅผไธ‹๏ผŒๆœƒ็”จใ€Œ็™ฝ่‰ฒใ€่กจ็คบใ€‚
            SystemImage(icon)
                .frame(width: iconSize, height: iconSize)
        } // container (ZStack)
        
    } // body
}

Last updated