forked from shadowfacts/Tusker
Live text in gallery view
This commit is contained in:
parent
d7f35cd1e4
commit
facf039f97
|
@ -9,6 +9,7 @@
|
||||||
import UIKit
|
import UIKit
|
||||||
import Pachyderm
|
import Pachyderm
|
||||||
import AVFoundation
|
import AVFoundation
|
||||||
|
import VisionKit
|
||||||
|
|
||||||
protocol LargeImageContentView: UIView {
|
protocol LargeImageContentView: UIView {
|
||||||
var animationImage: UIImage? { get }
|
var animationImage: UIImage? { get }
|
||||||
|
@ -16,7 +17,10 @@ protocol LargeImageContentView: UIView {
|
||||||
func grayscaleStateChanged()
|
func grayscaleStateChanged()
|
||||||
}
|
}
|
||||||
|
|
||||||
class LargeImageImageContentView: GIFImageView, LargeImageContentView {
|
class LargeImageImageContentView: UIImageView, LargeImageContentView, ImageAnalysisInteractionDelegate {
|
||||||
|
|
||||||
|
@available(iOS 16.0, *)
|
||||||
|
private static let analyzer = ImageAnalyzer()
|
||||||
|
|
||||||
var animationImage: UIImage? { image! }
|
var animationImage: UIImage? { image! }
|
||||||
|
|
||||||
|
@ -25,13 +29,31 @@ class LargeImageImageContentView: GIFImageView, LargeImageContentView {
|
||||||
}
|
}
|
||||||
|
|
||||||
private var sourceData: Data?
|
private var sourceData: Data?
|
||||||
|
private weak var owner: UIViewController?
|
||||||
|
|
||||||
|
init(image: UIImage, owner: UIViewController?) {
|
||||||
|
self.owner = owner
|
||||||
|
|
||||||
init(image: UIImage) {
|
|
||||||
super.init(image: image)
|
super.init(image: image)
|
||||||
|
|
||||||
contentMode = .scaleAspectFit
|
contentMode = .scaleAspectFit
|
||||||
|
isUserInteractionEnabled = true
|
||||||
|
|
||||||
|
if #available(iOS 16.0, *),
|
||||||
|
ImageAnalyzer.isSupported {
|
||||||
|
let interaction = ImageAnalysisInteraction()
|
||||||
|
interaction.delegate = self
|
||||||
|
interaction.preferredInteractionTypes = .automatic
|
||||||
|
addInteraction(interaction)
|
||||||
|
Task {
|
||||||
|
do {
|
||||||
|
let result = try await LargeImageImageContentView.analyzer.analyze(image, configuration: ImageAnalyzer.Configuration([.text, .machineReadableCode]))
|
||||||
|
interaction.analysis = result
|
||||||
|
} catch {
|
||||||
|
// if analysis fails, we just don't show anything
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
required init?(coder: NSCoder) {
|
required init?(coder: NSCoder) {
|
||||||
|
@ -54,6 +76,10 @@ class LargeImageImageContentView: GIFImageView, LargeImageContentView {
|
||||||
self.image = image
|
self.image = image
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func presentingViewController(for interaction: ImageAnalysisInteraction) -> UIViewController? {
|
||||||
|
return owner
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class LargeImageGifContentView: GIFImageView, LargeImageContentView {
|
class LargeImageGifContentView: GIFImageView, LargeImageContentView {
|
||||||
|
|
|
@ -138,9 +138,9 @@ class LoadingLargeImageViewController: UIViewController, LargeImageAnimatableVie
|
||||||
content = LargeImageGifContentView(gifController: gifController)
|
content = LargeImageGifContentView(gifController: gifController)
|
||||||
} else {
|
} else {
|
||||||
if let transformedImage = ImageGrayscalifier.convertIfNecessary(url: url, image: image) {
|
if let transformedImage = ImageGrayscalifier.convertIfNecessary(url: url, image: image) {
|
||||||
content = LargeImageImageContentView(image: transformedImage)
|
content = LargeImageImageContentView(image: transformedImage, owner: self)
|
||||||
} else {
|
} else {
|
||||||
content = LargeImageImageContentView(image: image)
|
content = LargeImageImageContentView(image: image, owner: self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,7 +167,7 @@ class LoadingLargeImageViewController: UIViewController, LargeImageAnimatableVie
|
||||||
let grayscale = ImageGrayscalifier.convert(url: nil, cgImage: source) {
|
let grayscale = ImageGrayscalifier.convert(url: nil, cgImage: source) {
|
||||||
image = grayscale
|
image = grayscale
|
||||||
}
|
}
|
||||||
setContent(LargeImageImageContentView(image: image))
|
setContent(LargeImageImageContentView(image: image, owner: self))
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue