Skip to content

Commit 6b01154

Browse files
authored
Merge pull request #124 from onevcat/renderer
Decoupling renderer from decoder
2 parents c64347a + f132c7a commit 6b01154

24 files changed

+1404
-843
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
44

55
## [Unreleased]
66

7+
### Add
8+
9+
- Support for setting a single `APNGImage` to multiple `APNGImageView`s. It lifts off the limitation in previous versions that an `APNGImage` can only be set to one `APNGImageView`. Now, it is free to be used in different image views and the image view controls the animation playing. [#124](https://github.com/onevcat/APNGKit/pull/124) @onevcat
10+
711
## [2.1.2] - 2022-03-05
812

913
### Fix

Demo/Demo-macOS/Main.storyboard

Lines changed: 87 additions & 21 deletions
Large diffs are not rendered by default.
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
//
2+
// MultipleImagesViewController.swift
3+
// Demo-macOS
4+
//
5+
// Created by Wang Wei on 2022/03/11.
6+
//
7+
8+
import Cocoa
9+
import APNGKit
10+
11+
class MultipleImagesViewController: NSViewController, NSCollectionViewDataSource, NSCollectionViewDelegate {
12+
13+
@IBOutlet weak var collectionView: NSCollectionView!
14+
15+
static let availableImages: [APNGImage] = sampleImages.compactMap {
16+
try? APNGImage(named: $0)
17+
}
18+
19+
var images: [APNGImage] = MultipleImagesViewController.availableImages
20+
21+
override func viewDidLoad() {
22+
super.viewDidLoad()
23+
collectionView.register(MultipleImageCollectionViewItem.self, forItemWithIdentifier: .init(rawValue: "MultipleImageCollectionViewItem"))
24+
}
25+
26+
func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int {
27+
return images.count
28+
}
29+
30+
func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
31+
let item = collectionView.makeItem(withIdentifier: .init(rawValue: "MultipleImageCollectionViewItem"), for: indexPath) as! MultipleImageCollectionViewItem
32+
item.setImage(images[indexPath.item])
33+
return item
34+
}
35+
36+
func collectionView(_ collectionView: NSCollectionView, didSelectItemsAt indexPaths: Set<IndexPath>) {
37+
collectionView.deselectItems(at: indexPaths)
38+
39+
let item = collectionView.item(at: indexPaths.first!) as! MultipleImageCollectionViewItem
40+
try? item.animatedImageView.reset()
41+
}
42+
43+
@IBAction func addImage(_ sender: Any) {
44+
let random = Int.random(in: 0 ..< MultipleImagesViewController.availableImages.count)
45+
images.append(MultipleImagesViewController.availableImages[random])
46+
47+
let targets: Set<IndexPath> = [.init(item: images.count - 1, section: 0)]
48+
collectionView.insertItems(at: targets)
49+
collectionView.scrollToItems(at: targets, scrollPosition: .bottom)
50+
}
51+
}
52+
53+
54+
class MultipleImageCollectionViewItem: NSCollectionViewItem {
55+
var animatedImageView: APNGImageView!
56+
57+
override func loadView() {
58+
view = NSView()
59+
let imageView = APNGImageView()
60+
imageView.translatesAutoresizingMaskIntoConstraints = false
61+
view.addSubview(imageView)
62+
63+
NSLayoutConstraint.activate([
64+
imageView.topAnchor.constraint(equalTo: view.topAnchor),
65+
imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
66+
imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
67+
imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor)
68+
])
69+
70+
animatedImageView = imageView
71+
animatedImageView.layerContentsPlacement = .scaleProportionallyToFit
72+
}
73+
74+
func setImage(_ image: APNGImage) {
75+
animatedImageView.image = image
76+
}
77+
}

Demo/Demo-macOS/SidebarViewController.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,21 @@ import Delegate
1212
enum Page: CaseIterable {
1313
case samples
1414
case specTests
15+
case multipleImages
1516

1617
var title: String {
1718
switch self {
1819
case .samples: return "Samples"
1920
case .specTests: return "Spec Tests"
21+
case .multipleImages: return "Multiple Images"
2022
}
2123
}
2224

2325
var imageName: String {
2426
switch self {
2527
case .samples: return "scribble.variable"
2628
case .specTests: return "checkmark.circle"
29+
case .multipleImages: return "mail.stack"
2730
}
2831
}
2932
}

Demo/Demo-macOS/SplitViewController.swift

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ class SplitViewController: NSSplitViewController {
1313
weak var detailViewController: NSViewController!
1414

1515
var sampleViewController: SamplesViewController?
16-
var specTestViewController: NSViewController?
16+
var specTestViewController: SpecTestViewController?
17+
var multipleImagesViewController: MultipleImagesViewController?
1718

1819
override func viewDidLoad() {
1920
super.viewDidLoad()
@@ -30,6 +31,7 @@ class SplitViewController: NSSplitViewController {
3031

3132
sampleViewController?.view.isHidden = true
3233
specTestViewController?.view.isHidden = true
34+
multipleImagesViewController?.view.isHidden = true
3335

3436
switch page {
3537
case .samples:
@@ -48,6 +50,14 @@ class SplitViewController: NSSplitViewController {
4850
}
4951
print("Show spec")
5052
specTestViewController?.view.isHidden = false
53+
case .multipleImages:
54+
if multipleImagesViewController == nil {
55+
let vc = NSStoryboard(name: "Main", bundle: .main).instantiateController(withIdentifier: .init("MultipleImagesViewController")) as! MultipleImagesViewController
56+
detailViewController.add(vc)
57+
multipleImagesViewController = vc
58+
}
59+
print("Show multi")
60+
multipleImagesViewController?.view.isHidden = false
5161
}
5262
}
5363
}

Demo/Demo.xcodeproj/project.pbxproj

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
/* Begin PBXBuildFile section */
1010
4B158A1E275E37AE0085A53D /* SampleImageFrameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B158A1D275E37AE0085A53D /* SampleImageFrameViewController.swift */; };
11+
4B3115CC27DB378800610B2B /* MultipleImageCollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B3115CB27DB378800610B2B /* MultipleImageCollectionViewController.swift */; };
12+
4B3115CE27DB387B00610B2B /* MultipleImageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B3115CD27DB387B00610B2B /* MultipleImageCollectionViewCell.swift */; };
1113
4B5B97392744831600431356 /* maneki-neko.apng in Resources */ = {isa = PBXBuildFile; fileRef = 4B5B97382744831600431356 /* maneki-neko.apng */; };
1214
4B5B973B2744834700431356 /* elephant_apng.apng in Resources */ = {isa = PBXBuildFile; fileRef = 4BC3D8D1271C095D004DF785 /* elephant_apng.apng */; };
1315
4B5B973C2744834700431356 /* over_background.apng in Resources */ = {isa = PBXBuildFile; fileRef = 4BC3D8D5271C095D004DF785 /* over_background.apng */; };
@@ -173,6 +175,7 @@
173175
4BC6DC98271D4EC800634A99 /* SpecTestingTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BC6DC97271D4EC800634A99 /* SpecTestingTableViewCell.swift */; };
174176
4BC6DC9A271D566100634A99 /* spec-cases.json in Resources */ = {isa = PBXBuildFile; fileRef = 4BC6DC99271D566000634A99 /* spec-cases.json */; };
175177
4BC6DC9E271DB6A700634A99 /* SpecTestingExplanationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BC6DC9D271DB6A700634A99 /* SpecTestingExplanationViewController.swift */; };
178+
4BF05FE027DB483800A03720 /* MultipleImagesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BF05FDF27DB483800A03720 /* MultipleImagesViewController.swift */; };
176179
4BFC488A272E457600033A77 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4BFC4889272E457600033A77 /* Main.storyboard */; };
177180
4BFC488C272E636600033A77 /* SidebarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BFC488B272E636600033A77 /* SidebarViewController.swift */; };
178181
4BFC488E272E63C100033A77 /* SplitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BFC488D272E63C100033A77 /* SplitViewController.swift */; };
@@ -189,6 +192,8 @@
189192

190193
/* Begin PBXFileReference section */
191194
4B158A1D275E37AE0085A53D /* SampleImageFrameViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SampleImageFrameViewController.swift; sourceTree = "<group>"; };
195+
4B3115CB27DB378800610B2B /* MultipleImageCollectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultipleImageCollectionViewController.swift; sourceTree = "<group>"; };
196+
4B3115CD27DB387B00610B2B /* MultipleImageCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultipleImageCollectionViewCell.swift; sourceTree = "<group>"; };
192197
4B5B97382744831600431356 /* maneki-neko.apng */ = {isa = PBXFileReference; lastKnownFileType = file; path = "maneki-neko.apng"; sourceTree = "<group>"; };
193198
4B5B9786274483F200431356 /* SampleImages.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SampleImages.swift; sourceTree = "<group>"; };
194199
4B5ECBC9272E29B9003930D4 /* Demo-macOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Demo-macOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -279,6 +284,7 @@
279284
4BC6DC97271D4EC800634A99 /* SpecTestingTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpecTestingTableViewCell.swift; sourceTree = "<group>"; };
280285
4BC6DC99271D566000634A99 /* spec-cases.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "spec-cases.json"; path = "Demo/spec-cases.json"; sourceTree = SOURCE_ROOT; };
281286
4BC6DC9D271DB6A700634A99 /* SpecTestingExplanationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpecTestingExplanationViewController.swift; sourceTree = "<group>"; };
287+
4BF05FDF27DB483800A03720 /* MultipleImagesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultipleImagesViewController.swift; sourceTree = "<group>"; };
282288
4BFC4889272E457600033A77 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = "<group>"; };
283289
4BFC488B272E636600033A77 /* SidebarViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarViewController.swift; sourceTree = "<group>"; };
284290
4BFC488D272E63C100033A77 /* SplitViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitViewController.swift; sourceTree = "<group>"; };
@@ -314,12 +320,22 @@
314320
/* End PBXFrameworksBuildPhase section */
315321

316322
/* Begin PBXGroup section */
323+
4B3115CA27DB375D00610B2B /* MultipleImageScene */ = {
324+
isa = PBXGroup;
325+
children = (
326+
4B3115CB27DB378800610B2B /* MultipleImageCollectionViewController.swift */,
327+
4B3115CD27DB387B00610B2B /* MultipleImageCollectionViewCell.swift */,
328+
);
329+
path = MultipleImageScene;
330+
sourceTree = "<group>";
331+
};
317332
4B5ECBCA272E29B9003930D4 /* Demo-macOS */ = {
318333
isa = PBXGroup;
319334
children = (
320335
4B5ECBCB272E29B9003930D4 /* AppDelegate.swift */,
321336
4B5ECBCD272E29B9003930D4 /* SamplesViewController.swift */,
322337
4BFC4893272E88C900033A77 /* SpecTestViewController.swift */,
338+
4BF05FDF27DB483800A03720 /* MultipleImagesViewController.swift */,
323339
4BFC488B272E636600033A77 /* SidebarViewController.swift */,
324340
4BFC488D272E63C100033A77 /* SplitViewController.swift */,
325341
4B5ECBCF272E29BA003930D4 /* Assets.xcassets */,
@@ -484,6 +500,7 @@
484500
4BBB827A272065CB0035A3CA /* Demo.entitlements */,
485501
4BC6DC9C271DB68200634A99 /* SampleImageScene */,
486502
4BC6DC9B271DB66E00634A99 /* SpecTestingScene */,
503+
4B3115CA27DB375D00610B2B /* MultipleImageScene */,
487504
4BC3D8CC271C095D004DF785 /* Resources */,
488505
4BFF950A271C077D001645A7 /* AppDelegate.swift */,
489506
4BFF950E271C077D001645A7 /* TopViewController.swift */,
@@ -773,6 +790,7 @@
773790
4BFC488C272E636600033A77 /* SidebarViewController.swift in Sources */,
774791
4B5ECBCC272E29B9003930D4 /* AppDelegate.swift in Sources */,
775792
4BFC488E272E63C100033A77 /* SplitViewController.swift in Sources */,
793+
4BF05FE027DB483800A03720 /* MultipleImagesViewController.swift in Sources */,
776794
4B5B9788274483F200431356 /* SampleImages.swift in Sources */,
777795
);
778796
runOnlyForDeploymentPostprocessing = 0;
@@ -781,11 +799,13 @@
781799
isa = PBXSourcesBuildPhase;
782800
buildActionMask = 2147483647;
783801
files = (
802+
4B3115CC27DB378800610B2B /* MultipleImageCollectionViewController.swift in Sources */,
784803
4BC3D968271C759F004DF785 /* SampleImageTableViewController.swift in Sources */,
785804
4BC6DC9E271DB6A700634A99 /* SpecTestingExplanationViewController.swift in Sources */,
786805
4BFC4896272E890600033A77 /* SpecStore.swift in Sources */,
787806
4BFF950F271C077D001645A7 /* TopViewController.swift in Sources */,
788807
4BFF950B271C077D001645A7 /* AppDelegate.swift in Sources */,
808+
4B3115CE27DB387B00610B2B /* MultipleImageCollectionViewCell.swift in Sources */,
789809
4BC6DC98271D4EC800634A99 /* SpecTestingTableViewCell.swift in Sources */,
790810
4B5B9787274483F200431356 /* SampleImages.swift in Sources */,
791811
4BC6DC96271D4EB600634A99 /* SpecTestingTableViewController.swift in Sources */,

0 commit comments

Comments
 (0)