├── Screenshots
├── 1.png
└── 2.png
├── Podfile
├── CollectionUpdateExample.xcodeproj
├── project.xcworkspace
│ └── contents.xcworkspacedata
└── project.pbxproj
├── CollectionUpdateExample.xcworkspace
└── contents.xcworkspacedata
├── .gitignore
├── DragAndDrop
├── Cell.swift
├── Info.plist
├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
├── Assets.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── AppDelegate.swift
├── CollectionController.swift
└── ViewController.swift
├── Podfile.lock
├── LICENSE.md
├── README.md
└── CollectionUpdateExample
├── Info.plist
├── Base.lproj
├── LaunchScreen.storyboard
└── Main.storyboard
├── Assets.xcassets
└── AppIcon.appiconset
│ └── Contents.json
├── AppDelegate.swift
└── ViewController.swift
/Screenshots/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onmyway133/CollectionUpdateExample/HEAD/Screenshots/1.png
--------------------------------------------------------------------------------
/Screenshots/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/onmyway133/CollectionUpdateExample/HEAD/Screenshots/2.png
--------------------------------------------------------------------------------
/Podfile:
--------------------------------------------------------------------------------
1 | platform :ios, '11.0'
2 | use_frameworks!
3 |
4 | pod 'Anchors'
5 | pod 'Omnia', git: 'https://github.com/onmyway133/Omnia'
6 | pod 'Dropdowns', git: 'https://github.com/hyperoslo/Dropdowns'
7 |
8 | target 'CollectionUpdateExample'
9 | target 'DragAndDrop'
--------------------------------------------------------------------------------
/CollectionUpdateExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/CollectionUpdateExample.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # OS X
2 | .DS_Store
3 | .AppleDouble
4 | .LSOverride
5 | Icon
6 | ._*
7 | .Spotlight-V100
8 | .Trashes
9 |
10 | # Xcode
11 | #
12 | build/
13 | *.pbxuser
14 | !default.pbxuser
15 | *.mode1v3
16 | !default.mode1v3
17 | *.mode2v3
18 | !default.mode2v3
19 | *.perspectivev3
20 | !default.perspectivev3
21 | xcuserdata
22 | *.xccheckout
23 | *.moved-aside
24 | DerivedData
25 | *.hmap
26 | *.ipa
27 | *.xcuserstate
28 |
29 | # CocoaPods
30 | Pods
31 |
32 | # Carthage
33 | Carthage
34 |
35 | # SPM
36 | .build/
37 |
--------------------------------------------------------------------------------
/DragAndDrop/Cell.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Anchors
3 |
4 | class Cell: UICollectionViewCell {
5 | let label = UILabel()
6 |
7 | override init(frame: CGRect) {
8 | super.init(frame: frame)
9 |
10 | clipsToBounds = true
11 | layer.cornerRadius = 5
12 |
13 | label.font = UIFont.boldSystemFont(ofSize: 30)
14 | label.textColor = .black
15 | label.textAlignment = .center
16 | addSubview(label)
17 |
18 | activate(
19 | label.anchor.center
20 | )
21 | }
22 |
23 | required init?(coder aDecoder: NSCoder) {
24 | fatalError()
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - Anchors (2.2.1)
3 | - Dropdowns (2.0.0)
4 | - Omnia (1.0.0)
5 |
6 | DEPENDENCIES:
7 | - Anchors
8 | - Dropdowns (from `https://github.com/hyperoslo/Dropdowns`)
9 | - Omnia (from `https://github.com/onmyway133/Omnia`)
10 |
11 | EXTERNAL SOURCES:
12 | Dropdowns:
13 | :git: https://github.com/hyperoslo/Dropdowns
14 | Omnia:
15 | :git: https://github.com/onmyway133/Omnia
16 |
17 | CHECKOUT OPTIONS:
18 | Dropdowns:
19 | :commit: 60dc4d981a9ebbf8a49e680bf98216108813bd8a
20 | :git: https://github.com/hyperoslo/Dropdowns
21 | Omnia:
22 | :commit: 0dd31969b2a42a96894093d252ba4d560a69af51
23 | :git: https://github.com/onmyway133/Omnia
24 |
25 | SPEC CHECKSUMS:
26 | Anchors: c1dd44c918ec9fb331e1f786546950e36a50a337
27 | Dropdowns: 73a46fc0898a341551b91fca6ba4256fc4739bee
28 | Omnia: c682586a0146ce8909d9adfa8c6ebdc3c5a40d12
29 |
30 | PODFILE CHECKSUM: eb845b715cd4e86c2b40ae77b0bf69e6739526ea
31 |
32 | COCOAPODS: 1.3.1
33 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | Licensed under the **MIT** license
2 |
3 | > Copyright (c) 2017 Khoa Pham
4 | >
5 | > Permission is hereby granted, free of charge, to any person obtaining
6 | > a copy of this software and associated documentation files (the
7 | > "Software"), to deal in the Software without restriction, including
8 | > without limitation the rights to use, copy, modify, merge, publish,
9 | > distribute, sublicense, and/or sell copies of the Software, and to
10 | > permit persons to whom the Software is furnished to do so, subject to
11 | > the following conditions:
12 | >
13 | > The above copyright notice and this permission notice shall be
14 | > included in all copies or substantial portions of the Software.
15 | >
16 | > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 | > EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 | > MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19 | > IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20 | > CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21 | > TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22 | > SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # CollectionUpdateExample
2 |
3 | ❤️ Support my app ❤️
4 |
5 | - [Push Hero - pure Swift native macOS application to test push notifications](https://www.producthunt.com/posts/push-hero-2)
6 | - [PastePal - Pasteboard, note and shortcut manager](https://www.producthunt.com/posts/pastepal)
7 | - [Frame recorder - Recorder gif and video with frame](https://www.producthunt.com/posts/frame-recorder)
8 | - [Other apps](https://onmyway133.github.io/projects/)
9 |
10 | ❤️❤️😇😍🤘❤️❤️
11 |
12 | ## Description
13 |
14 |
15 |

16 |

17 |
18 |
19 | - Demo drag and drop in `UICollectionView`
20 | - Demo how batch insertions, deletions works in `UITableView` and `UICollectionView`
21 | - Demo [DeepDiff](https://github.com/onmyway133/DeepDiff)
22 | - Tutorial [A better way to update UICollectionView data in Swift with diff framework](https://medium.com/flawless-app-stories/a-better-way-to-update-uicollectionview-data-in-swift-with-diff-framework-924db158db86)
23 |
24 | ## Author
25 |
26 | Khoa Pham, onmyway133@gmail.com
27 |
28 | ## License
29 |
30 | **CollectionUpdateExample** is available under the MIT license. See the [LICENSE](https://github.com/onmyway133/CollectionUpdateExample/blob/master/LICENSE.md) file for more info.
31 |
--------------------------------------------------------------------------------
/DragAndDrop/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UILaunchStoryboardName
24 | LaunchScreen
25 | UIMainStoryboardFile
26 | Main
27 | UIRequiredDeviceCapabilities
28 |
29 | armv7
30 |
31 | UISupportedInterfaceOrientations
32 |
33 | UIInterfaceOrientationPortrait
34 | UIInterfaceOrientationLandscapeLeft
35 | UIInterfaceOrientationLandscapeRight
36 |
37 | UISupportedInterfaceOrientations~ipad
38 |
39 | UIInterfaceOrientationPortrait
40 | UIInterfaceOrientationPortraitUpsideDown
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/CollectionUpdateExample/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UILaunchStoryboardName
24 | LaunchScreen
25 | UIMainStoryboardFile
26 | Main
27 | UIRequiredDeviceCapabilities
28 |
29 | armv7
30 |
31 | UISupportedInterfaceOrientations
32 |
33 | UIInterfaceOrientationPortrait
34 | UIInterfaceOrientationLandscapeLeft
35 | UIInterfaceOrientationLandscapeRight
36 |
37 | UISupportedInterfaceOrientations~ipad
38 |
39 | UIInterfaceOrientationPortrait
40 | UIInterfaceOrientationPortraitUpsideDown
41 | UIInterfaceOrientationLandscapeLeft
42 | UIInterfaceOrientationLandscapeRight
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/DragAndDrop/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/CollectionUpdateExample/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/CollectionUpdateExample/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | }
88 | ],
89 | "info" : {
90 | "version" : 1,
91 | "author" : "xcode"
92 | }
93 | }
--------------------------------------------------------------------------------
/DragAndDrop/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "size" : "1024x1024",
91 | "scale" : "1x"
92 | }
93 | ],
94 | "info" : {
95 | "version" : 1,
96 | "author" : "xcode"
97 | }
98 | }
--------------------------------------------------------------------------------
/DragAndDrop/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // DragAndDrop
4 | //
5 | // Created by Khoa Pham on 25.11.2017.
6 | // Copyright © 2017 Fantageek. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 | var window: UIWindow?
15 |
16 |
17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
18 | // Override point for customization after application launch.
19 | return true
20 | }
21 |
22 | func applicationWillResignActive(_ application: UIApplication) {
23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
24 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
25 | }
26 |
27 | func applicationDidEnterBackground(_ application: UIApplication) {
28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
30 | }
31 |
32 | func applicationWillEnterForeground(_ application: UIApplication) {
33 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
34 | }
35 |
36 | func applicationDidBecomeActive(_ application: UIApplication) {
37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
38 | }
39 |
40 | func applicationWillTerminate(_ application: UIApplication) {
41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
42 | }
43 |
44 |
45 | }
46 |
47 |
--------------------------------------------------------------------------------
/DragAndDrop/CollectionController.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Anchors
3 |
4 | class CollectionController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
5 |
6 | var items: [String] = []
7 | var cellColor: UIColor?
8 | var collectionView: UICollectionView!
9 |
10 | override func viewDidLoad() {
11 | super.viewDidLoad()
12 |
13 | let layout = UICollectionViewFlowLayout()
14 | collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
15 | collectionView.register(Cell.self, forCellWithReuseIdentifier: "Cell")
16 | collectionView.dataSource = self
17 | collectionView.delegate = self
18 |
19 | collectionView.backgroundColor = .white
20 |
21 | view.addSubview(collectionView)
22 | activate(
23 | collectionView.anchor.edges
24 | )
25 | }
26 |
27 | // MARK: - Logic
28 |
29 | func update(items: [String]) {
30 | self.items = items
31 | collectionView.reloadData()
32 | }
33 |
34 | func imageForCell(indexPath: IndexPath) -> UIImage {
35 | let cell = collectionView.cellForItem(at: indexPath)!
36 | let render = UIGraphicsImageRenderer(size: cell.frame.size)
37 | return render.image(actions: { (context) in
38 | cell.drawHierarchy(in: cell.frame, afterScreenUpdates: false)
39 | })
40 | }
41 |
42 | // MARK: - UICollectionViewDataSource
43 |
44 | func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
45 | return items.count
46 | }
47 |
48 | func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
49 | let item = items[indexPath.item]
50 | let cell = collectionView.dequeueReusableCell(
51 | withReuseIdentifier: "Cell",
52 | for: indexPath
53 | ) as! Cell
54 |
55 | cell.backgroundColor = cellColor
56 | cell.label.text = item
57 |
58 | return cell
59 | }
60 |
61 | // MARK: - UICollectionViewDelegateFlowLayout
62 |
63 | func collectionView(
64 | _ collectionView: UICollectionView,
65 | layout collectionViewLayout: UICollectionViewLayout,
66 | sizeForItemAt indexPath: IndexPath) -> CGSize {
67 |
68 | let value = collectionView.frame.size.width / 3 - 12
69 | return CGSize(width: value, height: value)
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/CollectionUpdateExample/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // CollectionUpdateExample
4 | //
5 | // Created by Khoa Pham on 25.11.2017.
6 | // Copyright © 2017 Fantageek. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 | var window: UIWindow?
15 |
16 |
17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
18 | // Override point for customization after application launch.
19 | return true
20 | }
21 |
22 | func applicationWillResignActive(_ application: UIApplication) {
23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
24 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
25 | }
26 |
27 | func applicationDidEnterBackground(_ application: UIApplication) {
28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
30 | }
31 |
32 | func applicationWillEnterForeground(_ application: UIApplication) {
33 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
34 | }
35 |
36 | func applicationDidBecomeActive(_ application: UIApplication) {
37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
38 | }
39 |
40 | func applicationWillTerminate(_ application: UIApplication) {
41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
42 | }
43 |
44 |
45 | }
46 |
47 |
--------------------------------------------------------------------------------
/DragAndDrop/ViewController.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Anchors
3 | import Omnia
4 |
5 | // Drag from left to right for now
6 | class ViewController: UIViewController, UICollectionViewDropDelegate, UICollectionViewDragDelegate {
7 |
8 | let leftController = CollectionController()
9 | let rightController = CollectionController()
10 |
11 | override func viewDidLoad() {
12 | super.viewDidLoad()
13 |
14 | [leftController, rightController].forEach {
15 | omnia_add(childController: $0)
16 | $0.collectionView.dragDelegate = self
17 | $0.collectionView.dropDelegate = self
18 | }
19 |
20 | leftController.cellColor = UIColor(hex: "#3498db")
21 | rightController.cellColor = UIColor(hex: "#2ecc71")
22 |
23 | let centerXGuide = UILayoutGuide()
24 | view.addLayoutGuide(centerXGuide)
25 |
26 | activate(
27 | centerXGuide.anchor.centerX,
28 |
29 | leftController.view.anchor.top.left.constant(10),
30 | leftController.view.anchor.bottom.constant(-10),
31 | leftController.view.anchor.right.equal.to(centerXGuide.anchor.left).constant(-30),
32 |
33 | rightController.view.anchor.top.constant(10),
34 | rightController.view.anchor.right.bottom.constant(-10),
35 | rightController.view.anchor.left.equal.to(centerXGuide.anchor.right).constant(30)
36 | )
37 |
38 | leftController.update(items: Array(0..<100).map(String.init))
39 | rightController.update(items: Array(100..<200).map(String.init))
40 | }
41 |
42 | // MARK: - UICollectionViewDragDelegate
43 |
44 | func collectionView(_ collectionView: UICollectionView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
45 | let controller = leftController
46 |
47 | let provider = NSItemProvider(
48 | object: controller.imageForCell(indexPath: indexPath)
49 | )
50 |
51 | let dragItem = UIDragItem(itemProvider: provider)
52 | dragItem.localObject = indexPath
53 | return [dragItem]
54 | }
55 |
56 | // MARK: - UICollectionViewDropDelegate
57 |
58 | func collectionView(_ collectionView: UICollectionView, performDropWith coordinator: UICollectionViewDropCoordinator) {
59 |
60 | let destinationIndexPath: IndexPath
61 | if let indexPath = coordinator.destinationIndexPath {
62 | destinationIndexPath = indexPath
63 | } else {
64 | destinationIndexPath = IndexPath(row: 0, section: 0)
65 | }
66 |
67 | let controller = rightController
68 |
69 | let dragItemIndexPath = coordinator.items.last?.dragItem.localObject as! IndexPath
70 | let draggedItem = leftController.items[dragItemIndexPath.item]
71 |
72 | // remove
73 | leftController.items.remove(at: dragItemIndexPath.item)
74 | leftController.collectionView.deleteItems(at: [dragItemIndexPath])
75 |
76 | // insert
77 | controller.items.insert(draggedItem, at: destinationIndexPath.item)
78 | controller.collectionView.insertItems(at: [destinationIndexPath])
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/DragAndDrop/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/CollectionUpdateExample/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/CollectionUpdateExample/ViewController.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Anchors
3 | import Omnia
4 | import Dropdowns
5 |
6 | class ViewController: UIViewController {
7 |
8 | let collectionController = CollectionController()
9 | lazy var items = Item.make(collectionController: collectionController)
10 |
11 | override func viewDidAppear(_ animated: Bool) {
12 | super.viewDidAppear(animated)
13 |
14 | omnia_add(childController: collectionController)
15 | activate(
16 | collectionController.view.anchor
17 | .edges.equal.to(view.safeAreaLayoutGuide.anchor)
18 | .insets(10)
19 | )
20 |
21 | collectionController.cellColor = UIColor(hex: "3498db")
22 |
23 | let titleView = TitleView(
24 | navigationController: navigationController!,
25 | title: "home",
26 | items: items.map({ $0.name })
27 | )
28 |
29 | titleView?.action = { [weak self] index in
30 | self?.handle(index: index)
31 | }
32 |
33 | navigationItem.titleView = titleView
34 | handle(index: 0)
35 | }
36 |
37 | // MARK: Logic
38 |
39 | func handle(index: Int) {
40 | let item = items[index]
41 |
42 | DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
43 | item.action()
44 | }
45 | }
46 | }
47 |
48 | class Item {
49 | let name: String
50 | let action: () -> Void
51 |
52 | init(name: String, _ action: @escaping () -> Void) {
53 | self.name = name
54 | self.action = action
55 | }
56 |
57 | static func make(collectionController: CollectionController) -> [Item] {
58 | return [
59 | Item(name: "reset", {
60 | collectionController.update(items: ["a", "b", "c", "d", "e", "f"])
61 | }),
62 | Item(name: "insert 3 beginning", {
63 | collectionController.items.insert("g", at: 0)
64 | collectionController.items.insert("h", at: 1)
65 | collectionController.items.insert("i", at: 2)
66 |
67 | let indexPaths = Array(0...2).map { IndexPath(item: $0, section: 0) }
68 | collectionController.collectionView.insertItems(at: indexPaths)
69 | }),
70 | Item(name: "delete 3 end", {
71 | collectionController.items.removeLast()
72 | collectionController.items.removeLast()
73 | collectionController.items.removeLast()
74 |
75 | let indexPaths = Array(3...5).map { IndexPath(item: $0, section: 0) }
76 | collectionController.collectionView.deleteItems(at: indexPaths)
77 | }),
78 | Item(name: "update at 2", {
79 | collectionController.items[2] = "👻"
80 |
81 | let indexPath = IndexPath(item: 2, section: 0)
82 | collectionController.collectionView.reloadItems(at: [indexPath])
83 | }),
84 | Item(name: "move c to end", {
85 | collectionController.items.remove(at: 2)
86 | collectionController.items.append("c")
87 | collectionController.collectionView.moveItem(
88 | at: IndexPath(item: 2, section: 0),
89 | to: IndexPath(item: 5, section :0)
90 | )
91 | }),
92 | Item(name: "delete 3 beginning, insert 3 end", {
93 | collectionController.items.removeFirst()
94 | collectionController.items.removeFirst()
95 | collectionController.items.removeFirst()
96 |
97 | collectionController.items.append(contentsOf: ["g", "h", "i"])
98 |
99 | collectionController.collectionView.performBatchUpdates({
100 | let deleteIndexPaths = Array(0...2).map { IndexPath(item: $0, section: 0) }
101 | collectionController.collectionView.deleteItems(at: deleteIndexPaths)
102 |
103 | let insertIndexPaths = Array(3...5).map { IndexPath(item: $0, section: 0) }
104 | collectionController.collectionView.insertItems(at: insertIndexPaths)
105 | }, completion: nil)
106 | }),
107 | Item(name: "insert 3 end, delete 3 beginning", {
108 | collectionController.items.append(contentsOf: ["g", "h", "i"])
109 |
110 | collectionController.items.removeFirst()
111 | collectionController.items.removeFirst()
112 | collectionController.items.removeFirst()
113 |
114 | collectionController.collectionView.performBatchUpdates({
115 | let insertIndexPaths = Array(6...8).map { IndexPath(item: $0, section: 0) }
116 | collectionController.collectionView.insertItems(at: insertIndexPaths)
117 |
118 | let deleteIndexPaths = Array(0...2).map { IndexPath(item: $0, section: 0) }
119 | collectionController.collectionView.deleteItems(at: deleteIndexPaths)
120 | }, completion: nil)
121 | }),
122 | Item(name: "insert 3 end, delete 3 beginning (😎)", {
123 | collectionController.items.append(contentsOf: ["g", "h", "i"])
124 |
125 | collectionController.items.removeFirst()
126 | collectionController.items.removeFirst()
127 | collectionController.items.removeFirst()
128 |
129 | collectionController.collectionView.performBatchUpdates({
130 | let deleteIndexPaths = Array(0...2).map { IndexPath(item: $0, section: 0) }
131 | collectionController.collectionView.deleteItems(at: deleteIndexPaths)
132 |
133 | let insertIndexPaths = Array(3...5).map { IndexPath(item: $0, section: 0) }
134 | collectionController.collectionView.insertItems(at: insertIndexPaths)
135 | }, completion: nil)
136 | }),
137 | Item(name: "insert 3 end", {
138 | collectionController.items.append(contentsOf: ["g", "h", "i"])
139 | let indexPaths = Array(6...8).map { IndexPath(item: $0, section: 0) }
140 | collectionController.collectionView.insertItems(at: indexPaths)
141 | }),
142 | Item(name: "delete 3 end, insert 1 end", {
143 | collectionController.items.removeLast()
144 | collectionController.items.removeLast()
145 | collectionController.items.removeLast()
146 |
147 | collectionController.items.append(contentsOf: ["g"])
148 |
149 | collectionController.collectionView.performBatchUpdates({
150 | let indexPaths = Array(3...5).map { IndexPath(item: $0, section: 0) }
151 | collectionController.collectionView.deleteItems(at: indexPaths)
152 | collectionController.collectionView.insertItems(at: [IndexPath(item: 3, section: 0)])
153 | }, completion: nil)
154 | }),
155 | Item(name: "delete 3 beginning, insert 1 beginning", {
156 | collectionController.items.removeFirst()
157 | collectionController.items.removeFirst()
158 | collectionController.items.removeFirst()
159 |
160 | collectionController.items.insert("g", at: 0)
161 |
162 | collectionController.collectionView.performBatchUpdates({
163 | let indexPaths = Array(0...2).map { IndexPath(item: $0, section: 0) }
164 | collectionController.collectionView.deleteItems(at: indexPaths)
165 | collectionController.collectionView.insertItems(at: [IndexPath(item: 0, section: 0)])
166 | }, completion: nil)
167 | }),
168 | Item(name: "delete 3 beginning, insert 1 end", {
169 | collectionController.items.removeFirst()
170 | collectionController.items.removeFirst()
171 | collectionController.items.removeFirst()
172 |
173 | collectionController.items.append("g")
174 |
175 | collectionController.collectionView.performBatchUpdates({
176 | let indexPaths = Array(0...2).map { IndexPath(item: $0, section: 0) }
177 | collectionController.collectionView.deleteItems(at: indexPaths)
178 | collectionController.collectionView.insertItems(at: [IndexPath(item: 3, section: 0)])
179 | }, completion: nil)
180 | }),
181 | Item(name: "insert 3 end, delete 1 end", {
182 | collectionController.items.append(contentsOf: ["g", "h", "i"])
183 | collectionController.items.removeLast()
184 |
185 | collectionController.collectionView.performBatchUpdates({
186 | collectionController.collectionView.deleteItems(at: [IndexPath(item: 5, section: 0)])
187 |
188 | let indexPaths = Array(5...7).map { IndexPath(item: $0, section: 0) }
189 | collectionController.collectionView.insertItems(at: indexPaths)
190 | }, completion: nil)
191 | }),
192 | Item(name: "insert 3 beginning, delete 1 beginning", {
193 | collectionController.items.insert("g", at: 0)
194 | collectionController.items.insert("h", at: 1)
195 | collectionController.items.insert("i", at: 2)
196 |
197 | collectionController.items.removeFirst()
198 |
199 | collectionController.collectionView.performBatchUpdates({
200 | collectionController.collectionView.deleteItems(at: [IndexPath(item: 0, section: 0)])
201 |
202 | let indexPaths = Array(0...2).map { IndexPath(item: $0, section: 0) }
203 | collectionController.collectionView.insertItems(at: indexPaths)
204 | }, completion: nil)
205 | })
206 | ]
207 | }
208 | }
209 |
--------------------------------------------------------------------------------
/CollectionUpdateExample.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 48;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 1F45DDD4C86B505AF5015EDB /* Pods_DragAndDrop.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D871CE6451915C187935853C /* Pods_DragAndDrop.framework */; };
11 | CCAE0659CB4FF3772A315DBE /* Pods_CollectionUpdateExample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D9A02A3346826D8986F4447 /* Pods_CollectionUpdateExample.framework */; };
12 | D240E0F61FC99A20000AB5AB /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D240E0F51FC99A20000AB5AB /* AppDelegate.swift */; };
13 | D240E0F81FC99A20000AB5AB /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D240E0F71FC99A20000AB5AB /* ViewController.swift */; };
14 | D240E0FB1FC99A20000AB5AB /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D240E0F91FC99A20000AB5AB /* Main.storyboard */; };
15 | D240E0FD1FC99A20000AB5AB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D240E0FC1FC99A20000AB5AB /* Assets.xcassets */; };
16 | D240E1001FC99A20000AB5AB /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D240E0FE1FC99A20000AB5AB /* LaunchScreen.storyboard */; };
17 | D240E10E1FC99A3F000AB5AB /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D240E10D1FC99A3F000AB5AB /* AppDelegate.swift */; };
18 | D240E1101FC99A3F000AB5AB /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D240E10F1FC99A3F000AB5AB /* ViewController.swift */; };
19 | D240E1131FC99A3F000AB5AB /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D240E1111FC99A3F000AB5AB /* Main.storyboard */; };
20 | D240E1151FC99A3F000AB5AB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D240E1141FC99A3F000AB5AB /* Assets.xcassets */; };
21 | D240E1181FC99A3F000AB5AB /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D240E1161FC99A3F000AB5AB /* LaunchScreen.storyboard */; };
22 | D240E11E1FC99A64000AB5AB /* Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D240E11D1FC99A64000AB5AB /* Cell.swift */; };
23 | D240E11F1FC99A64000AB5AB /* Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D240E11D1FC99A64000AB5AB /* Cell.swift */; };
24 | D240E1241FC99B3B000AB5AB /* CollectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D240E1231FC99B3B000AB5AB /* CollectionController.swift */; };
25 | D240E1251FC99B3B000AB5AB /* CollectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D240E1231FC99B3B000AB5AB /* CollectionController.swift */; };
26 | /* End PBXBuildFile section */
27 |
28 | /* Begin PBXFileReference section */
29 | 3AF4DD127E5DDDA64D0DEE7D /* Pods-CollectionUpdateExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CollectionUpdateExample.debug.xcconfig"; path = "Pods/Target Support Files/Pods-CollectionUpdateExample/Pods-CollectionUpdateExample.debug.xcconfig"; sourceTree = ""; };
30 | 489616F230A012BADB8D1176 /* Pods-DragAndDrop.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DragAndDrop.debug.xcconfig"; path = "Pods/Target Support Files/Pods-DragAndDrop/Pods-DragAndDrop.debug.xcconfig"; sourceTree = ""; };
31 | 9D9A02A3346826D8986F4447 /* Pods_CollectionUpdateExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CollectionUpdateExample.framework; sourceTree = BUILT_PRODUCTS_DIR; };
32 | B8D02EE87A30CC320FB4D14A /* Pods-CollectionUpdateExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CollectionUpdateExample.release.xcconfig"; path = "Pods/Target Support Files/Pods-CollectionUpdateExample/Pods-CollectionUpdateExample.release.xcconfig"; sourceTree = ""; };
33 | BD24F6C9EA73C4531FE8E0AD /* Pods-DragAndDrop.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DragAndDrop.release.xcconfig"; path = "Pods/Target Support Files/Pods-DragAndDrop/Pods-DragAndDrop.release.xcconfig"; sourceTree = ""; };
34 | D240E0F21FC99A20000AB5AB /* CollectionUpdateExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CollectionUpdateExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
35 | D240E0F51FC99A20000AB5AB /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
36 | D240E0F71FC99A20000AB5AB /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
37 | D240E0FA1FC99A20000AB5AB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
38 | D240E0FC1FC99A20000AB5AB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
39 | D240E0FF1FC99A20000AB5AB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
40 | D240E1011FC99A20000AB5AB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
41 | D240E10B1FC99A3F000AB5AB /* DragAndDrop.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DragAndDrop.app; sourceTree = BUILT_PRODUCTS_DIR; };
42 | D240E10D1FC99A3F000AB5AB /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
43 | D240E10F1FC99A3F000AB5AB /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
44 | D240E1121FC99A3F000AB5AB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
45 | D240E1141FC99A3F000AB5AB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
46 | D240E1171FC99A3F000AB5AB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
47 | D240E1191FC99A3F000AB5AB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
48 | D240E11D1FC99A64000AB5AB /* Cell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Cell.swift; sourceTree = ""; };
49 | D240E1231FC99B3B000AB5AB /* CollectionController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollectionController.swift; sourceTree = ""; };
50 | D871CE6451915C187935853C /* Pods_DragAndDrop.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_DragAndDrop.framework; sourceTree = BUILT_PRODUCTS_DIR; };
51 | /* End PBXFileReference section */
52 |
53 | /* Begin PBXFrameworksBuildPhase section */
54 | D240E0EF1FC99A20000AB5AB /* Frameworks */ = {
55 | isa = PBXFrameworksBuildPhase;
56 | buildActionMask = 2147483647;
57 | files = (
58 | CCAE0659CB4FF3772A315DBE /* Pods_CollectionUpdateExample.framework in Frameworks */,
59 | );
60 | runOnlyForDeploymentPostprocessing = 0;
61 | };
62 | D240E1081FC99A3F000AB5AB /* Frameworks */ = {
63 | isa = PBXFrameworksBuildPhase;
64 | buildActionMask = 2147483647;
65 | files = (
66 | 1F45DDD4C86B505AF5015EDB /* Pods_DragAndDrop.framework in Frameworks */,
67 | );
68 | runOnlyForDeploymentPostprocessing = 0;
69 | };
70 | /* End PBXFrameworksBuildPhase section */
71 |
72 | /* Begin PBXGroup section */
73 | 302974DF1270A48A5FF03FFE /* Frameworks */ = {
74 | isa = PBXGroup;
75 | children = (
76 | 9D9A02A3346826D8986F4447 /* Pods_CollectionUpdateExample.framework */,
77 | D871CE6451915C187935853C /* Pods_DragAndDrop.framework */,
78 | );
79 | name = Frameworks;
80 | sourceTree = "";
81 | };
82 | D240E0E91FC99A20000AB5AB = {
83 | isa = PBXGroup;
84 | children = (
85 | D240E0F41FC99A20000AB5AB /* CollectionUpdateExample */,
86 | D240E10C1FC99A3F000AB5AB /* DragAndDrop */,
87 | D240E0F31FC99A20000AB5AB /* Products */,
88 | E83A893DE453B5D9929B7ACC /* Pods */,
89 | 302974DF1270A48A5FF03FFE /* Frameworks */,
90 | );
91 | sourceTree = "";
92 | };
93 | D240E0F31FC99A20000AB5AB /* Products */ = {
94 | isa = PBXGroup;
95 | children = (
96 | D240E0F21FC99A20000AB5AB /* CollectionUpdateExample.app */,
97 | D240E10B1FC99A3F000AB5AB /* DragAndDrop.app */,
98 | );
99 | name = Products;
100 | sourceTree = "";
101 | };
102 | D240E0F41FC99A20000AB5AB /* CollectionUpdateExample */ = {
103 | isa = PBXGroup;
104 | children = (
105 | D240E0F51FC99A20000AB5AB /* AppDelegate.swift */,
106 | D240E0F71FC99A20000AB5AB /* ViewController.swift */,
107 | D240E0F91FC99A20000AB5AB /* Main.storyboard */,
108 | D240E0FC1FC99A20000AB5AB /* Assets.xcassets */,
109 | D240E0FE1FC99A20000AB5AB /* LaunchScreen.storyboard */,
110 | D240E1011FC99A20000AB5AB /* Info.plist */,
111 | );
112 | path = CollectionUpdateExample;
113 | sourceTree = "";
114 | };
115 | D240E10C1FC99A3F000AB5AB /* DragAndDrop */ = {
116 | isa = PBXGroup;
117 | children = (
118 | D240E10D1FC99A3F000AB5AB /* AppDelegate.swift */,
119 | D240E10F1FC99A3F000AB5AB /* ViewController.swift */,
120 | D240E1111FC99A3F000AB5AB /* Main.storyboard */,
121 | D240E1141FC99A3F000AB5AB /* Assets.xcassets */,
122 | D240E1161FC99A3F000AB5AB /* LaunchScreen.storyboard */,
123 | D240E1191FC99A3F000AB5AB /* Info.plist */,
124 | D240E11D1FC99A64000AB5AB /* Cell.swift */,
125 | D240E1231FC99B3B000AB5AB /* CollectionController.swift */,
126 | );
127 | path = DragAndDrop;
128 | sourceTree = "";
129 | };
130 | E83A893DE453B5D9929B7ACC /* Pods */ = {
131 | isa = PBXGroup;
132 | children = (
133 | 3AF4DD127E5DDDA64D0DEE7D /* Pods-CollectionUpdateExample.debug.xcconfig */,
134 | B8D02EE87A30CC320FB4D14A /* Pods-CollectionUpdateExample.release.xcconfig */,
135 | 489616F230A012BADB8D1176 /* Pods-DragAndDrop.debug.xcconfig */,
136 | BD24F6C9EA73C4531FE8E0AD /* Pods-DragAndDrop.release.xcconfig */,
137 | );
138 | name = Pods;
139 | sourceTree = "";
140 | };
141 | /* End PBXGroup section */
142 |
143 | /* Begin PBXNativeTarget section */
144 | D240E0F11FC99A20000AB5AB /* CollectionUpdateExample */ = {
145 | isa = PBXNativeTarget;
146 | buildConfigurationList = D240E1041FC99A20000AB5AB /* Build configuration list for PBXNativeTarget "CollectionUpdateExample" */;
147 | buildPhases = (
148 | E1E8F6F1DB847F9CAAE389AB /* [CP] Check Pods Manifest.lock */,
149 | D240E0EE1FC99A20000AB5AB /* Sources */,
150 | D240E0EF1FC99A20000AB5AB /* Frameworks */,
151 | D240E0F01FC99A20000AB5AB /* Resources */,
152 | C244A1980765CABEF729819D /* [CP] Embed Pods Frameworks */,
153 | 22C525E5ECB897975057CCCE /* [CP] Copy Pods Resources */,
154 | );
155 | buildRules = (
156 | );
157 | dependencies = (
158 | );
159 | name = CollectionUpdateExample;
160 | productName = CollectionUpdateExample;
161 | productReference = D240E0F21FC99A20000AB5AB /* CollectionUpdateExample.app */;
162 | productType = "com.apple.product-type.application";
163 | };
164 | D240E10A1FC99A3F000AB5AB /* DragAndDrop */ = {
165 | isa = PBXNativeTarget;
166 | buildConfigurationList = D240E11A1FC99A3F000AB5AB /* Build configuration list for PBXNativeTarget "DragAndDrop" */;
167 | buildPhases = (
168 | F466641B8904DC6B8BDEE9B9 /* [CP] Check Pods Manifest.lock */,
169 | D240E1071FC99A3F000AB5AB /* Sources */,
170 | D240E1081FC99A3F000AB5AB /* Frameworks */,
171 | D240E1091FC99A3F000AB5AB /* Resources */,
172 | 8F73FE03BF743A7795C1069A /* [CP] Embed Pods Frameworks */,
173 | 4A14DF2BF1951AD1D45C4B6B /* [CP] Copy Pods Resources */,
174 | );
175 | buildRules = (
176 | );
177 | dependencies = (
178 | );
179 | name = DragAndDrop;
180 | productName = DragAndDrop;
181 | productReference = D240E10B1FC99A3F000AB5AB /* DragAndDrop.app */;
182 | productType = "com.apple.product-type.application";
183 | };
184 | /* End PBXNativeTarget section */
185 |
186 | /* Begin PBXProject section */
187 | D240E0EA1FC99A20000AB5AB /* Project object */ = {
188 | isa = PBXProject;
189 | attributes = {
190 | LastSwiftUpdateCheck = 0910;
191 | LastUpgradeCheck = 0910;
192 | ORGANIZATIONNAME = Fantageek;
193 | TargetAttributes = {
194 | D240E0F11FC99A20000AB5AB = {
195 | CreatedOnToolsVersion = 9.1;
196 | ProvisioningStyle = Automatic;
197 | };
198 | D240E10A1FC99A3F000AB5AB = {
199 | CreatedOnToolsVersion = 9.1;
200 | ProvisioningStyle = Automatic;
201 | };
202 | };
203 | };
204 | buildConfigurationList = D240E0ED1FC99A20000AB5AB /* Build configuration list for PBXProject "CollectionUpdateExample" */;
205 | compatibilityVersion = "Xcode 8.0";
206 | developmentRegion = en;
207 | hasScannedForEncodings = 0;
208 | knownRegions = (
209 | en,
210 | Base,
211 | );
212 | mainGroup = D240E0E91FC99A20000AB5AB;
213 | productRefGroup = D240E0F31FC99A20000AB5AB /* Products */;
214 | projectDirPath = "";
215 | projectRoot = "";
216 | targets = (
217 | D240E0F11FC99A20000AB5AB /* CollectionUpdateExample */,
218 | D240E10A1FC99A3F000AB5AB /* DragAndDrop */,
219 | );
220 | };
221 | /* End PBXProject section */
222 |
223 | /* Begin PBXResourcesBuildPhase section */
224 | D240E0F01FC99A20000AB5AB /* Resources */ = {
225 | isa = PBXResourcesBuildPhase;
226 | buildActionMask = 2147483647;
227 | files = (
228 | D240E1001FC99A20000AB5AB /* LaunchScreen.storyboard in Resources */,
229 | D240E0FD1FC99A20000AB5AB /* Assets.xcassets in Resources */,
230 | D240E0FB1FC99A20000AB5AB /* Main.storyboard in Resources */,
231 | );
232 | runOnlyForDeploymentPostprocessing = 0;
233 | };
234 | D240E1091FC99A3F000AB5AB /* Resources */ = {
235 | isa = PBXResourcesBuildPhase;
236 | buildActionMask = 2147483647;
237 | files = (
238 | D240E1181FC99A3F000AB5AB /* LaunchScreen.storyboard in Resources */,
239 | D240E1151FC99A3F000AB5AB /* Assets.xcassets in Resources */,
240 | D240E1131FC99A3F000AB5AB /* Main.storyboard in Resources */,
241 | );
242 | runOnlyForDeploymentPostprocessing = 0;
243 | };
244 | /* End PBXResourcesBuildPhase section */
245 |
246 | /* Begin PBXShellScriptBuildPhase section */
247 | 22C525E5ECB897975057CCCE /* [CP] Copy Pods Resources */ = {
248 | isa = PBXShellScriptBuildPhase;
249 | buildActionMask = 2147483647;
250 | files = (
251 | );
252 | inputPaths = (
253 | );
254 | name = "[CP] Copy Pods Resources";
255 | outputPaths = (
256 | );
257 | runOnlyForDeploymentPostprocessing = 0;
258 | shellPath = /bin/sh;
259 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-CollectionUpdateExample/Pods-CollectionUpdateExample-resources.sh\"\n";
260 | showEnvVarsInLog = 0;
261 | };
262 | 4A14DF2BF1951AD1D45C4B6B /* [CP] Copy Pods Resources */ = {
263 | isa = PBXShellScriptBuildPhase;
264 | buildActionMask = 2147483647;
265 | files = (
266 | );
267 | inputPaths = (
268 | );
269 | name = "[CP] Copy Pods Resources";
270 | outputPaths = (
271 | );
272 | runOnlyForDeploymentPostprocessing = 0;
273 | shellPath = /bin/sh;
274 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-DragAndDrop/Pods-DragAndDrop-resources.sh\"\n";
275 | showEnvVarsInLog = 0;
276 | };
277 | 8F73FE03BF743A7795C1069A /* [CP] Embed Pods Frameworks */ = {
278 | isa = PBXShellScriptBuildPhase;
279 | buildActionMask = 2147483647;
280 | files = (
281 | );
282 | inputPaths = (
283 | "${SRCROOT}/Pods/Target Support Files/Pods-DragAndDrop/Pods-DragAndDrop-frameworks.sh",
284 | "${BUILT_PRODUCTS_DIR}/Anchors/Anchors.framework",
285 | "${BUILT_PRODUCTS_DIR}/Dropdowns/Dropdowns.framework",
286 | "${BUILT_PRODUCTS_DIR}/Omnia/Omnia.framework",
287 | );
288 | name = "[CP] Embed Pods Frameworks";
289 | outputPaths = (
290 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Anchors.framework",
291 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Dropdowns.framework",
292 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Omnia.framework",
293 | );
294 | runOnlyForDeploymentPostprocessing = 0;
295 | shellPath = /bin/sh;
296 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-DragAndDrop/Pods-DragAndDrop-frameworks.sh\"\n";
297 | showEnvVarsInLog = 0;
298 | };
299 | C244A1980765CABEF729819D /* [CP] Embed Pods Frameworks */ = {
300 | isa = PBXShellScriptBuildPhase;
301 | buildActionMask = 2147483647;
302 | files = (
303 | );
304 | inputPaths = (
305 | "${SRCROOT}/Pods/Target Support Files/Pods-CollectionUpdateExample/Pods-CollectionUpdateExample-frameworks.sh",
306 | "${BUILT_PRODUCTS_DIR}/Anchors/Anchors.framework",
307 | "${BUILT_PRODUCTS_DIR}/Dropdowns/Dropdowns.framework",
308 | "${BUILT_PRODUCTS_DIR}/Omnia/Omnia.framework",
309 | );
310 | name = "[CP] Embed Pods Frameworks";
311 | outputPaths = (
312 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Anchors.framework",
313 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Dropdowns.framework",
314 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Omnia.framework",
315 | );
316 | runOnlyForDeploymentPostprocessing = 0;
317 | shellPath = /bin/sh;
318 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-CollectionUpdateExample/Pods-CollectionUpdateExample-frameworks.sh\"\n";
319 | showEnvVarsInLog = 0;
320 | };
321 | E1E8F6F1DB847F9CAAE389AB /* [CP] Check Pods Manifest.lock */ = {
322 | isa = PBXShellScriptBuildPhase;
323 | buildActionMask = 2147483647;
324 | files = (
325 | );
326 | inputPaths = (
327 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
328 | "${PODS_ROOT}/Manifest.lock",
329 | );
330 | name = "[CP] Check Pods Manifest.lock";
331 | outputPaths = (
332 | "$(DERIVED_FILE_DIR)/Pods-CollectionUpdateExample-checkManifestLockResult.txt",
333 | );
334 | runOnlyForDeploymentPostprocessing = 0;
335 | shellPath = /bin/sh;
336 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
337 | showEnvVarsInLog = 0;
338 | };
339 | F466641B8904DC6B8BDEE9B9 /* [CP] Check Pods Manifest.lock */ = {
340 | isa = PBXShellScriptBuildPhase;
341 | buildActionMask = 2147483647;
342 | files = (
343 | );
344 | inputPaths = (
345 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
346 | "${PODS_ROOT}/Manifest.lock",
347 | );
348 | name = "[CP] Check Pods Manifest.lock";
349 | outputPaths = (
350 | "$(DERIVED_FILE_DIR)/Pods-DragAndDrop-checkManifestLockResult.txt",
351 | );
352 | runOnlyForDeploymentPostprocessing = 0;
353 | shellPath = /bin/sh;
354 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
355 | showEnvVarsInLog = 0;
356 | };
357 | /* End PBXShellScriptBuildPhase section */
358 |
359 | /* Begin PBXSourcesBuildPhase section */
360 | D240E0EE1FC99A20000AB5AB /* Sources */ = {
361 | isa = PBXSourcesBuildPhase;
362 | buildActionMask = 2147483647;
363 | files = (
364 | D240E0F81FC99A20000AB5AB /* ViewController.swift in Sources */,
365 | D240E0F61FC99A20000AB5AB /* AppDelegate.swift in Sources */,
366 | D240E1241FC99B3B000AB5AB /* CollectionController.swift in Sources */,
367 | D240E11E1FC99A64000AB5AB /* Cell.swift in Sources */,
368 | );
369 | runOnlyForDeploymentPostprocessing = 0;
370 | };
371 | D240E1071FC99A3F000AB5AB /* Sources */ = {
372 | isa = PBXSourcesBuildPhase;
373 | buildActionMask = 2147483647;
374 | files = (
375 | D240E1101FC99A3F000AB5AB /* ViewController.swift in Sources */,
376 | D240E10E1FC99A3F000AB5AB /* AppDelegate.swift in Sources */,
377 | D240E1251FC99B3B000AB5AB /* CollectionController.swift in Sources */,
378 | D240E11F1FC99A64000AB5AB /* Cell.swift in Sources */,
379 | );
380 | runOnlyForDeploymentPostprocessing = 0;
381 | };
382 | /* End PBXSourcesBuildPhase section */
383 |
384 | /* Begin PBXVariantGroup section */
385 | D240E0F91FC99A20000AB5AB /* Main.storyboard */ = {
386 | isa = PBXVariantGroup;
387 | children = (
388 | D240E0FA1FC99A20000AB5AB /* Base */,
389 | );
390 | name = Main.storyboard;
391 | sourceTree = "";
392 | };
393 | D240E0FE1FC99A20000AB5AB /* LaunchScreen.storyboard */ = {
394 | isa = PBXVariantGroup;
395 | children = (
396 | D240E0FF1FC99A20000AB5AB /* Base */,
397 | );
398 | name = LaunchScreen.storyboard;
399 | sourceTree = "";
400 | };
401 | D240E1111FC99A3F000AB5AB /* Main.storyboard */ = {
402 | isa = PBXVariantGroup;
403 | children = (
404 | D240E1121FC99A3F000AB5AB /* Base */,
405 | );
406 | name = Main.storyboard;
407 | sourceTree = "";
408 | };
409 | D240E1161FC99A3F000AB5AB /* LaunchScreen.storyboard */ = {
410 | isa = PBXVariantGroup;
411 | children = (
412 | D240E1171FC99A3F000AB5AB /* Base */,
413 | );
414 | name = LaunchScreen.storyboard;
415 | sourceTree = "";
416 | };
417 | /* End PBXVariantGroup section */
418 |
419 | /* Begin XCBuildConfiguration section */
420 | D240E1021FC99A20000AB5AB /* Debug */ = {
421 | isa = XCBuildConfiguration;
422 | buildSettings = {
423 | ALWAYS_SEARCH_USER_PATHS = NO;
424 | CLANG_ANALYZER_NONNULL = YES;
425 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
426 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
427 | CLANG_CXX_LIBRARY = "libc++";
428 | CLANG_ENABLE_MODULES = YES;
429 | CLANG_ENABLE_OBJC_ARC = YES;
430 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
431 | CLANG_WARN_BOOL_CONVERSION = YES;
432 | CLANG_WARN_COMMA = YES;
433 | CLANG_WARN_CONSTANT_CONVERSION = YES;
434 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
435 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
436 | CLANG_WARN_EMPTY_BODY = YES;
437 | CLANG_WARN_ENUM_CONVERSION = YES;
438 | CLANG_WARN_INFINITE_RECURSION = YES;
439 | CLANG_WARN_INT_CONVERSION = YES;
440 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
441 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
442 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
443 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
444 | CLANG_WARN_STRICT_PROTOTYPES = YES;
445 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
446 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
447 | CLANG_WARN_UNREACHABLE_CODE = YES;
448 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
449 | CODE_SIGN_IDENTITY = "iPhone Developer";
450 | COPY_PHASE_STRIP = NO;
451 | DEBUG_INFORMATION_FORMAT = dwarf;
452 | ENABLE_STRICT_OBJC_MSGSEND = YES;
453 | ENABLE_TESTABILITY = YES;
454 | GCC_C_LANGUAGE_STANDARD = gnu11;
455 | GCC_DYNAMIC_NO_PIC = NO;
456 | GCC_NO_COMMON_BLOCKS = YES;
457 | GCC_OPTIMIZATION_LEVEL = 0;
458 | GCC_PREPROCESSOR_DEFINITIONS = (
459 | "DEBUG=1",
460 | "$(inherited)",
461 | );
462 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
463 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
464 | GCC_WARN_UNDECLARED_SELECTOR = YES;
465 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
466 | GCC_WARN_UNUSED_FUNCTION = YES;
467 | GCC_WARN_UNUSED_VARIABLE = YES;
468 | IPHONEOS_DEPLOYMENT_TARGET = 11.1;
469 | MTL_ENABLE_DEBUG_INFO = YES;
470 | ONLY_ACTIVE_ARCH = YES;
471 | SDKROOT = iphoneos;
472 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
473 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
474 | SWIFT_VERSION = 4.0;
475 | };
476 | name = Debug;
477 | };
478 | D240E1031FC99A20000AB5AB /* Release */ = {
479 | isa = XCBuildConfiguration;
480 | buildSettings = {
481 | ALWAYS_SEARCH_USER_PATHS = NO;
482 | CLANG_ANALYZER_NONNULL = YES;
483 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
484 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
485 | CLANG_CXX_LIBRARY = "libc++";
486 | CLANG_ENABLE_MODULES = YES;
487 | CLANG_ENABLE_OBJC_ARC = YES;
488 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
489 | CLANG_WARN_BOOL_CONVERSION = YES;
490 | CLANG_WARN_COMMA = YES;
491 | CLANG_WARN_CONSTANT_CONVERSION = YES;
492 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
493 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
494 | CLANG_WARN_EMPTY_BODY = YES;
495 | CLANG_WARN_ENUM_CONVERSION = YES;
496 | CLANG_WARN_INFINITE_RECURSION = YES;
497 | CLANG_WARN_INT_CONVERSION = YES;
498 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
499 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
500 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
501 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
502 | CLANG_WARN_STRICT_PROTOTYPES = YES;
503 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
504 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
505 | CLANG_WARN_UNREACHABLE_CODE = YES;
506 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
507 | CODE_SIGN_IDENTITY = "iPhone Developer";
508 | COPY_PHASE_STRIP = NO;
509 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
510 | ENABLE_NS_ASSERTIONS = NO;
511 | ENABLE_STRICT_OBJC_MSGSEND = YES;
512 | GCC_C_LANGUAGE_STANDARD = gnu11;
513 | GCC_NO_COMMON_BLOCKS = YES;
514 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
515 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
516 | GCC_WARN_UNDECLARED_SELECTOR = YES;
517 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
518 | GCC_WARN_UNUSED_FUNCTION = YES;
519 | GCC_WARN_UNUSED_VARIABLE = YES;
520 | IPHONEOS_DEPLOYMENT_TARGET = 11.1;
521 | MTL_ENABLE_DEBUG_INFO = NO;
522 | SDKROOT = iphoneos;
523 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
524 | SWIFT_VERSION = 4.0;
525 | VALIDATE_PRODUCT = YES;
526 | };
527 | name = Release;
528 | };
529 | D240E1051FC99A20000AB5AB /* Debug */ = {
530 | isa = XCBuildConfiguration;
531 | baseConfigurationReference = 3AF4DD127E5DDDA64D0DEE7D /* Pods-CollectionUpdateExample.debug.xcconfig */;
532 | buildSettings = {
533 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
534 | CODE_SIGN_STYLE = Automatic;
535 | INFOPLIST_FILE = CollectionUpdateExample/Info.plist;
536 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
537 | PRODUCT_BUNDLE_IDENTIFIER = com.fantageek.CollectionUpdateExample;
538 | PRODUCT_NAME = "$(TARGET_NAME)";
539 | SWIFT_VERSION = 4.0;
540 | TARGETED_DEVICE_FAMILY = "1,2";
541 | };
542 | name = Debug;
543 | };
544 | D240E1061FC99A20000AB5AB /* Release */ = {
545 | isa = XCBuildConfiguration;
546 | baseConfigurationReference = B8D02EE87A30CC320FB4D14A /* Pods-CollectionUpdateExample.release.xcconfig */;
547 | buildSettings = {
548 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
549 | CODE_SIGN_STYLE = Automatic;
550 | INFOPLIST_FILE = CollectionUpdateExample/Info.plist;
551 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
552 | PRODUCT_BUNDLE_IDENTIFIER = com.fantageek.CollectionUpdateExample;
553 | PRODUCT_NAME = "$(TARGET_NAME)";
554 | SWIFT_VERSION = 4.0;
555 | TARGETED_DEVICE_FAMILY = "1,2";
556 | };
557 | name = Release;
558 | };
559 | D240E11B1FC99A3F000AB5AB /* Debug */ = {
560 | isa = XCBuildConfiguration;
561 | baseConfigurationReference = 489616F230A012BADB8D1176 /* Pods-DragAndDrop.debug.xcconfig */;
562 | buildSettings = {
563 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
564 | CODE_SIGN_STYLE = Automatic;
565 | INFOPLIST_FILE = DragAndDrop/Info.plist;
566 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
567 | PRODUCT_BUNDLE_IDENTIFIER = com.fantageek.DragAndDrop;
568 | PRODUCT_NAME = "$(TARGET_NAME)";
569 | SWIFT_VERSION = 4.0;
570 | TARGETED_DEVICE_FAMILY = 2;
571 | };
572 | name = Debug;
573 | };
574 | D240E11C1FC99A3F000AB5AB /* Release */ = {
575 | isa = XCBuildConfiguration;
576 | baseConfigurationReference = BD24F6C9EA73C4531FE8E0AD /* Pods-DragAndDrop.release.xcconfig */;
577 | buildSettings = {
578 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
579 | CODE_SIGN_STYLE = Automatic;
580 | INFOPLIST_FILE = DragAndDrop/Info.plist;
581 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
582 | PRODUCT_BUNDLE_IDENTIFIER = com.fantageek.DragAndDrop;
583 | PRODUCT_NAME = "$(TARGET_NAME)";
584 | SWIFT_VERSION = 4.0;
585 | TARGETED_DEVICE_FAMILY = 2;
586 | };
587 | name = Release;
588 | };
589 | /* End XCBuildConfiguration section */
590 |
591 | /* Begin XCConfigurationList section */
592 | D240E0ED1FC99A20000AB5AB /* Build configuration list for PBXProject "CollectionUpdateExample" */ = {
593 | isa = XCConfigurationList;
594 | buildConfigurations = (
595 | D240E1021FC99A20000AB5AB /* Debug */,
596 | D240E1031FC99A20000AB5AB /* Release */,
597 | );
598 | defaultConfigurationIsVisible = 0;
599 | defaultConfigurationName = Release;
600 | };
601 | D240E1041FC99A20000AB5AB /* Build configuration list for PBXNativeTarget "CollectionUpdateExample" */ = {
602 | isa = XCConfigurationList;
603 | buildConfigurations = (
604 | D240E1051FC99A20000AB5AB /* Debug */,
605 | D240E1061FC99A20000AB5AB /* Release */,
606 | );
607 | defaultConfigurationIsVisible = 0;
608 | defaultConfigurationName = Release;
609 | };
610 | D240E11A1FC99A3F000AB5AB /* Build configuration list for PBXNativeTarget "DragAndDrop" */ = {
611 | isa = XCConfigurationList;
612 | buildConfigurations = (
613 | D240E11B1FC99A3F000AB5AB /* Debug */,
614 | D240E11C1FC99A3F000AB5AB /* Release */,
615 | );
616 | defaultConfigurationIsVisible = 0;
617 | defaultConfigurationName = Release;
618 | };
619 | /* End XCConfigurationList section */
620 | };
621 | rootObject = D240E0EA1FC99A20000AB5AB /* Project object */;
622 | }
623 |
--------------------------------------------------------------------------------