Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import SwiftUI
- struct Block: Identifiable {
- let id = UUID()
- var color: Color
- var opacity: Double
- init(color: Color, opacity: Double = 1.0) {
- self.color = color
- self.opacity = opacity
- }
- }
- extension Color {
- static let redShade = Color(red: 160/255, green: 0, blue: 0)
- }
- struct HeartView: View {
- @State private var colors: [[Block]]
- @State private var color: Color = .red
- @State private var visibleIndices: Set<String> = []
- @State private var rotate = 85.0
- @State private var offsetY = -200.0
- @State private var opacity = 0.0
- let spacing: CGFloat
- let radius: CGFloat
- init(
- colors: [[Block]],
- spacing: CGFloat = 0,
- radius: CGFloat = 0
- ) {
- self._colors = State(initialValue: colors)
- self.spacing = spacing
- self.radius = radius
- }
- var body: some View {
- VStack(spacing: spacing) {
- ForEach(0..<colors.count, id: \.self) { row in
- HStack(spacing: spacing) {
- ForEach(0..<colors[row].count, id: \.self) { col in
- let key = "\(row)-\(col)"
- Rectangle()
- .fill(colors[row][col].color)
- .opacity(visibleIndices.contains(key) ? 1 : 0)
- .scaleEffect(visibleIndices.contains(key) ? 1 : 0)
- .aspectRatio(1, contentMode: .fit)
- .clipShape(.rect(cornerRadius: radius))
- .onTapGesture {
- colors[row][col].color = color
- }
- }
- }
- }
- }
- .rotation3DEffect(
- .degrees(rotate),
- axis: (x: 1, y: 0, z: 0)
- )
- .offset(y: offsetY)
- .opacity(opacity)
- .padding()
- .onAppear {
- fadeInBlocks()
- withAnimation(.easeInOut(duration: 1)) {
- rotate = 0.0
- offsetY = 0.0
- opacity = 1.0
- }
- }
- }
- // MARK: - Gradual Fade-in Logic
- func fadeInBlocks() {
- // Collect only non-clear cells
- let allIndices = colors.enumerated().flatMap { row, cols in
- cols.indices.compactMap { col -> String? in
- let color = colors[row][col].color
- return color == .clear ? nil : "\(row)-\(col)"
- }
- }
- var remaining = allIndices.shuffled()
- var delay: Double = 0
- let delta: Double = 0.05
- while !remaining.isEmpty {
- let nextBatch = Array(remaining.prefix(4))
- remaining.removeFirst(min(4, remaining.count))
- DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
- withAnimation(.easeIn(duration: delta)) {
- visibleIndices.formUnion(nextBatch)
- }
- }
- delay += delta
- }
- }
- }
- #Preview {
- ZStack {
- Color.blue.opacity(0.3).ignoresSafeArea()
- HeartView(colors: heartImage)
- }
- }
- let heartImage: [[Block]] = {
- var colors = Array(
- repeating: Array(repeating: Block(color: .red), count: 16),
- count: 16
- )
- colors[0][0].color = .clear
- colors[0][1].color = .clear
- colors[0][2].color = .clear
- colors[0][3].color = .clear
- colors[0][4].color = .clear
- colors[0][5].color = .clear
- colors[0][6].color = .clear
- colors[0][7].color = .clear
- colors[0][8].color = .clear
- colors[0][9].color = .clear
- colors[0][10].color = .clear
- colors[0][11].color = .clear
- colors[0][12].color = .clear
- colors[0][13].color = .clear
- colors[0][14].color = .clear
- colors[0][15].color = .clear
- colors[1][0].color = .clear
- colors[1][1].color = .clear
- colors[1][2].color = .clear
- colors[1][3].color = .clear
- colors[1][4].color = .clear
- colors[1][5].color = .clear
- colors[1][6].color = .clear
- colors[1][7].color = .clear
- colors[1][8].color = .clear
- colors[1][9].color = .clear
- colors[1][10].color = .clear
- colors[1][11].color = .clear
- colors[1][12].color = .clear
- colors[1][13].color = .clear
- colors[1][14].color = .clear
- colors[1][15].color = .clear
- colors[2][0].color = .clear
- colors[2][1].color = .clear
- colors[2][2].color = .clear
- colors[2][3].color = .black
- colors[2][4].color = .black
- colors[2][5].color = .black
- colors[2][6].color = .clear
- colors[2][7].color = .clear
- colors[2][8].color = .clear
- colors[2][9].color = .clear
- colors[2][10].color = .black
- colors[2][11].color = .black
- colors[2][12].color = .black
- colors[2][13].color = .clear
- colors[2][14].color = .clear
- colors[2][15].color = .clear
- colors[3][0].color = .clear
- colors[3][1].color = .clear
- colors[3][2].color = .black
- colors[3][3].color = .redShade
- colors[3][6].color = .black
- colors[3][7].color = .clear
- colors[3][8].color = .clear
- colors[3][9].color = .black
- colors[3][13].color = .black
- colors[3][14].color = .clear
- colors[3][15].color = .clear
- colors[4][0].color = .clear
- colors[4][1].color = .black
- colors[4][2].color = .redShade
- colors[4][7].color = .black
- colors[4][8].color = .black
- colors[4][11].color = .white
- colors[4][14].color = .black
- colors[4][15].color = .clear
- colors[5][0].color = .clear
- colors[5][1].color = .black
- colors[5][2].color = .redShade
- colors[5][12].color = .white
- colors[5][14].color = .black
- colors[5][15].color = .clear
- colors[6][0].color = .clear
- colors[6][1].color = .black
- colors[6][2].color = .redShade
- colors[6][14].color = .black
- colors[6][15].color = .clear
- colors[7][0].color = .clear
- colors[7][1].color = .black
- colors[7][2].color = .redShade
- colors[7][14].color = .black
- colors[7][15].color = .clear
- colors[8][0].color = .clear
- colors[8][1].color = .clear
- colors[8][2].color = .black
- colors[8][3].color = .redShade
- colors[8][4].color = .redShade
- colors[8][13].color = .black
- colors[8][14].color = .clear
- colors[8][15].color = .clear
- colors[9][0].color = .clear
- colors[9][1].color = .clear
- colors[9][2].color = .clear
- colors[9][3].color = .black
- colors[9][4].color = .redShade
- colors[9][5].color = .redShade
- colors[9][12].color = .black
- colors[9][13].color = .clear
- colors[9][14].color = .clear
- colors[9][15].color = .clear
- colors[10][0].color = .clear
- colors[10][1].color = .clear
- colors[10][2].color = .clear
- colors[10][3].color = .clear
- colors[10][4].color = .black
- colors[10][5].color = .redShade
- colors[10][6].color = .redShade
- colors[10][11].color = .black
- colors[10][12].color = .clear
- colors[10][13].color = .clear
- colors[10][14].color = .clear
- colors[10][15].color = .clear
- colors[11][0].color = .clear
- colors[11][1].color = .clear
- colors[11][2].color = .clear
- colors[11][3].color = .clear
- colors[11][4].color = .clear
- colors[11][5].color = .black
- colors[11][6].color = .redShade
- colors[11][7].color = .redShade
- colors[11][10].color = .black
- colors[11][11].color = .clear
- colors[11][12].color = .clear
- colors[11][13].color = .clear
- colors[11][14].color = .clear
- colors[11][15].color = .clear
- colors[12][0].color = .clear
- colors[12][1].color = .clear
- colors[12][2].color = .clear
- colors[12][3].color = .clear
- colors[12][4].color = .clear
- colors[12][5].color = .clear
- colors[12][6].color = .black
- colors[12][7].color = .redShade
- colors[12][8].color = .redShade
- colors[12][9].color = .black
- colors[12][10].color = .clear
- colors[12][11].color = .clear
- colors[12][12].color = .clear
- colors[12][13].color = .clear
- colors[12][14].color = .clear
- colors[12][15].color = .clear
- colors[13][0].color = .clear
- colors[13][1].color = .clear
- colors[13][2].color = .clear
- colors[13][3].color = .clear
- colors[13][4].color = .clear
- colors[13][5].color = .clear
- colors[13][6].color = .clear
- colors[13][7].color = .black
- colors[13][8].color = .black
- colors[13][9].color = .clear
- colors[13][10].color = .clear
- colors[13][11].color = .clear
- colors[13][12].color = .clear
- colors[13][13].color = .clear
- colors[13][14].color = .clear
- colors[13][15].color = .clear
- colors[14][0].color = .clear
- colors[14][1].color = .clear
- colors[14][2].color = .clear
- colors[14][3].color = .clear
- colors[14][4].color = .clear
- colors[14][5].color = .clear
- colors[14][6].color = .clear
- colors[14][7].color = .clear
- colors[14][8].color = .clear
- colors[14][9].color = .clear
- colors[14][10].color = .clear
- colors[14][11].color = .clear
- colors[14][12].color = .clear
- colors[14][13].color = .clear
- colors[14][14].color = .clear
- colors[14][15].color = .clear
- colors[15][0].color = .clear
- colors[15][1].color = .clear
- colors[15][2].color = .clear
- colors[15][3].color = .clear
- colors[15][4].color = .clear
- colors[15][5].color = .clear
- colors[15][6].color = .clear
- colors[15][7].color = .clear
- colors[15][8].color = .clear
- colors[15][9].color = .clear
- colors[15][10].color = .clear
- colors[15][11].color = .clear
- colors[15][12].color = .clear
- colors[15][13].color = .clear
- colors[15][14].color = .clear
- colors[15][15].color = .clear
- return colors
- }()
Advertisement
Add Comment
Please, Sign In to add comment