拖放在NSImageView Swift MacOS应用程序中渲染的动画GIF

问题描述

我正在尝试构建一个Mac OSX应用程序,该应用程序呈现多个gif,并允许用户拖放它们以将gif复制到其他应用程序中。我正在使用符合DragDropImageView的{​​{1}}(下面的代码)来呈现启用拖放功能的gif。

它工作正常,除了当我将gif拖放到另一个应用程序中时,它仅复制gif的单个图像帧。我的目的是复制整个gif文件,而不仅仅是复制一张图片

总体上来说,我对iOS / MacOS开发还很陌生,我不确定构建此可拖动gif组件的方法是否正确。

我正在使用swiftUI构建应用程序,并且使用了名为NSImageView自定义视图,该视图将GifImageView转换为swiftUI视图。

DragDropImageView

DragDropImageView.swift

import Cocoa class DragDropImageView: NSImageView,NSDraggingSource { /// Holds the last mouse down event,to track the drag distance. var mouseDownEvent: NSEvent? override init(frame frameRect: NSRect) { super.init(frame: frameRect) isEditable = false } required init?(coder: NSCoder) { super.init(coder: coder) // Assure editable is set to true,to enable drop capabilities. isEditable = true } override func draw(_ dirtyRect: NSRect) { super.draw(dirtyRect) } // MARK: - NSDraggingSource // Since we only want to copy the current image we register // for .copy operation. func draggingSession(_: NSDraggingSession,sourceOperationMaskFor _: NSDraggingContext) -> NSDragOperation { return NSDragOperation.copy } // // Clear the ImageView on delete operation; e.g. the image gets // // dropped on the trash can in the dock. // func draggingSession(_: NSDraggingSession,endedAt _: NSPoint,// operation: NSDragOperation) { // if operation == .delete { // image = nil // } // } // Track mouse down events and safe the to the poperty. override func mouseDown(with theEvent: NSEvent) { mouseDownEvent = theEvent } // Track mouse dragged events to handle dragging sessions. override func mouseDragged(with event: NSEvent) { // Calculate the dragging distance... let mouseDown = mouseDownEvent!.locationInWindow let dragPoint = event.locationInWindow let dragdistance = hypot(mouseDown.x - dragPoint.x,mouseDown.y - dragPoint.y) // Cancel the dragging session in case of an accidental drag. if dragdistance < 3 { return } guard let image = self.image else { return } let draggingImage = image // Create a new NSDraggingItem with the image as content. let draggingItem = NSDraggingItem(pasteboardWriter: image) // Calculate the mouseDown location from the window's coordinate system to the // ImageView's coordinate system,to use it as origin for the dragging frame. let draggingFrameOrigin = convert(mouseDown,from: nil) // Build the dragging frame and offset it by half the image size on each axis // to center the mouse cursor within the dragging frame. let draggingFrame = NSRect(origin: draggingFrameOrigin,size: draggingImage.size) .offsetBy(dx: -draggingImage.size.width / 2,dy: -draggingImage.size.height / 2) // Assign the dragging frame to the draggingFrame property of our dragging item. draggingItem.draggingFrame = draggingFrame // Provide the components of the dragging image. draggingItem.imageComponentsProvider = { let component = NSDraggingImageComponent(key: NSDraggingItem.ImageComponentKey.icon) component.contents = image component.frame = NSRect(origin: NSPoint(),size: draggingFrame.size) return [component] } // Begin actual dragging session. Woohow! beginDraggingSession(with: [draggingItem],event: mouseDownEvent!,source: self) } }

GifImageView.swift

在我的import AppKit; import SwiftUI; struct GifImageView: NSViewRepresentable { var image: NSImage func makeNSView(context: Context) -> DragDropImageView { let view = DragDropImageView() view.image = self.image // view.allowsCutcopyPaste = true return view } func updateNSView(_ view: DragDropImageView,context: Context) { } } struct GifImageView_Previews: PreviewProvider { static var previews: some View { GifImageView(image: NSImage(data: (NSDataAsset(name: "tenor")?.data)!)!) } } 中,我使用ContentView.swift这样的东西:

GifImageView

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)