From 5b0d6ab9ff4db2bdd97879228bc7e4e347288c6e Mon Sep 17 00:00:00 2001 From: neon443 <69979447+neon443@users.noreply.github.com> Date: Thu, 20 Nov 2025 21:23:32 +0000 Subject: [PATCH] real gifs!! --- StickerSlack/Emoji/GifManager.swift | 30 ++++++++++ StickerSlack/Emoji/GifView.swift | 56 +++++++++++++------ StickerSlack/SwiftUI/Emoji/EmojiPreview.swift | 21 ------- 3 files changed, 68 insertions(+), 39 deletions(-) diff --git a/StickerSlack/Emoji/GifManager.swift b/StickerSlack/Emoji/GifManager.swift index 1dc8cd8..63694c5 100644 --- a/StickerSlack/Emoji/GifManager.swift +++ b/StickerSlack/Emoji/GifManager.swift @@ -6,7 +6,37 @@ // import Foundation +import UIKit class GifManager { + static let defaultDuration: Double = 0.083333333333333329 + static func gifFrom(url: URL) -> [(frame: CGImage, showFor: Double)] { +// let url = URL(string: "https://emoji.slack-edge.com/T0266FRGM/yay-bounce/046cfcc7ed81030f.gif")! +// guard let source = CGImageSourceCreateWithURL(url as CFURL, nil) else { fatalError("couldnt create source") } + + guard let data = try? Data(contentsOf: url) else { return [] } + + return gifFrom(data: data) + } + static func gifFrom(data: Data) -> [(frame: CGImage, showFor: Double)] { + guard let source = CGImageSourceCreateWithData(data as NSData, nil) else { fatalError("couldnt create source") } + let frameCount = CGImageSourceGetCount(source) + var result: [(frame: CGImage, showFor: Double)] = [] + + for i in 0.. WKWebView { - let webview = WKWebView() - - webview.allowsLinkPreview = false - webview.allowsBackForwardNavigationGestures = false - - webview.load(URLRequest(url: url)) - return webview - } - - func updateUIView(_ uiView: WKWebView, context: Context) { - uiView.reload() + var body: some View { +// /*@START_MENU_TOKEN@*//*@PLACEHOLDER=Hello, world!@*/Text("Hello, world!")/*@END_MENU_TOKEN@*/ + TimelineView(.animation) { tl in + VStack { + if currentI < gif.count { + let image = Image(uiImage: .init(cgImage: gif[currentI].frame)) + image + .resizable().scaledToFit() + } + } + } + .onChange(of: go) { _ in + if currentI == (gif.count-1) { + currentI = 0 + } else { + currentI += 1 + } + DispatchQueue.main.asyncAfter(deadline: .now()+gif[currentI].showFor) { + go.toggle() + } + } + .onAppear { + self.gif = GifManager.gifFrom(url: url) + DispatchQueue.main.asyncAfter(deadline: .now()+gif[0].showFor) { + go.toggle() + } + } } } + +#Preview { + GifView( + url: URL(string: "https://files.catbox.moe/3x5sea.gif")! + ) +} diff --git a/StickerSlack/SwiftUI/Emoji/EmojiPreview.swift b/StickerSlack/SwiftUI/Emoji/EmojiPreview.swift index 20a08d4..805e5c4 100644 --- a/StickerSlack/SwiftUI/Emoji/EmojiPreview.swift +++ b/StickerSlack/SwiftUI/Emoji/EmojiPreview.swift @@ -23,14 +23,6 @@ struct EmojiPreview: View { if let image = emoji.image { if emoji.localImageURLString.contains(".gif") { GifView(url: emoji.localImageURL) -// if let gifImage { -// gifImage -// .resizable().scaledToFit() -// } else { -// Text("uhhhh") -// .foregroundStyle(.red) -// .font(.largeTitle) -// } } else { Image(uiImage: image) .resizable().scaledToFit() @@ -58,19 +50,6 @@ struct EmojiPreview: View { } } } -// .onAppear { -// guard emoji.localImageURLString.contains(".gif") else { return } -// gifImage = nil -// guard let gifData = try? Data(contentsOf: emoji.localImageURL) as CFData else { return } -// CGAnimateImageDataWithBlock(gifData, nil) { index, cgImage, stop in -// if stopPointer != stop { -// stopPointer?.pointee.toggle() -// stopPointer = stop -// } -// guard !stop.pointee else { return } -// gifImage = Image(uiImage: .init(cgImage: cgImage)) -// } -// } .id(id) } }