From 3f010d52aae7400245e1f2ca9baa11791d700c86 Mon Sep 17 00:00:00 2001 From: ytakzk Date: Sun, 31 Jan 2016 22:00:17 +0900 Subject: [PATCH] first commit --- .travis.yml | 17 +- Classes/Assets.xcassets/Contents.json | 6 + .../ic_check.imageset/Contents.json | 23 + .../ic_check.imageset/ic_check_white_48pt.png | Bin 0 -> 199 bytes .../ic_check_white_48pt_2x.png | Bin 0 -> 308 bytes .../ic_check_white_48pt_3x.png | Bin 0 -> 386 bytes .../ic_close.imageset/Contents.json | 23 + .../ic_close.imageset/ic_close_white_48pt.png | Bin 0 -> 257 bytes .../ic_close_white_48pt_2x.png | Bin 0 -> 436 bytes .../ic_close_white_48pt_3x.png | Bin 0 -> 524 bytes .../ic_flash_auto.imageset/Contents.json | 23 + .../ic_flash_auto_white_48pt.png | Bin 0 -> 459 bytes .../ic_flash_auto_white_48pt_2x.png | Bin 0 -> 839 bytes .../ic_flash_auto_white_48pt_3x.png | Bin 0 -> 1183 bytes .../ic_flash_off.imageset/Contents.json | 23 + .../ic_flash_off_white_48pt.png | Bin 0 -> 345 bytes .../ic_flash_off_white_48pt_2x.png | Bin 0 -> 602 bytes .../ic_flash_off_white_48pt_3x.png | Bin 0 -> 875 bytes .../ic_flash_on.imageset/Contents.json | 23 + .../ic_flash_on_white_48pt.png | Bin 0 -> 239 bytes .../ic_flash_on_white_48pt_2x.png | Bin 0 -> 386 bytes .../ic_flash_on_white_48pt_3x.png | Bin 0 -> 516 bytes .../ic_insert_photo.imageset/Contents.json | 23 + .../ic_photo_white_36pt.png | Bin 0 -> 261 bytes .../ic_photo_white_36pt_2x.png | Bin 0 -> 450 bytes .../ic_photo_white_36pt_3x.png | Bin 0 -> 662 bytes .../ic_loop.imageset/Contents.json | 23 + .../ic_loop.imageset/ic_loop_white_48pt.png | Bin 0 -> 494 bytes .../ic_loop_white_48pt_2x.png | Bin 0 -> 933 bytes .../ic_loop_white_48pt_3x.png | Bin 0 -> 1440 bytes .../ic_photo_camera.imageset/Contents.json | 23 + .../ic_photo_camera_white_36pt.png | Bin 0 -> 364 bytes .../ic_photo_camera_white_36pt_2x.png | Bin 0 -> 666 bytes .../ic_photo_camera_white_36pt_3x.png | Bin 0 -> 985 bytes .../Contents.json | 23 + .../ic_radio_button_checked_white_24px.png | Bin 0 -> 859 bytes .../ic_radio_button_checked_white_24px@2x.png | Bin 0 -> 2013 bytes .../ic_radio_button_checked_white_24px@3x.png | Bin 0 -> 3661 bytes Classes/FSAlbumView.swift | 491 ++++++++ Classes/FSAlbumView.xib | 84 ++ Classes/FSAlbumViewCell.swift | 23 + Classes/FSAlbumViewCell.xib | 35 + Classes/FSCameraView.swift | 292 +++++ Classes/FSCameraView.xib | 93 ++ Classes/FSConstants.swift | 41 + Classes/FSImageCropView.swift | 174 +++ Classes/Fusuma.swift | 215 ++++ Classes/Fusuma.xib | 149 +++ Example/Fusuma.xcodeproj/project.pbxproj | 61 +- .../contents.xcworkspacedata | 10 + Example/Fusuma/Base.lproj/LaunchScreen.xib | 33 +- Example/Fusuma/Base.lproj/Main.storyboard | 43 +- .../AppIcon.appiconset/Contents.json | 62 +- .../AppIcon.appiconset/Icon-40.png | Bin 0 -> 994 bytes .../AppIcon.appiconset/Icon-40@2x.png | Bin 0 -> 1940 bytes .../AppIcon.appiconset/Icon-40@3x.png | Bin 0 -> 3013 bytes .../AppIcon.appiconset/Icon-60@2x.png | Bin 0 -> 3013 bytes .../AppIcon.appiconset/Icon-60@3x.png | Bin 0 -> 4896 bytes .../AppIcon.appiconset/Icon-76.png | Bin 0 -> 1867 bytes .../AppIcon.appiconset/Icon-76@2x.png | Bin 0 -> 3988 bytes .../AppIcon.appiconset/Icon-83.5@2x.png | Bin 0 -> 4371 bytes .../AppIcon.appiconset/Icon-Small.png | Bin 0 -> 742 bytes .../AppIcon.appiconset/Icon-Small@2x.png | Bin 0 -> 1316 bytes .../AppIcon.appiconset/Icon-Small@3x.png | Bin 0 -> 2151 bytes Example/Fusuma/Images.xcassets/Contents.json | 6 + Example/Fusuma/Info.plist | 2 +- Example/Fusuma/ViewController.swift | 45 +- Example/Podfile.lock | 21 + .../FBSnapshotTestCase.modulemap | 15 + .../Categories/UIImage+Compare.h | 37 + .../Categories/UIImage+Compare.m | 134 +++ .../Categories/UIImage+Diff.h | 37 + .../Categories/UIImage+Diff.m | 56 + .../Categories/UIImage+Snapshot.h | 24 + .../Categories/UIImage+Snapshot.m | 62 + .../FBSnapshotTestCase/FBSnapshotTestCase.h | 200 ++++ .../FBSnapshotTestCase/FBSnapshotTestCase.m | 136 +++ .../FBSnapshotTestCasePlatform.h | 44 + .../FBSnapshotTestCasePlatform.m | 49 + .../FBSnapshotTestController.h | 151 +++ .../FBSnapshotTestController.m | 356 ++++++ .../FBSnapshotTestCase/SwiftSupport.swift | 66 ++ Example/Pods/FBSnapshotTestCase/LICENSE | 29 + Example/Pods/FBSnapshotTestCase/README.md | 97 ++ .../FBSnapshotTestCase/FBSnapshotTestCase.h | 1 + .../FBSnapshotTestCasePlatform.h | 1 + .../FBSnapshotTestController.h | 1 + .../FBSnapshotTestCase/UIImage+Compare.h | 1 + .../Private/FBSnapshotTestCase/UIImage+Diff.h | 1 + .../FBSnapshotTestCase/UIImage+Snapshot.h | 1 + .../Pods/Local Podspecs/Fusuma.podspec.json | 25 + Example/Pods/Manifest.lock | 21 + Example/Pods/Pods.xcodeproj/project.pbxproj | 1018 +++++++++++++++++ .../xcshareddata/xcschemes/Fusuma.xcscheme | 60 + .../FBSnapshotTestCase-dummy.m | 5 + .../FBSnapshotTestCase-prefix.pch | 4 + .../FBSnapshotTestCase.modulemap | 15 + .../FBSnapshotTestCase.xcconfig | 8 + .../FBSnapshotTestCase/Info.plist | 26 + .../Fusuma/Fusuma-dummy.m | 5 + .../Fusuma/Fusuma-prefix.pch | 4 + .../Fusuma/Fusuma-umbrella.h | 6 + .../Fusuma/Fusuma.modulemap | 6 + .../Fusuma/Fusuma.xcconfig | 5 + .../Target Support Files/Fusuma/Info.plist | 26 + .../Pods-Fusuma_Example/Info.plist | 26 + ...s-Fusuma_Example-acknowledgements.markdown | 26 + ...Pods-Fusuma_Example-acknowledgements.plist | 56 + .../Pods-Fusuma_Example-dummy.m | 5 + .../Pods-Fusuma_Example-frameworks.sh | 91 ++ .../Pods-Fusuma_Example-resources.sh | 95 ++ .../Pods-Fusuma_Example-umbrella.h | 6 + .../Pods-Fusuma_Example.debug.xcconfig | 8 + .../Pods-Fusuma_Example.modulemap | 6 + .../Pods-Fusuma_Example.release.xcconfig | 8 + .../Pods-Fusuma_Tests/Info.plist | 26 + ...ods-Fusuma_Tests-acknowledgements.markdown | 59 + .../Pods-Fusuma_Tests-acknowledgements.plist | 93 ++ .../Pods-Fusuma_Tests-dummy.m | 5 + .../Pods-Fusuma_Tests-frameworks.sh | 93 ++ .../Pods-Fusuma_Tests-resources.sh | 95 ++ .../Pods-Fusuma_Tests-umbrella.h | 6 + .../Pods-Fusuma_Tests.debug.xcconfig | 8 + .../Pods-Fusuma_Tests.modulemap | 6 + .../Pods-Fusuma_Tests.release.xcconfig | 8 + Fusuma.podspec | 26 +- 126 files changed, 5529 insertions(+), 66 deletions(-) create mode 100644 Classes/Assets.xcassets/Contents.json create mode 100644 Classes/Assets.xcassets/ic_check.imageset/Contents.json create mode 100644 Classes/Assets.xcassets/ic_check.imageset/ic_check_white_48pt.png create mode 100644 Classes/Assets.xcassets/ic_check.imageset/ic_check_white_48pt_2x.png create mode 100644 Classes/Assets.xcassets/ic_check.imageset/ic_check_white_48pt_3x.png create mode 100644 Classes/Assets.xcassets/ic_close.imageset/Contents.json create mode 100644 Classes/Assets.xcassets/ic_close.imageset/ic_close_white_48pt.png create mode 100644 Classes/Assets.xcassets/ic_close.imageset/ic_close_white_48pt_2x.png create mode 100644 Classes/Assets.xcassets/ic_close.imageset/ic_close_white_48pt_3x.png create mode 100644 Classes/Assets.xcassets/ic_flash_auto.imageset/Contents.json create mode 100644 Classes/Assets.xcassets/ic_flash_auto.imageset/ic_flash_auto_white_48pt.png create mode 100644 Classes/Assets.xcassets/ic_flash_auto.imageset/ic_flash_auto_white_48pt_2x.png create mode 100644 Classes/Assets.xcassets/ic_flash_auto.imageset/ic_flash_auto_white_48pt_3x.png create mode 100644 Classes/Assets.xcassets/ic_flash_off.imageset/Contents.json create mode 100644 Classes/Assets.xcassets/ic_flash_off.imageset/ic_flash_off_white_48pt.png create mode 100644 Classes/Assets.xcassets/ic_flash_off.imageset/ic_flash_off_white_48pt_2x.png create mode 100644 Classes/Assets.xcassets/ic_flash_off.imageset/ic_flash_off_white_48pt_3x.png create mode 100644 Classes/Assets.xcassets/ic_flash_on.imageset/Contents.json create mode 100644 Classes/Assets.xcassets/ic_flash_on.imageset/ic_flash_on_white_48pt.png create mode 100644 Classes/Assets.xcassets/ic_flash_on.imageset/ic_flash_on_white_48pt_2x.png create mode 100644 Classes/Assets.xcassets/ic_flash_on.imageset/ic_flash_on_white_48pt_3x.png create mode 100644 Classes/Assets.xcassets/ic_insert_photo.imageset/Contents.json create mode 100644 Classes/Assets.xcassets/ic_insert_photo.imageset/ic_photo_white_36pt.png create mode 100644 Classes/Assets.xcassets/ic_insert_photo.imageset/ic_photo_white_36pt_2x.png create mode 100644 Classes/Assets.xcassets/ic_insert_photo.imageset/ic_photo_white_36pt_3x.png create mode 100644 Classes/Assets.xcassets/ic_loop.imageset/Contents.json create mode 100644 Classes/Assets.xcassets/ic_loop.imageset/ic_loop_white_48pt.png create mode 100644 Classes/Assets.xcassets/ic_loop.imageset/ic_loop_white_48pt_2x.png create mode 100644 Classes/Assets.xcassets/ic_loop.imageset/ic_loop_white_48pt_3x.png create mode 100644 Classes/Assets.xcassets/ic_photo_camera.imageset/Contents.json create mode 100644 Classes/Assets.xcassets/ic_photo_camera.imageset/ic_photo_camera_white_36pt.png create mode 100644 Classes/Assets.xcassets/ic_photo_camera.imageset/ic_photo_camera_white_36pt_2x.png create mode 100644 Classes/Assets.xcassets/ic_photo_camera.imageset/ic_photo_camera_white_36pt_3x.png create mode 100644 Classes/Assets.xcassets/ic_radio_button_checked.imageset/Contents.json create mode 100644 Classes/Assets.xcassets/ic_radio_button_checked.imageset/ic_radio_button_checked_white_24px.png create mode 100644 Classes/Assets.xcassets/ic_radio_button_checked.imageset/ic_radio_button_checked_white_24px@2x.png create mode 100644 Classes/Assets.xcassets/ic_radio_button_checked.imageset/ic_radio_button_checked_white_24px@3x.png create mode 100644 Classes/FSAlbumView.swift create mode 100644 Classes/FSAlbumView.xib create mode 100644 Classes/FSAlbumViewCell.swift create mode 100644 Classes/FSAlbumViewCell.xib create mode 100644 Classes/FSCameraView.swift create mode 100644 Classes/FSCameraView.xib create mode 100644 Classes/FSConstants.swift create mode 100644 Classes/FSImageCropView.swift create mode 100644 Classes/Fusuma.swift create mode 100644 Classes/Fusuma.xib create mode 100644 Example/Fusuma.xcworkspace/contents.xcworkspacedata create mode 100644 Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-40.png create mode 100644 Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png create mode 100644 Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-40@3x.png create mode 100644 Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png create mode 100644 Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png create mode 100644 Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-76.png create mode 100644 Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png create mode 100644 Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-83.5@2x.png create mode 100644 Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-Small.png create mode 100644 Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png create mode 100644 Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png create mode 100644 Example/Fusuma/Images.xcassets/Contents.json create mode 100644 Example/Podfile.lock create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase.modulemap create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.h create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.m create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.h create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.m create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.h create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.m create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.m create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.m create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.m create mode 100644 Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/SwiftSupport.swift create mode 100644 Example/Pods/FBSnapshotTestCase/LICENSE create mode 100644 Example/Pods/FBSnapshotTestCase/README.md create mode 120000 Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestCase.h create mode 120000 Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h create mode 120000 Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestController.h create mode 120000 Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Compare.h create mode 120000 Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Diff.h create mode 120000 Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Snapshot.h create mode 100644 Example/Pods/Local Podspecs/Fusuma.podspec.json create mode 100644 Example/Pods/Manifest.lock create mode 100644 Example/Pods/Pods.xcodeproj/project.pbxproj create mode 100644 Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Fusuma.xcscheme create mode 100644 Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-dummy.m create mode 100644 Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch create mode 100644 Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap create mode 100644 Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.xcconfig create mode 100644 Example/Pods/Target Support Files/FBSnapshotTestCase/Info.plist create mode 100644 Example/Pods/Target Support Files/Fusuma/Fusuma-dummy.m create mode 100644 Example/Pods/Target Support Files/Fusuma/Fusuma-prefix.pch create mode 100644 Example/Pods/Target Support Files/Fusuma/Fusuma-umbrella.h create mode 100644 Example/Pods/Target Support Files/Fusuma/Fusuma.modulemap create mode 100644 Example/Pods/Target Support Files/Fusuma/Fusuma.xcconfig create mode 100644 Example/Pods/Target Support Files/Fusuma/Info.plist create mode 100644 Example/Pods/Target Support Files/Pods-Fusuma_Example/Info.plist create mode 100644 Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-acknowledgements.markdown create mode 100644 Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-acknowledgements.plist create mode 100644 Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-dummy.m create mode 100755 Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-frameworks.sh create mode 100755 Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-resources.sh create mode 100644 Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-umbrella.h create mode 100644 Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example.debug.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example.modulemap create mode 100644 Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example.release.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-Fusuma_Tests/Info.plist create mode 100644 Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-acknowledgements.markdown create mode 100644 Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-acknowledgements.plist create mode 100644 Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-dummy.m create mode 100755 Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-frameworks.sh create mode 100755 Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-resources.sh create mode 100644 Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-umbrella.h create mode 100644 Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests.debug.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests.modulemap create mode 100644 Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests.release.xcconfig diff --git a/.travis.yml b/.travis.yml index e28b9032..5fa89a74 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,13 +1,8 @@ -# references: -# * http://www.objc.io/issue-6/travis-ci.html -# * https://github.com/supermarin/xcpretty#usage - language: objective-c -# cache: cocoapods -# podfile: Example/Podfile -# before_install: -# - gem install cocoapods # Since Travis is not always on latest version -# - pod install --project-directory=Example +osx_image: xcode7 script: -- set -o pipefail && xcodebuild test -workspace Example/Fusuma.xcworkspace -scheme Fusuma-Example -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO | xcpretty -- pod lib lint +- xctool -workspace Example/Fusuma.xcworkspace -scheme Fusuma-Example -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6' ONLY_ACTIVE_ARCH=NO + +before_install: + - brew update + - brew uninstall xctool && brew install --HEAD xctool diff --git a/Classes/Assets.xcassets/Contents.json b/Classes/Assets.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/Classes/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Classes/Assets.xcassets/ic_check.imageset/Contents.json b/Classes/Assets.xcassets/ic_check.imageset/Contents.json new file mode 100644 index 00000000..c6d53933 --- /dev/null +++ b/Classes/Assets.xcassets/ic_check.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_check_white_48pt.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "ic_check_white_48pt_2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "ic_check_white_48pt_3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Classes/Assets.xcassets/ic_check.imageset/ic_check_white_48pt.png b/Classes/Assets.xcassets/ic_check.imageset/ic_check_white_48pt.png new file mode 100644 index 0000000000000000000000000000000000000000..3b2b65d26291575f2741d223cdf80facb436dc20 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0DK2I0Nkcif|mv{3vD2TKsT6rJ; zxO0YV_Rhw~KO`R95NK`?{Vrkn{YyLa#r83bn@|VwIw^gKjzH(>hUq>tlAsh9~)aj{(R+p z`Qx=v&?j!r?}<)Pb+Jxa|B9Td>MRd7#ru4CATBh=u6rtH%}Q; zF2S4}H|$TDd2vZpm**~-Yq`B?`RDI>=AM&O5Gd%|E$QZt^z5~{GD`E>Rvd3$aT*N; zOLOqc*;IUZuv6kZgmJK$9l@9vVsjrT2@;$4f9Aj2?<$n$rI*_Xo)20iV{^LW(+3^J zQ%8;GYRI48%s#IpUFzc0%6q#n%ePj>ecry+zuL2m&h5)FJEp}G0XUN2K_Q242j*Cv&FuPo>v~sC%QnFDLoHv2P p-=jrc<&dz@!-+`2ap}rGh6f+*rTN0;Q-ER1;OXk;vd$@?2>?Pppu7M8 literal 0 HcmV?d00001 diff --git a/Classes/Assets.xcassets/ic_close.imageset/Contents.json b/Classes/Assets.xcassets/ic_close.imageset/Contents.json new file mode 100644 index 00000000..32559b50 --- /dev/null +++ b/Classes/Assets.xcassets/ic_close.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_close_white_48pt.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "ic_close_white_48pt_2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "ic_close_white_48pt_3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Classes/Assets.xcassets/ic_close.imageset/ic_close_white_48pt.png b/Classes/Assets.xcassets/ic_close.imageset/ic_close_white_48pt.png new file mode 100644 index 0000000000000000000000000000000000000000..b7c7ffd0e795ba76ed3a062566c9016448795f7a GIT binary patch literal 257 zcmV+c0sj7pP) zOA5m<3jYBNi%A&<@ZO?$P9};P4Y5CjG5$M&YXI45J{s}~# zf|&?x1_gn4B7+hS@X!l}&!voFhmZP^sujifL@~PKMMM~{6xH}^g$q7WOzwCQ5vHTU z6`v~H@rlA8e;CUh_(b84zg=+ih`wG<)HiJjzSlQx5#CnjMR;A)R^jtaTa9;7rSy)7O%~`cm?ZjXImW?6TYRT<;U^@VKiSj`soFk00000NkvXX Hu0mjfhD&W| literal 0 HcmV?d00001 diff --git a/Classes/Assets.xcassets/ic_close.imageset/ic_close_white_48pt_2x.png b/Classes/Assets.xcassets/ic_close.imageset/ic_close_white_48pt_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..39641921925f090e33df2767a4ee5e6d5911194f GIT binary patch literal 436 zcmV;l0ZaagP)32ETvhYyB39D^lU%DgQgv&#U%8l^-CA%qY@2qA=!B5=cm zUgehujQG*l{{`@rPr!f|fEk^>KI9WteE@ilV6HEl&_rJ@p_zU*;T}RirIc{5NocNLm*7JGdV(AM zYYDFOvk5~8{Z*t_>U=!XvoehUSEh=adIga45oe)B9kGgT}7UT3Cirmr(oHPv^YQ1-p=Hlh5u;xggf zX{&yw+El-OrrKQJRl@b7x{HLmNkj95`a#LLnW{Veb2C+!`ppt#r)=g4@?c8RY{yJj~W@W|h^mU4q`i)2y~Rw@J`jIh$1%|In!~{Tb{nMqaxlgb+dq eA%qY@zJ@mriVM?qfwL0;0000u<8%L#D-{7p<|%4@n9yOn_`BhIN5Se>F5&yX=g3#NJr`MF8+b%+$B8BmnCIPndHJicwnxNiHsOkk&+*iSjJjmJe1$X)E`JjJT7)$8wm+rVMFtHWj=GUBk= z=ke_WBcq(Ni(Gt*T>KFvWMaekQTMd-+4Z${JvAkNz8{`iZ@=$N<$){y-?y+S-FBWF zc%ND6E)u%gY+Qf)aIpRD!%Emtu>HZuoi`qLflzYyjmJ==_n}6?N_~C6*PuJQ&feR6 zYOCY7g5y!UB2LPQOzopr0M`r!;Q#;t literal 0 HcmV?d00001 diff --git a/Classes/Assets.xcassets/ic_flash_auto.imageset/Contents.json b/Classes/Assets.xcassets/ic_flash_auto.imageset/Contents.json new file mode 100644 index 00000000..3e088f5a --- /dev/null +++ b/Classes/Assets.xcassets/ic_flash_auto.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_flash_auto_white_48pt.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "ic_flash_auto_white_48pt_2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "ic_flash_auto_white_48pt_3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Classes/Assets.xcassets/ic_flash_auto.imageset/ic_flash_auto_white_48pt.png b/Classes/Assets.xcassets/ic_flash_auto.imageset/ic_flash_auto_white_48pt.png new file mode 100644 index 0000000000000000000000000000000000000000..185fa401c9eee6a7c0cf86d3f54bf1d82a47566b GIT binary patch literal 459 zcmV;+0W|)JP)4~WRRK^ZO#6cn*sFgdFW2D8jy)gdSj z^RUIkPl3_Y`3}C6i5d)?wQ@@X>(vjq>ccF6R-CG{U$&< zuyI!ba}%#;0auyO_?7>Y{Zi-WbmqNoHmbZdcmQ3R7FZUQz(}ta7>G(> zU8e|0U!NjiD9V8J^(g@sMJ2GITMNvKS|I)r;3xSHrwrNf4)6c~002ovPDHLkV1hv? B#Ag5i literal 0 HcmV?d00001 diff --git a/Classes/Assets.xcassets/ic_flash_auto.imageset/ic_flash_auto_white_48pt_2x.png b/Classes/Assets.xcassets/ic_flash_auto.imageset/ic_flash_auto_white_48pt_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..899276f6db6496ae152b1aa3094732aeeea9ef68 GIT binary patch literal 839 zcmV-N1GxN&P)FTmT3mxD*bSOpPt$-;bf7>vzR>J5x%3PupkRAwWp`Qz{9!o?c86AOr)5A91?y&- zR;KAr!+TYhc@(UV3JsIIqoG1y(gVuK=@iygu3?=_dcYuZ zdV#f_omkJ49N-@?v7QIrXHYGE_KVaet);&~j6zg&_14_v4Bh~<_cNFVGG6V9+X&2TEJ*ZwU z6|8*x1Ioy41nVI(J;54|e}I3$y7+-L6u8gd>5O-Pf55~ctT|R9(<-W12jd-3KyDAP zCQwr^u}0e-5b*(9#thbD&NTHD>mR-G4JabFA=-63`T_0%GmX=(XK@WEA-6SDY1bU9 z;~9`gZs%BtvvCY4Bm7>o5U=7GFo@jx!*AAf9Ilwt!rc2>(+q9M%*2Sm?6cB#z zvBpuL39QNJ1~>=Iv;(kCpg^YqYg?29iU_}3SQTgV3TClxwlN@*1J=PetTE*D2y2QZ zQ4J^|{0;!t5#)3Xu=YhYAdm37kM*0S$f<|FSa%~D;Qz@)Q#=D^>Hptu9TQa)15gmX z6qNKRK}1YMMNGs*R6G$#_zLI|z|!9C4HdI9e^$Zi)(zOi4EW;B4Vc6X_~gY5_~CFHsQYmP z7BK?qe%ydT%z%p+0d+raz$QjO-H#hEi4jou;{??Gm;r|v0d+raz#>LK-H#hEh#7DZ zBcSfb4cNp8sQYmPCQ$t~|;5HpBCh*QB;Sp^G~Nbl-XiE!{GsUUunL74eoQ9!g~ohjv}9!h>foi0ifJyd{H)42fW zn0cPcZWGHyqc$2(5tz<@p<|~FThvnS!iWdaQXhF+|FCK)>z!XN`TVKwh4){S_2idJ z_CM7PU@fe)*ngp?wCa<{igO%~iYEQtVdCGos^hZwjsEAKMOJj|u$kriExGyM9+p*# ze#(PB|MIjq7~zHtw8phaVD)WUNgD>*{k=G^Og#y#!gnH2j8^$J|_i+A>0 zn#iZx1MR4?5_@jYb~N)Q-xK+cLprnGYXm%CH~F4o9UxlxTXa?>OCsZ0uWihtg3F&L z6)H9vG#-s8W4=8KSa+izR3&JdiPJuvz2%6&v*Q+eD@{~$gHCgG24Fs z7LACRa@HaB$lJ{sW-spk-P`YL;?K@6^3vhWV|^3-x0Ro{X4$_y8@GV#(YGv}b$35M ztI}E51#)GU_{AK<4bRUil$xw(;}d!6U^7kEB!6Z3`x%n#n?-@XpL;ARYVYiWkDlqU zu2TH*m*Fg*^Q*fYV(-&612_w-xy0m^+Pu?FO@74xM55!=?u|Px|2O;Rkjk<@KBug^q6;yEy9RtBClsaEV-Xu$g4faWr2>uy}z`(|v8ulTQQLig;Y!o^E+^ zbOjTuL8<=bS^gfu1Z9gi$qGQX`C;bgS&eyg#x4%{{*H)I#R}t;UZyfS&40p6V~q zK0mQAU#3xp`C{RkBI`#V^mM{Bj|h119$`4HWzD0^=YK5Crp+Nsfz2YUQvbwtfrt*p z2~r)5eW7_ybM7@AJ^!V|2ILI&ga2Eve6e^H5p(ILLtosYe~*OeKjzk(N}{keZmR+y2)IZ&XamE+F> zc3Y1FY)lO7*Hb4Ysk7b7DR-@_t79&?s>tB*e*0A^hxA;=FJF#(I=JgHmVD>rbf{j# zAo7)U#cS?>>*5R6={v;6H|*MXja{ny28Jj@X)WWcUrbl1A(4t^)EcPGsCHaKI0+e}I99Tr0q8z9bTPOgWA2k7B5CLEi0bmd*;1fCUY!Cr(O~Yf2$bnb( zQJu(vi{a(4LWDriCaM!TaE8zq;%P)gz%6U2LbN&X&M_MG=#!YUmjhP_{YbRzq7-;x r2i2Pc=V(e`&ib^#37Qtr3Ye%L%KZCT^88nT00000NkvXXu0mjfollCl literal 0 HcmV?d00001 diff --git a/Classes/Assets.xcassets/ic_flash_off.imageset/ic_flash_off_white_48pt_2x.png b/Classes/Assets.xcassets/ic_flash_off.imageset/ic_flash_off_white_48pt_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1d774f244dee152a7974b4a16b6e413362bbcd7a GIT binary patch literal 602 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7z@+Hu;uuoF`1Y24m#Cvi>&MFv zTxPA>`GPCNhg%T^=d;>0JD;xavkuSE zTk$^c!9T4xw`X0>Fp=tYt5}_JuVd%qwO@EwtjKpb$e%D@^zuputxwF~BAMBFo7O*K z&AGPRGvdha#n*o2Hm!cdmUAs%xbFA;`^*uHIgUFr6-De59zD3iAu7qp=w!&m)Y8?{ zz_3sP$Z>UZXb1ptl#~@5G(en*f&vO6_6IyR?Ay=yKz$0s0gn|L3QU(jqE*wCn8e!w8liQ$1N z3qza}LxMsIV;PXA&caZKPJKA(!NG7(Ic^pQ;{ka+MQKHbifw=OL%mu4JkZ%B$kbrn zan|QEr{sa>Kh-CxGWhN2;%Q-6@b_){qpROqWFB;IpK#+~n5S?>L1r6g<^l6>7kCb3 zX*NVh$J)eyuFsa!W&Xgpa4u)I+#*$mzMVbW)b{+`{*QSJ&w=8WGLzMy9o@2r+`Ym}u+JZxMJXdx&Xx}&}C9QFvUpRxc znt{)7woX7Y6R*t+rAasWANAPOx>)^oEcs9(aPkfN#eOpn>v5|c4Rqc9Qc@NB9M8qahd;>9}YE(YV2zka0;8+3CsstA)j%`rI-JR z`l;`S*=HF9K4$*d`RVV6Ml~OhQl)QoTn;&lj`P{$6R2 z0PB17emS3uQdW(EonXCvse%yLgde|GGEeM~lJD?8a^GLJ!{v%e16WTZhl?-A3co3D z+?g^I4t2Qr@@q6m1#XfzTwoO#%(hDSt}mF+X)-JJrcEMOacp z-6+5>Wx<>i4we%egOr%3cA$!CPHYrXVperwtLkZHnrL%Dnk9_e<(9+Y|NFRHJ~^Bh z=wO;?aUowv(a&02pp)sYvjUgPBZv7L8Z-n>GChr#J68~)AjEXbP2rWxDhKx+O+aDh zTrv5&bzO|A@p57vC5?H?0;Ni!3$}L{m+fu#V0$5PUC?IHOJ-YlgiycMF7m7mtKRPuTJ(O$5~h--uZP~}Cd~Wb!LZjw!Aax4R22$;4xZNy49)owEg+?kg;G*xgeWXh{Op8wj$mX i1!hSg!)QX|o%%_+S}qs&pOXb_?T%d^ylnXR*fpUQ+E>JGe#0AO)nz%p-z(y|@SU9`DgP6dV$pvo2 z1l|mP1Gcf13o(HwF@c$r3*3nbd>CEeN=)EIOkm;c0uN#WUnUp05fgYbn83<~n81^m pz|6@7?!*K>j4p5`E|3F|{sCE(^o%b5aNYm_002ovPDHLkV1h(sUo`*# literal 0 HcmV?d00001 diff --git a/Classes/Assets.xcassets/ic_flash_on.imageset/ic_flash_on_white_48pt_2x.png b/Classes/Assets.xcassets/ic_flash_on.imageset/ic_flash_on_white_48pt_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cb606113c5ce2ed3e4a2865a614ffb2a75fd0e76 GIT binary patch literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7!074e;uuoF`1abuiLVm`SRM)r zh=enFJ$!i7?@*uxr}{#TGt;eD+!OTFKK)v-^EF?|)%(H+kE<=dm|-GSE4)8?@_Vs; zci)HQIS89CxYMAP=dhE}_fA6*^Q;|=PuWZgnNRU%JYt(7ec=eNhWUa{=>TFB3O?wT z%R6xL8QYys$q#9T%FNF=0RZAK5pKXBsA- z<=r7{{NU^(wiuwElu1l>?~n7`=#(tju#3?=iEYn}yA9li%yLI~ENI_DIHO&W~>(EUVFn&O!k%i1g49p6*7`vw{_@_(1+xC98a z1(vWl?PS}sfWvo%lklv7quNfKS`$vIgt6vrVlqDWy}TgJrkb&~n0vvk;x`Oe&($Su z{e6RBm2B;j?CTquzErN?_}x5ycLn=Zxn%AYWuGRkyL(J3;O&B=S=|wHSLizg#y9NR z$52|!`0CfM+6A0Pe*R**@|AVPYwm#S;tSU4JH#U7@k(f*=|}~ch@oQ>)GC<7HEebe sVHD8SkNz=o2q>@vu|op`Bh!<6v47tDN%?%P78tt>p00i_>zopr0LE(BcK`qY literal 0 HcmV?d00001 diff --git a/Classes/Assets.xcassets/ic_insert_photo.imageset/Contents.json b/Classes/Assets.xcassets/ic_insert_photo.imageset/Contents.json new file mode 100644 index 00000000..c10bef6b --- /dev/null +++ b/Classes/Assets.xcassets/ic_insert_photo.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_photo_white_36pt.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "ic_photo_white_36pt_2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "ic_photo_white_36pt_3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Classes/Assets.xcassets/ic_insert_photo.imageset/ic_photo_white_36pt.png b/Classes/Assets.xcassets/ic_insert_photo.imageset/ic_photo_white_36pt.png new file mode 100644 index 0000000000000000000000000000000000000000..b414cf5b6881d6ec172d2a7fbd73ada5bbf167ab GIT binary patch literal 261 zcmV+g0s8)lP)kmq8m|@f&vEk zXhJXy z)&q8Jdy{=h?m>-(r*@dK*d3epCi{|HgU+qz4*BYtIwp6bB0wo2#+nm8I>3B8iEGdk zTNzJQxB%cRn_*v)JJ1{dbN|paSFGhz>`QV3I>zMAKdKnfM6N&`Di|k|EDy3@h4PVK zk{o2e3gsieq-8-3jN^&)U)Wy&nw9O-LW-|?GEfU&#WGOH2p`=L$UkuoJ#eZRDaa7g sq|daVQ|=KHU?d>_qaXz-NI@l=ck_!~>**H-(*OVf07*qoM6N<$f*#evGXMYp literal 0 HcmV?d00001 diff --git a/Classes/Assets.xcassets/ic_insert_photo.imageset/ic_photo_white_36pt_3x.png b/Classes/Assets.xcassets/ic_insert_photo.imageset/ic_photo_white_36pt_3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f0f83fcaf4c652ba36fe0f2b6ff494c629763278 GIT binary patch literal 662 zcmeAS@N?(olHy`uVBq!ia0vp^IUvlz0wh)Q=esd5FvWVhIEGX(zP)qMYf7NRv5(?h z$0U^kJ$E%UajaUKs3#KJrn{#hGF&Nd(bWg*1Vr^8a%VlZ-NN~bsVg%!<<+O)iz`ml z2L$@veEssqL+cuw|LMBFqGjR)(tKoR26<^Nof2d+GpUb{TXfxFnaL&_CrBR8?+7hB zu{1YK;*b0W!)+(l`nvgZNk3+`+;;wjXM%Ii#B6DvBZtFI?pzuXFk;#_)UN z={Hx|zfB3gaenJ-rt0ICYtmi!ZHRUHeS+iL?WmH^Eo%!^XOywOp8NmOs+PUac#iq* zE2!z;xPQ%D>6~`&8{6-4Tb$H=zFn;HU|Q4vEt9%uY!h(>7e2ZP}5eIHr9x$`$|GRPZn@96g>RqpHIDh9r-yIY7FWb&-XfKS5V%<>r z{Q3Lh9sV)jHO_gjX4uxYv--&TcS-+ulvT|ro^;o=;^6mr34+>_4$qnVCV$5E1KQtJ zj_=>1vO!WO<9fyW`A>dKpT@MUhxNUV+n-x66YqKY?NqWoV}0`FwMDbVp3Ql}@;N?= z>4r_%!CNa6vm;!!gAVlN)l%5e#RR=1z!yZKutX#w#TvpZkq6y%7{>9}C~YJujzTRs+~V3r1RbUHBZT0mc|j;mb(TUZF70P2WDw%$(qs$)7aO!! z{($fI~^Zp(Nl?5^(NTvt+`UAv>D^ zoVHe+vtJHSHK%mrK!kuP)g}*li(L*m<{H*5IN1De+F`)#4pEi3Xgw}aFr}Lhyb3%O z?@=(y1)lK>4?K34sG2Gd_yo{OSYv(WsBsSPh##ouSmuVP8~SPB4eBfRvVjgW)F2If zM7_lVJ3*bLfzPPdA>asgl?J|{9*2NE)FKW1LER4l+o;<#P@}d&zys9pG_XYNhJYui zWg3{E4v8N!Owzy@bsPdl`M>E9bxkL5(dPLVZHEWig!(*m3V>W0uT9uf=l`hppD1|jEV&c<_zhu24aNKwgVB0 z87CaE$2P1xA9LD-8vjA2{={~aI7TY kSV_RKl7M4n0sF^*zbqi?c+z)hNB{r;07*qoM6N<$f`H-Bp#T5? literal 0 HcmV?d00001 diff --git a/Classes/Assets.xcassets/ic_loop.imageset/ic_loop_white_48pt_2x.png b/Classes/Assets.xcassets/ic_loop.imageset/ic_loop_white_48pt_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f8b1277176d5038a0b2009d31bb76db12c2d649e GIT binary patch literal 933 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7z?|dh;uuoF`1aPpY>{%210S~+ z7bvdwRSFWY5m^++>$>EiH$UsgFoFCe|JGFkM{mhgRb5%2C~)P$!D4>Kl_~xI*tZ3! z1aM8-y8YFy170iDF}BNrQaR*z1RP7py&59*PGev_u4oM-WRlSS2S|K zk8ZA&y>~IaS8uz;`H2@ki}kxKrP`3R>couXBohX&yZ4G_pFF|Pa6M*W$9ImK zb$E;o@e|w?f8t2N~T3V6qR4)UHv7zbFz+c!gjgKeH+g77EYZ$ zWxJPP^4xbD4w$9h?fmRm+*EpMm%#JMMfR(g98^30sOE~ejRNnyfG6xV%~o?mPjO5y zVpfx2cvW;m>%}Cq1SS0hIfj7gmme`!Ejjy~rROvM6%~)AGt;DROCS5pxQ}&(=Y+1! z9=CdH8sxUUpYZ1L!v3}H+WZM^ThY(8}BW>21B+R(>^g=+o-GLS1f;f zvrL2X65rj7eiO@fSU#}XW-qusb7SM%nBoJvIrd6@p9OB8ebx|~Gd-5^`Ucx9zKFx$ zc4|M+*|z*FV{Oj-9ZY>m)fZ(x@I@aNE#SBvR(xRpji_}EX4}4>WwgHWZ6^~~j`dIZ zh0W_4`Zwf0tM6PM!x;QC{*h@;dJJQH!tbq?3%YZ^)&Euet@&ST<0Gz!gWsJ0rM{c` z+UUFZHhtS`FDK_UocH*>!_uLmFZU+zhMu?OD(nyRwlOCA&7V@A9DRb>!uM9F_yL{F z`Og@){9wNAJ$-5(-|hUL@0^O4=vvI#cIoh+r!@_n_mXZuV+qP!;VE(9B)dS~(qOr*5T9^iu_~Sz}MVF5X+>erS5Y^A8_q+?6VrAG}59 zz;uNxifcYCG^;padah`S^Ol3t1HM-kw=a7sz>uc5;idlv7LMZ;Mm0{Cogb*O9aiP= zO`lYG?+Eh^$>(f)EBYtQ6*JcPsB_6X#;)D+xUbyDDdIUF@BN=2_+Hb0;t2*0Z|g59OFcFn_RX)TLGL9nFQ-(fvC1;3-oWW5c%0KQJv2csGSAmrdj3{ zXf?CQRVZc$^d(V!jq$u8q8iK&=zqxl%}Vb;9aNCJoE6YYYRH|&1hBKn)o9HI=u@KF z6a-KYQT1j6bPBoqm>`zt5pu)X0Nq9IJ4_%uf!xh3fLf^|_dzf~{m9i>;U4H+&-^n1FTzxdHb;!^oWs3TPC$BkqCzgWUe0fDR*f&OOji$ZZV@s2{nj z?ty+s?$w}xHXt|Y9_TT0?Lh&pL+-wNpn2q$1_iVRxheNRb>wnE0WC#t-aSwixk6At zEyz7}4>W_^s-S?DAy;t^^Z>cFK>>9jH|-wiHgcUo0lk4-**(xTJuaFya4|FuJ^JsZLAos0%pxww#1O@ana(mqabt6}!7!1#H7LeQI^T_q%V1PbC zuExvmfeg2h8wm#Jq|ZZp!w7PJ(h>wuj)%yd$Oh;WqS_J!(0fGHpAArv8ggfXe)L?; z>d~`d9JvY|-g#bO9=ZQwvI5#iRL8sneM3}VWCzs79CA-QAA2n4FXZNE%MQpeMpQ%I z-~Nz0i^&qGm#7waE#W`V4beN<0_C_vR97$wh7+P+vcE{ai|7s{0&+q0dG&)OqS&`+BH6ckbV?`qBRJU!(Gqa3E64Xk4gOCc;G zL)zqJ#^YLq?mtk&FZ-W0QCfW+R7~lx!xXL8=nPNWt zpBkQ*lt+PN9tE=VD3HvfKz1Gll6e%!&Z9tf9tDzl6v)n_Kr)X4*?APm&Z9swj{;eE u6v)D(KsFu)Dq$2TjVX`Hl8}f10000S{uX;NkkS)#&21u+#OWT?<*8xnfup2(UyYu`|TWayHRle3^B=LUseC>Hz3 z2?03L6F2Y)Y1vJelVK0EWmn2Ql$Ly?Q}HYJ&`ey8O(uTi9vWT@jom{_aSLoF;#2pK zl4W-|8up!*EPLl3g1*=uhfkRYaWVLWw$#P9nUaw)p(W=g$}a?K8bsDKc?-L=1LM-h zsPJb*v0}uSlpQ7f(8IPT6#ZR~|J)2!gMLSvx$!&t+WdOxKlA~ZoD~H=l;~Ih0000< KMNUMnLSTYiKb+YB literal 0 HcmV?d00001 diff --git a/Classes/Assets.xcassets/ic_photo_camera.imageset/ic_photo_camera_white_36pt_2x.png b/Classes/Assets.xcassets/ic_photo_camera.imageset/ic_photo_camera_white_36pt_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8e69dcebb98d43695027fcc7e39a339c84dda51 GIT binary patch literal 666 zcmV;L0%iS)P)y zDuP#FBS9M!QcYr?x(Xj5^OKhEOrZ0;%Xt?M^PS1$oUvkJVg?bG2*VOq|FP&lUkJx< zKARBwK%20%c&{z=j$iacgSVPOZ>ZBRKY6Vs^pYxn!v)X(MaU+{KDTId#}NxSK|*6x zFv$sHenK`COmmFwEtDe)3f@BdM8ToA&@EBW@D_@SSjd>rJ=jul4hPAn$ZYd zQ(^?GM-r@1H!ZY@i{+CPWphGpzG8()mbM9@HXpGBsG>9Ms~`YLf6Qp{EBmWamEC4dDr!XN=Tg=UR*LRnyXqu_l$^Po#V$T zj`&?_>IiL%W{Dt*qP?plloe0b6+u)P>h$wELg`L#hA>QZ`WYP|H+WzkLrdxi*`3}7 zVOSR<9(Dx^Vxd?l7V1BL0REY1s|}3R@&Et;07*qoM6N<$f_%9k Avj6}9 literal 0 HcmV?d00001 diff --git a/Classes/Assets.xcassets/ic_photo_camera.imageset/ic_photo_camera_white_36pt_3x.png b/Classes/Assets.xcassets/ic_photo_camera.imageset/ic_photo_camera_white_36pt_3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f271099823664d0aa0740b67b022b721b5f2b2a6 GIT binary patch literal 985 zcmV;~119{5P)5d?IJ=*9qUI(0wZiuCghBF{eHvjytT1Sn8PWzz@f&gES8cFgh$}y9 zg8f9C`B4k(2ja~?T+slVWt+Iu;o^S@OL2ikKF~&6wy5)v>1eQ{RMDOanXs_$XyHPd zoDBmzDp`tY8CzJ2DlX-@E$jlWC2I#;#I-Eg!9L(x-rK?2xR%d$FbDI$hIyEWZL-D^ zbKL57jwRM;x(<86HBOSo1e)d)*Lmq8tj&GC!R*juEYNWYR^$-IvJ&SMxLE=ujj{iRST>wAIE&b zU)ZF~0r|+LqXTwd-YrWOz*BkGc%TC&-wE@C$z5^%aSgB+a%2!T=foMWl80Rr1O6>x z^I8o58_B~?#xkzY2TnPiG;CA+TQ3tO1##b7$->se%TtRe`6TuQYRSTuBF;0J$-qg4 zWMOlGYjXgxyp+u+3%eD#_9_u0zEHpIVUB$i@8}vHQ?3mU`*GhSN;b5O`=)q67m1Qb z+8)qwDsc6sSiVI*14+ZKi~pB@L)fg73Y>B?d00(cKTX)kC6vFDhruy%!ac%dUR-|y zG{ExWgb~Wv<}rKaLWT}lhY4}U0iIg2Cah71DY>-3(%}J9 zJEBgo$hM0sN9)|+G(&RybB3F|a(zjxMU4XU-0t=c1!}bXTHkJjd6l=3yS@VQ%+dn3?{)!ZH9200000NkvXX Hu0mjf=@QQZ literal 0 HcmV?d00001 diff --git a/Classes/Assets.xcassets/ic_radio_button_checked.imageset/Contents.json b/Classes/Assets.xcassets/ic_radio_button_checked.imageset/Contents.json new file mode 100644 index 00000000..477c0079 --- /dev/null +++ b/Classes/Assets.xcassets/ic_radio_button_checked.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "ic_radio_button_checked_white_24px.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "ic_radio_button_checked_white_24px@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "ic_radio_button_checked_white_24px@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Classes/Assets.xcassets/ic_radio_button_checked.imageset/ic_radio_button_checked_white_24px.png b/Classes/Assets.xcassets/ic_radio_button_checked.imageset/ic_radio_button_checked_white_24px.png new file mode 100644 index 0000000000000000000000000000000000000000..321563bd7b71fb30f6a7e75479ae5ebcc8b65daf GIT binary patch literal 859 zcmV-h1ElPx&6-h)vR9FeknZIrmK@i4sky1oSC?jFfS)!l~5|lgvkb-vzll%<>5gzJTnpK)aCt-I@{v>!L+*_$e^zvb1wn8L(P*A7?5<912*2jO z$@ges#|DjX3UFH^cf4`b!0`L4qTaf=`g-8b!%?au|jCTFKw0X!l6P52}ttbK}SIs6os88Pv+B{H?M`K+Pk_KBkkk05JI z?ffu{Q2tHf+y)nx>9bj1p#7CUT3%<<7zGSnlA~#(D=4msxSIal(M_ug;NEI&IBArp zZ@nsW*AH*P@-waLS~%SzXTv+=R;PhkCbE2cTf&=pr^JGBj|1UiNg12ukLeCZk&EtA7=9T zxJ+1)JICd7UonC{*l(IT-!f%et=e~>tKFJ99l<_xl=eT_Ci9p_4t-Z7rQ--vS zcUw4e0)6fao+RCV)GPx+mq|oHRCodHo!^U9RTRg)J9~3L#eA3sTUK-!iVDhmc(5X<&>Y$|>Z-*flgXWu)mO%>YO+S&_*p9K56u!H9lUEt}a)h^uQ`OPkT-D}5J!w{_nrolz<5DeQCL$MSy_T*G|5+FYgPJ!E? zDpPE67_UwVXJp8324}&~pe`mZ;v|j?>0FCc%0gdZ6#(q3~JTBC@ zaUamQ@gSH6FM=5Rh{o?T^!Yc&iK{K*Z3EXpS^J8H?}Ec1<|Jx}Bp>o6pJh$CY;%cF zwlaZsf|U|X|Der0I8ZjW)lR;X7>eaJ<+Rg^5miorec&f2v)`yc2S#&-$xyM9n2PN& z<)%x-;0?#>c^>ipqy8nJ>sBSE*a-)52{q+7*q(?(ol(!*_DAX;twgnqpm2E=h*PL3 z*TKAFa5M%y9~fU!KlYO`Lx#9R;snGk)RePE8gYh`h0uu9(^;5Eb750t+`+fI@s|h!ZkSEWTXfM9c8jO0q`vQG;aKZw2STDu^}tkgu%) zTIE)u{ZXLYicH$%-yWb)_YW+)l*=NZ0Ou#cT`Ne5a``+NKq0pZ?KSnZ>{O-$TD8D! zqqQdIrRKJYfAtjWEE^OGi{)D}QrGs(r27uiPIG5#0YVz3{c~^{ST@%eGw3Bww}4M9 z=L0NPEZu{48|~%-cxWNF*JxyYoNJBEJ;A1pdiJMa)Fu(rJ*7A8)GOL(;lx@`>>a+* zKt1FkD6;ufw15LR)LW`5I~PDPRRywI_$@MN)#>59(6q)f_ewGj^?{-5QdOqd?hh8) z90(xXp1wYp$gjOBMYhZU^1Gr6{bdl)u;K!6zm58RMZ8w*3kjECH%YD#}y!(`|0FS*x<+_L`-r^!o9#hWBJLOd>%t>vJxi8!v=Oyd9I3+nR8L{?<2&f$c!A95Ds>-3@2BWKZDB1T=g+RmI-nn3=rZ!lufmm);7x0aRDJ>m+7g-kvo9 zy(f1d0&1@8F)vAv@7TItZdUHA>Vf+1S&{84D$FQb&Nx<=LtbuH?)N01Ioft+f7w}o zl-0f5taXB$Ap#!sWXL33%UIsk8&8O`bypH@p7vJmK?3S-UD0w^7NO6w4pw~3#VN@- zefO<5iJQ%WYOf%VUm@UOUf2t&bZgD`iYm(K8~PJ!_|(epd}#d<)SFK@c|ut^Uzc{e z2Fk9kKji*>JGUgi;6sY6Px$=SgDVjSaq*g!b6c}e0jKEFuG^ZNoxfmw8Vr2;TJDm5T@N6uq-{ip+&R3EoOV0P7)$E8!WB9heo*_nzrMh+2WfoV(}K=q!%`u%<~0I zZ8A^IacQfIuWl&s$?dA^1EKvYz#%pkH(*U! zlT_Ld3(<6vpv_nQW0XWhO|Y9Eorn~%`Pq{g0o9gX*!=L$07O(z^t_#^-nQnapEkrt z4qX#HA1vzU|%^zfSdqDSCZiA{!vBhD0Xo(KnG30f(ZyIP4{}2q@6hpBT zv-BtFYu@B7N4_~V`Tq~V59<)T#q5B_8?CJ?F8L` vzIry%1)e_sNo0MaK%0d$Ufe*X{|@7S=t7#yVlTH700000NkvXXu0mjf>|x%> literal 0 HcmV?d00001 diff --git a/Classes/Assets.xcassets/ic_radio_button_checked.imageset/ic_radio_button_checked_white_24px@3x.png b/Classes/Assets.xcassets/ic_radio_button_checked.imageset/ic_radio_button_checked_white_24px@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..4f32ba56a549e2eee0e0b3c622fb52d86b586279 GIT binary patch literal 3661 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 literal 0 HcmV?d00001 diff --git a/Classes/FSAlbumView.swift b/Classes/FSAlbumView.swift new file mode 100644 index 00000000..18bba6b8 --- /dev/null +++ b/Classes/FSAlbumView.swift @@ -0,0 +1,491 @@ +// +// FSAlbumView.swift +// Fusuma +// +// Created by Yuta Akizuki on 2015/11/14. +// Copyright © 2015年 ytakzk. All rights reserved. +// + +import UIKit +import Photos + +protocol FSAlbumViewDelegate: class { + + func albumViewCameraRollUnauthorized() +} + +final class FSAlbumView: UIView, UICollectionViewDataSource, UICollectionViewDelegate, PHPhotoLibraryChangeObserver, UIGestureRecognizerDelegate { + + @IBOutlet weak var collectionView: UICollectionView! + @IBOutlet weak var imageCropView: FSImageCropView! + @IBOutlet weak var imageCropViewContainer: UIView! + + @IBOutlet weak var collectionViewConstraintHeight: NSLayoutConstraint! + @IBOutlet weak var imageCropViewConstraintTop: NSLayoutConstraint! + + weak var delegate: FSAlbumViewDelegate? = nil + + var images: PHFetchResult! + let imageManager = PHCachingImageManager() + var previousPreheatRect: CGRect = CGRectZero + let cellSize = CGSize(width: 100, height: 100) + + // Variables for calculating the position + enum Direction { + case Scroll + case Stop + case Up + case Down + } + let imageCropViewOriginalConstraintTop: CGFloat = 50 + let imageCropViewMinimalVisibleHeight: CGFloat = 100 + var dragDirection = Direction.Up + var imaginaryCollectionViewOffsetStartPosY: CGFloat = 0.0 + + var cropBottomY: CGFloat = 0.0 + var dragStartPos: CGPoint = CGPointZero + let dragDiff: CGFloat = 20.0 + + static func instance() -> FSAlbumView { + + return UINib(nibName: "FSAlbumView", bundle: nil).instantiateWithOwner(self, options: nil)[0] as! FSAlbumView + } + + func initialize() { + + if images != nil { + + return + } + + self.hidden = false + + let panGesture = UIPanGestureRecognizer(target: self, action: "panned:") + panGesture.delegate = self + self.addGestureRecognizer(panGesture) + + collectionViewConstraintHeight.constant = self.frame.height - imageCropView.frame.height - imageCropViewOriginalConstraintTop + imageCropViewConstraintTop.constant = 50 + dragDirection = Direction.Up + + imageCropViewContainer.layer.shadowColor = UIColor.blackColor().CGColor + imageCropViewContainer.layer.shadowRadius = 30.0 + imageCropViewContainer.layer.shadowOpacity = 0.9 + imageCropViewContainer.layer.shadowOffset = CGSizeZero + + collectionView.registerNib(UINib(nibName: "FSAlbumViewCell", bundle: nil), forCellWithReuseIdentifier: "FSAlbumViewCell") + + // Never load photos Unless the user allows to access to photo album + checkPhotoAuth() + + // Sorting condition + let options = PHFetchOptions() + options.sortDescriptors = [ + NSSortDescriptor(key: "creationDate", ascending: false) + ] + + images = PHAsset.fetchAssetsWithMediaType(.Image, options: options) + + if images.count > 0 { + + changeImage(images[0] as! PHAsset) + } + + collectionView.reloadData() + + PHPhotoLibrary.sharedPhotoLibrary().registerChangeObserver(self) + + } + + deinit { + + if PHPhotoLibrary.authorizationStatus() == PHAuthorizationStatus.Authorized { + + PHPhotoLibrary.sharedPhotoLibrary().unregisterChangeObserver(self) + } + } + + func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool { + + return true + } + + func panned(sender: UITapGestureRecognizer) { + + if sender.state == UIGestureRecognizerState.Began { + + let view = sender.view + let loc = sender.locationInView(view) + let subview = view?.hitTest(loc, withEvent: nil) + + if subview == imageCropView && imageCropViewConstraintTop.constant == imageCropViewOriginalConstraintTop { + + return + } + + dragStartPos = sender.locationInView(self) + + cropBottomY = self.imageCropViewContainer.frame.origin.y + self.imageCropViewContainer.frame.height + + // Move + if dragDirection == Direction.Stop { + + dragDirection = (imageCropViewConstraintTop.constant == imageCropViewOriginalConstraintTop) ? Direction.Up : Direction.Down + } + + // Scroll event of CollectionView is preferred. + if (dragDirection == Direction.Up && dragStartPos.y < cropBottomY + dragDiff) || + (dragDirection == Direction.Down && dragStartPos.y > cropBottomY) { + + dragDirection = Direction.Stop + + imageCropView.changeScrollable(false) + + } else { + + imageCropView.changeScrollable(true) + } + + } else if sender.state == UIGestureRecognizerState.Changed { + + let currentPos = sender.locationInView(self) + + if dragDirection == Direction.Up && currentPos.y < cropBottomY - dragDiff { + + imageCropViewConstraintTop.constant = max(imageCropViewMinimalVisibleHeight - self.imageCropViewContainer.frame.height, currentPos.y + dragDiff - imageCropViewContainer.frame.height) + + collectionViewConstraintHeight.constant = min(self.frame.height - imageCropViewMinimalVisibleHeight, self.frame.height - imageCropViewConstraintTop.constant - imageCropViewContainer.frame.height) + + } else if dragDirection == Direction.Down && currentPos.y > cropBottomY { + + imageCropViewConstraintTop.constant = min(imageCropViewOriginalConstraintTop, currentPos.y - imageCropViewContainer.frame.height) + + collectionViewConstraintHeight.constant = max(self.frame.height - imageCropViewOriginalConstraintTop - imageCropViewContainer.frame.height, self.frame.height - imageCropViewConstraintTop.constant - imageCropViewContainer.frame.height) + + } else if dragDirection == Direction.Stop && collectionView.contentOffset.y < 0 { + + dragDirection = Direction.Scroll + imaginaryCollectionViewOffsetStartPosY = currentPos.y + + } else if dragDirection == Direction.Scroll { + + imageCropViewConstraintTop.constant = imageCropViewMinimalVisibleHeight - self.imageCropViewContainer.frame.height + currentPos.y - imaginaryCollectionViewOffsetStartPosY + + collectionViewConstraintHeight.constant = max(self.frame.height - imageCropViewOriginalConstraintTop - imageCropViewContainer.frame.height, self.frame.height - imageCropViewConstraintTop.constant - imageCropViewContainer.frame.height) + + } + + } else { + + imaginaryCollectionViewOffsetStartPosY = 0.0 + + if sender.state == UIGestureRecognizerState.Ended && dragDirection == Direction.Stop { + + imageCropView.changeScrollable(true) + return + } + + let currentPos = sender.locationInView(self) + + if currentPos.y < cropBottomY - dragDiff && imageCropViewConstraintTop.constant != imageCropViewOriginalConstraintTop { + + // The largest movement + imageCropView.changeScrollable(false) + + imageCropViewConstraintTop.constant = imageCropViewMinimalVisibleHeight - self.imageCropViewContainer.frame.height + + collectionViewConstraintHeight.constant = self.frame.height - imageCropViewMinimalVisibleHeight + + UIView.animateWithDuration(0.3, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: { + + self.layoutIfNeeded() + + }, completion: nil) + + dragDirection = Direction.Down + + } else { + + // Get back to the original position + imageCropView.changeScrollable(true) + + imageCropViewConstraintTop.constant = imageCropViewOriginalConstraintTop + collectionViewConstraintHeight.constant = self.frame.height - imageCropViewOriginalConstraintTop - imageCropViewContainer.frame.height + + UIView.animateWithDuration(0.3, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: { + + self.layoutIfNeeded() + + }, completion: nil) + + dragDirection = Direction.Up + + } + } + + + } + + + private func changeImage(asset: PHAsset) { + + self.imageCropView.image = nil + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { + + let options = PHImageRequestOptions() + + self.imageManager.requestImageForAsset(asset, + targetSize: CGSize(width: asset.pixelWidth, height: asset.pixelHeight), + contentMode: .AspectFill, + options: options) { + result, info in + + dispatch_async(dispatch_get_main_queue(), { + + self.imageCropView.imageSize = CGSize(width: asset.pixelWidth, height: asset.pixelHeight) + self.imageCropView.image = result + }) + } + }) + } + + // MARK: - UICollectionViewDelegate Protocol + func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { + + let cell = collectionView.dequeueReusableCellWithReuseIdentifier("FSAlbumViewCell", forIndexPath: indexPath) as! FSAlbumViewCell + + let currentTag = cell.tag + 1 + cell.tag = currentTag + + let asset = self.images[indexPath.item] as! PHAsset + self.imageManager.requestImageForAsset(asset, + targetSize: cellSize, + contentMode: .AspectFill, + options: nil) { + result, info in + + if cell.tag == currentTag { + cell.image = result + } + + } + + return cell + } + + func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { + + return 1 + } + + func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + + return images == nil ? 0 : images.count + } + + func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { + + let width = (collectionView.frame.width - 3) / 4 + return CGSize(width: width, height: width) + } + + func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { + + changeImage(images[indexPath.row] as! PHAsset) + + imageCropView.changeScrollable(true) + + imageCropViewConstraintTop.constant = imageCropViewOriginalConstraintTop + collectionViewConstraintHeight.constant = self.frame.height - imageCropViewOriginalConstraintTop - imageCropViewContainer.frame.height + + UIView.animateWithDuration(0.2, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: { + + self.layoutIfNeeded() + + }, completion: nil) + + dragDirection = Direction.Up + } + + // Check the status of authorization for PHPhotoLibrary + private func checkPhotoAuth() { + + PHPhotoLibrary.requestAuthorization { (status) -> Void in + switch status { + case .Authorized: + + if self.images != nil && self.images.count > 0 { + + self.changeImage(self.images[0] as! PHAsset) + } + + case .Restricted, .Denied: + dispatch_async(dispatch_get_main_queue(), { () -> Void in + + self.delegate?.albumViewCameraRollUnauthorized() + + }) + default: + break + } + } + } + + // MARK: - ScrollViewDelegate + func scrollViewDidScroll(scrollView: UIScrollView) { + + if scrollView == collectionView { + self.updateCachedAssets() + } + } + + + //MARK: - PHPhotoLibraryChangeObserver + func photoLibraryDidChange(changeInstance: PHChange) { + + dispatch_async(dispatch_get_main_queue()) { + + let collectionChanges = changeInstance.changeDetailsForFetchResult(self.images) + if collectionChanges != nil { + + self.images = collectionChanges!.fetchResultAfterChanges + + let collectionView = self.collectionView! + + if !collectionChanges!.hasIncrementalChanges || collectionChanges!.hasMoves { + + collectionView.reloadData() + + } else { + + collectionView.performBatchUpdates({ + let removedIndexes = collectionChanges!.removedIndexes + if (removedIndexes?.count ?? 0) != 0 { + collectionView.deleteItemsAtIndexPaths(removedIndexes!.aapl_indexPathsFromIndexesWithSection(0)) + } + let insertedIndexes = collectionChanges!.insertedIndexes + if (insertedIndexes?.count ?? 0) != 0 { + collectionView.insertItemsAtIndexPaths(insertedIndexes!.aapl_indexPathsFromIndexesWithSection(0)) + } + let changedIndexes = collectionChanges!.changedIndexes + if (changedIndexes?.count ?? 0) != 0 { + collectionView.reloadItemsAtIndexPaths(changedIndexes!.aapl_indexPathsFromIndexesWithSection(0)) + } + }, completion: nil) + } + + self.resetCachedAssets() + } + } + } + + // MARK: - Asset Caching + + func resetCachedAssets() { + + imageManager.stopCachingImagesForAllAssets() + previousPreheatRect = CGRectZero + } + + private func updateCachedAssets() { + + var preheatRect = self.collectionView!.bounds + preheatRect = CGRectInset(preheatRect, 0.0, -0.5 * CGRectGetHeight(preheatRect)) + + let delta = abs(CGRectGetMidY(preheatRect) - CGRectGetMidY(self.previousPreheatRect)) + if delta > CGRectGetHeight(self.collectionView!.bounds) / 3.0 { + + var addedIndexPaths: [NSIndexPath] = [] + var removedIndexPaths: [NSIndexPath] = [] + + self.computeDifferenceBetweenRect(self.previousPreheatRect, andRect: preheatRect, removedHandler: {removedRect in + let indexPaths = self.collectionView.aapl_indexPathsForElementsInRect(removedRect) + removedIndexPaths += indexPaths + }, addedHandler: {addedRect in + let indexPaths = self.collectionView.aapl_indexPathsForElementsInRect(addedRect) + addedIndexPaths += indexPaths + }) + + let assetsToStartCaching = self.assetsAtIndexPaths(addedIndexPaths) + let assetsToStopCaching = self.assetsAtIndexPaths(removedIndexPaths) + + self.imageManager.startCachingImagesForAssets(assetsToStartCaching, + targetSize: cellSize, + contentMode: .AspectFill, + options: nil) + self.imageManager.stopCachingImagesForAssets(assetsToStopCaching, + targetSize: cellSize, + contentMode: .AspectFill, + options: nil) + + self.previousPreheatRect = preheatRect + } + } + + private func computeDifferenceBetweenRect(oldRect: CGRect, andRect newRect: CGRect, removedHandler: CGRect->Void, addedHandler: CGRect->Void) { + if CGRectIntersectsRect(newRect, oldRect) { + let oldMaxY = CGRectGetMaxY(oldRect) + let oldMinY = CGRectGetMinY(oldRect) + let newMaxY = CGRectGetMaxY(newRect) + let newMinY = CGRectGetMinY(newRect) + if newMaxY > oldMaxY { + let rectToAdd = CGRectMake(newRect.origin.x, oldMaxY, newRect.size.width, (newMaxY - oldMaxY)) + addedHandler(rectToAdd) + } + if oldMinY > newMinY { + let rectToAdd = CGRectMake(newRect.origin.x, newMinY, newRect.size.width, (oldMinY - newMinY)) + addedHandler(rectToAdd) + } + if newMaxY < oldMaxY { + let rectToRemove = CGRectMake(newRect.origin.x, newMaxY, newRect.size.width, (oldMaxY - newMaxY)) + removedHandler(rectToRemove) + } + if oldMinY < newMinY { + let rectToRemove = CGRectMake(newRect.origin.x, oldMinY, newRect.size.width, (newMinY - oldMinY)) + removedHandler(rectToRemove) + } + } else { + addedHandler(newRect) + removedHandler(oldRect) + } + } + + private func assetsAtIndexPaths(indexPaths: [NSIndexPath]) -> [PHAsset] { + if indexPaths.count == 0 { return [] } + + var assets: [PHAsset] = [] + assets.reserveCapacity(indexPaths.count) + for indexPath in indexPaths { + let asset = self.images[indexPath.item] as! PHAsset + assets.append(asset) + } + return assets + } + +} + +internal extension UICollectionView { + func aapl_indexPathsForElementsInRect(rect: CGRect) -> [NSIndexPath] { + let allLayoutAttributes = self.collectionViewLayout.layoutAttributesForElementsInRect(rect) + if (allLayoutAttributes?.count ?? 0) == 0 {return []} + var indexPaths: [NSIndexPath] = [] + indexPaths.reserveCapacity(allLayoutAttributes!.count) + for layoutAttributes in allLayoutAttributes! { + let indexPath = layoutAttributes.indexPath + indexPaths.append(indexPath) + } + return indexPaths + } +} + +internal extension NSIndexSet { + func aapl_indexPathsFromIndexesWithSection(section: Int) -> [NSIndexPath] { + var indexPaths: [NSIndexPath] = [] + indexPaths.reserveCapacity(self.count) + self.enumerateIndexesUsingBlock {idx, stop in + indexPaths.append(NSIndexPath(forItem: idx, inSection: section)) + } + return indexPaths + } +} \ No newline at end of file diff --git a/Classes/FSAlbumView.xib b/Classes/FSAlbumView.xib new file mode 100644 index 00000000..22bbd014 --- /dev/null +++ b/Classes/FSAlbumView.xib @@ -0,0 +1,84 @@ + + + + + + + + + + + + + diff --git a/Classes/FSAlbumViewCell.swift b/Classes/FSAlbumViewCell.swift new file mode 100644 index 00000000..3d90882b --- /dev/null +++ b/Classes/FSAlbumViewCell.swift @@ -0,0 +1,23 @@ +// +// FSAlbumViewCell.swift +// Fusuma +// +// Created by Yuta Akizuki on 2015/11/14. +// Copyright © 2015年 ytakzk. All rights reserved. +// + +import UIKit +import Photos + +final class FSAlbumViewCell: UICollectionViewCell { + + @IBOutlet weak var imageView: UIImageView! + + var image: UIImage? { + + didSet { + + self.imageView.image = image + } + } +} diff --git a/Classes/FSAlbumViewCell.xib b/Classes/FSAlbumViewCell.xib new file mode 100644 index 00000000..3c207469 --- /dev/null +++ b/Classes/FSAlbumViewCell.xib @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Classes/FSCameraView.swift b/Classes/FSCameraView.swift new file mode 100644 index 00000000..21c4515b --- /dev/null +++ b/Classes/FSCameraView.swift @@ -0,0 +1,292 @@ +// +// FSCameraView.swift +// Fusuma +// +// Created by Yuta Akizuki on 2015/11/14. +// Copyright © 2015年 ytakzk. All rights reserved. +// + +import UIKit +import AVFoundation + +protocol FSCameraViewDelegate: class { + func cameraShotFinished(image: UIImage) +} + +final class FSCameraView: UIView, UIGestureRecognizerDelegate { + + @IBOutlet weak var previewViewContainer: UIView! + @IBOutlet weak var shotButton: UIButton! + @IBOutlet weak var flashButton: UIButton! + @IBOutlet weak var flipButton: UIButton! + + weak var delegate: FSCameraViewDelegate? = nil + + var session: AVCaptureSession? + var device: AVCaptureDevice? + var videoInput: AVCaptureDeviceInput? + var imageOutput: AVCaptureStillImageOutput? + var focusView: UIView? + + static func instance() -> FSCameraView { + + return UINib(nibName: "FSCameraView", bundle: nil).instantiateWithOwner(self, options: nil)[0] as! FSCameraView + } + + func initialize() { + + if session != nil { + + return + } + + self.backgroundColor = FSBackgroundColor + + self.hidden = false + + // AVCapture + session = AVCaptureSession() + + for device in AVCaptureDevice.devices() { + + if let device = device as? AVCaptureDevice where device.position == AVCaptureDevicePosition.Back { + + self.device = device + } + } + + do { + + if let session = session { + + videoInput = try AVCaptureDeviceInput(device: device) + + session.addInput(videoInput) + + imageOutput = AVCaptureStillImageOutput() + + session.addOutput(imageOutput) + + let videoLayer = AVCaptureVideoPreviewLayer(session: session) + videoLayer.frame = self.previewViewContainer.bounds + videoLayer.videoGravity = AVLayerVideoGravityResizeAspectFill + + self.previewViewContainer.layer.addSublayer(videoLayer) + + session.startRunning() + + } + + // Focus View + self.focusView = UIView(frame: CGRect(x: 0, y: 0, width: 90, height: 90)) + let tapRecognizer = UITapGestureRecognizer(target: self, action:Selector("focus:")) + tapRecognizer.delegate = self + self.previewViewContainer.addGestureRecognizer(tapRecognizer) + + } catch { + + + } + + flashButton.tintColor = UIColor.whiteColor() + flipButton.tintColor = UIColor.whiteColor() + shotButton.tintColor = UIColor.whiteColor() + + flashButton.setImage(UIImage(named: "ic_flash_off"), forState: .Normal) + flipButton.setImage(UIImage(named: "ic_loop"), forState: .Normal) + shotButton.setImage(UIImage(named: "ic_radio_button_checked"), forState: .Normal) + + NSNotificationCenter.defaultCenter().addObserver(self, selector: "willEnterForegroundNotification:", name: UIApplicationWillEnterForegroundNotification, object: nil) + } + + deinit { + + NSNotificationCenter.defaultCenter().removeObserver(self) + } + + func willEnterForegroundNotification(notification: NSNotification) { + + let status = AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo) + + if status == AVAuthorizationStatus.Authorized { + + session?.startRunning() + + } else if status == AVAuthorizationStatus.Denied || status == AVAuthorizationStatus.Restricted { + + session?.stopRunning() + } + } + + func focus(recognizer: UITapGestureRecognizer) { + + let point = recognizer.locationInView(self) + let viewsize = self.bounds.size + let newPoint = CGPoint(x: point.y/viewsize.height, y: 1.0-point.x/viewsize.width) + + let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) + + do { + + try device.lockForConfiguration() + + } catch _ { + + return + } + + if device.isFocusModeSupported(AVCaptureFocusMode.AutoFocus) == true { + + device.focusMode = AVCaptureFocusMode.AutoFocus + device.focusPointOfInterest = newPoint + } + + if device.isExposureModeSupported(AVCaptureExposureMode.ContinuousAutoExposure) == true { + + device.exposureMode = AVCaptureExposureMode.ContinuousAutoExposure + device.exposurePointOfInterest = newPoint + } + + device.unlockForConfiguration() + + self.focusView?.alpha = 0.0 + self.focusView?.center = point + self.focusView?.backgroundColor = UIColor.clearColor() + self.focusView?.layer.borderColor = UIColor.whiteColor().CGColor + self.focusView?.layer.borderWidth = 1.0 + self.focusView!.transform = CGAffineTransformMakeScale(1.0, 1.0) + self.addSubview(self.focusView!) + + UIView.animateWithDuration(0.8, delay: 0.0, usingSpringWithDamping: 0.8, + initialSpringVelocity: 3.0, options: UIViewAnimationOptions.CurveEaseIn, // UIViewAnimationOptions.BeginFromCurrentState + animations: { + self.focusView!.alpha = 1.0 + self.focusView!.transform = CGAffineTransformMakeScale(0.7, 0.7) + }, completion: {(finished) in + self.focusView!.transform = CGAffineTransformMakeScale(1.0, 1.0) + self.focusView!.removeFromSuperview() + }) + } + + @IBAction func shotButtonPressed(sender: UIButton) { + + guard let imageOutput = imageOutput else { + + return + } + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in + + let videoConnection = imageOutput.connectionWithMediaType(AVMediaTypeVideo) + + imageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: { (buffer, error) -> Void in + + self.session?.stopRunning() + + let data = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(buffer) + + if let image = UIImage(data: data), let delegate = self.delegate { + + // Image size + let iw = image.size.width + let ih = image.size.height + + // Frame size + let sw = self.previewViewContainer.frame.width + + // The center coordinate along Y axis + let rcy = ih*0.5 + + let imageRef = CGImageCreateWithImageInRect(image.CGImage, CGRect(x: rcy-iw*0.5, y: 0 , width: iw, height: iw)) + + let resizedImage = UIImage(CGImage: imageRef!, scale: sw/iw, orientation: image.imageOrientation) + + dispatch_async(dispatch_get_main_queue(), { () -> Void in + + delegate.cameraShotFinished(resizedImage) + + self.session = nil + self.device = nil + self.imageOutput = nil + + }) + } + + }) + + }) + } + + @IBAction func flipButtonPressed(sender: UIButton) { + + session?.stopRunning() + + do { + + session?.beginConfiguration() + + if let session = session { + + for input in session.inputs { + + session.removeInput(input as! AVCaptureInput) + } + + let position = (videoInput?.device.position == AVCaptureDevicePosition.Front) ? AVCaptureDevicePosition.Back : AVCaptureDevicePosition.Front + + for device in AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo) { + + if let device = device as? AVCaptureDevice where device.position == position { + + videoInput = try AVCaptureDeviceInput(device: device) + session.addInput(videoInput) + + } + } + + } + + session?.commitConfiguration() + + + } catch { + + } + + session?.startRunning() + } + + @IBAction func flashButtonPressed(sender: UIButton) { + + + do { + + if let device = device { + + try device.lockForConfiguration() + + let mode = device.flashMode + + if mode == AVCaptureFlashMode.Off { + + device.flashMode = AVCaptureFlashMode.On + flashButton.setImage(UIImage(named: "ic_flash_on"), forState: .Normal) + + } else if mode == AVCaptureFlashMode.On { + + device.flashMode = AVCaptureFlashMode.Off + flashButton.setImage(UIImage(named: "ic_flash_off"), forState: .Normal) + } + + device.unlockForConfiguration() + + } + + } catch _ { + + return + } + + } + +} diff --git a/Classes/FSCameraView.xib b/Classes/FSCameraView.xib new file mode 100644 index 00000000..c5ba1ff4 --- /dev/null +++ b/Classes/FSCameraView.xib @@ -0,0 +1,93 @@ + + + + + + + + + + + + + diff --git a/Classes/FSConstants.swift b/Classes/FSConstants.swift new file mode 100644 index 00000000..aac35b1d --- /dev/null +++ b/Classes/FSConstants.swift @@ -0,0 +1,41 @@ +// +// FSConstants.swift +// Fusuma +// +// Created by Yuta Akizuki on 2015/08/31. +// Copyright © 2015年 ytakzk. All rights reserved. +// + +import UIKit + +// Extension +internal extension UIColor { + + class func hex (var hexStr : NSString, alpha : CGFloat) -> UIColor { + + hexStr = hexStr.stringByReplacingOccurrencesOfString("#", withString: "") + let scanner = NSScanner(string: hexStr as String) + var color: UInt32 = 0 + if scanner.scanHexInt(&color) { + let r = CGFloat((color & 0xFF0000) >> 16) / 255.0 + let g = CGFloat((color & 0x00FF00) >> 8) / 255.0 + let b = CGFloat(color & 0x0000FF) / 255.0 + return UIColor(red:r,green:g,blue:b,alpha:alpha) + } else { + print("invalid hex string", terminator: "") + return UIColor.whiteColor() + } + } +} + +extension UIView { + + func addBottomBorder(color: UIColor, width: CGFloat) { + let border = CALayer() + border.borderColor = color.CGColor + border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: width) + border.borderWidth = width + self.layer.addSublayer(border) + } + +} \ No newline at end of file diff --git a/Classes/FSImageCropView.swift b/Classes/FSImageCropView.swift new file mode 100644 index 00000000..9ac02dc2 --- /dev/null +++ b/Classes/FSImageCropView.swift @@ -0,0 +1,174 @@ +// +// FZImageCropView.swift +// Fusuma +// +// Created by Yuta Akizuki on 2015/11/16. +// Copyright © 2015年 ytakzk. All rights reserved. +// + +import UIKit + +final class FSImageCropView: UIScrollView, UIScrollViewDelegate { + + var imageView = UIImageView() + + var imageSize: CGSize? + + var image: UIImage! = nil { + + didSet { + + if image != nil { + + if !imageView.isDescendantOfView(self) { + self.imageView.alpha = 1.0 + self.addSubview(imageView) + } + + } else { + + imageView.image = nil + return + } + + let imageSize = self.imageSize ?? image.size + + if imageSize.width < self.frame.width || imageSize.height < self.frame.height { + + // The width or height of the image is smaller than the frame size + + if imageSize.width > imageSize.height { + + // Width > Height + + let ratio = self.frame.width / imageSize.width + + imageView.frame = CGRect( + origin: CGPointZero, + size: CGSize(width: self.frame.width, height: imageSize.height * ratio) + ) + + } else { + + // Width <= Height + + let ratio = self.frame.height / imageSize.height + + imageView.frame = CGRect( + origin: CGPointZero, + size: CGSize(width: imageSize.width * ratio, height: self.frame.size.height) + ) + + } + + imageView.center = self.center + + } else { + + // The width or height of the image is bigger than the frame size + + if imageSize.width > imageSize.height { + + // Width > Height + + let ratio = self.frame.height / imageSize.height + + imageView.frame = CGRect( + origin: CGPointZero, + size: CGSize(width: imageSize.width * ratio, height: self.frame.height) + ) + + } else { + + // Width <= Height + + let ratio = self.frame.width / imageSize.width + + imageView.frame = CGRect( + origin: CGPointZero, + size: CGSize(width: self.frame.width, height: imageSize.height * ratio) + ) + + } + + self.contentOffset = CGPoint( + x: imageView.center.x - self.center.x, + y: imageView.center.y - self.center.y + ) + } + + self.contentSize = CGSize(width: imageView.frame.width + 1, height: imageView.frame.height + 1) + + imageView.image = image + + self.zoomScale = 1.0 + + } + + } + + required init?(coder aDecoder: NSCoder) { + + super.init(coder: aDecoder)! + + self.backgroundColor = FSBackgroundColor + self.frame.size = CGSizeZero + self.clipsToBounds = true + self.imageView.alpha = 0.0 + + imageView.frame = CGRect(origin: CGPointZero, size: CGSizeZero) + + self.maximumZoomScale = 2.0 + self.minimumZoomScale = 0.8 + self.showsHorizontalScrollIndicator = false + self.showsVerticalScrollIndicator = false + self.bouncesZoom = true + self.bounces = true + + self.delegate = self + } + + + func changeScrollable(isScrollable: Bool) { + + self.scrollEnabled = isScrollable + } + + // MARK: UIScrollViewDelegate Protocol + func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? { + + return imageView + + } + + func scrollViewDidZoom(scrollView: UIScrollView) { + + let boundsSize = scrollView.bounds.size + var contentsFrame = imageView.frame + + if contentsFrame.size.width < boundsSize.width { + + contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2.0 + + } else { + contentsFrame.origin.x = 0.0 + } + + if contentsFrame.size.height < boundsSize.height { + + contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2.0 + } else { + + contentsFrame.origin.y = 0.0 + } + + imageView.frame = contentsFrame + + } + + func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView?, atScale scale: CGFloat) { + + self.contentSize = CGSize(width: imageView.frame.width + 1, height: imageView.frame.height + 1) + } + +} \ No newline at end of file diff --git a/Classes/Fusuma.swift b/Classes/Fusuma.swift new file mode 100644 index 00000000..81354a74 --- /dev/null +++ b/Classes/Fusuma.swift @@ -0,0 +1,215 @@ +// +// Fusuma.swift +// Fusuma +// +// Created by Yuta Akizuki on 2015/11/14. +// Copyright © 2015年 ytakzk. All rights reserved. +// + +import UIKit + +public protocol FusumaDelegate: class { + func fusumaImageSelected(image: UIImage) + func fusumaCameraRollUnauthorized() + +} + +public var FSTintColor = UIColor.hex("#009688", alpha: 1.0) +public var FSBackgroundColor = UIColor.hex("#212121", alpha: 1.0) + +public final class Fusuma: UIViewController, FSCameraViewDelegate, FSAlbumViewDelegate { + + enum Mode { + case Camera + case Library + } + + var mode: Mode? + var willFilter = true + + @IBOutlet weak var photoLibraryViewerContainer: UIView! + @IBOutlet weak var cameraShotContainer: UIView! + + @IBOutlet weak var titleLabel: UILabel! + @IBOutlet weak var menuView: UIView! + @IBOutlet weak var closeButton: UIButton! + @IBOutlet weak var libraryButton: UIButton! + @IBOutlet weak var cameraButton: UIButton! + @IBOutlet weak var doneButton: UIButton! + + var albumView = FSAlbumView.instance() + var cameraView = FSCameraView.instance() + + weak var delegate: FusumaDelegate? = nil + + override public func viewDidLoad() { + super.viewDidLoad() + + self.view.backgroundColor = FSBackgroundColor + + cameraView.delegate = self + albumView.delegate = self + + menuView.backgroundColor = FSBackgroundColor + menuView.addBottomBorder(UIColor.blackColor(), width: 1.0) + + libraryButton.setImage(UIImage(named: "ic_insert_photo"), forState: .Normal) + libraryButton.setImage(UIImage(named: "ic_insert_photo"), forState: .Highlighted) + libraryButton.setImage(UIImage(named: "ic_insert_photo"), forState: .Selected) + + cameraButton.setImage(UIImage(named: "ic_photo_camera"), forState: .Normal) + cameraButton.setImage(UIImage(named: "ic_photo_camera"), forState: .Highlighted) + cameraButton.setImage(UIImage(named: "ic_photo_camera"), forState: .Selected) + + closeButton.tintColor = UIColor.whiteColor() + + libraryButton.tintColor = FSTintColor + cameraButton.tintColor = FSTintColor + + cameraButton.adjustsImageWhenHighlighted = false + libraryButton.adjustsImageWhenHighlighted = false + cameraButton.clipsToBounds = true + libraryButton.clipsToBounds = true + + changeMode(Mode.Library) + + photoLibraryViewerContainer.addSubview(albumView) + cameraShotContainer.addSubview(cameraView) + + doneButton.setImage(UIImage(named: "ic_check"), forState: .Normal) + doneButton.tintColor = UIColor.whiteColor() + } + + override public func viewWillAppear(animated: Bool) { + super.viewWillAppear(animated) + + } + + override public func viewDidAppear(animated: Bool) { + super.viewDidAppear(animated) + + albumView.frame = CGRect(origin: CGPointZero, size: photoLibraryViewerContainer.frame.size) + albumView.layoutIfNeeded() + cameraView.frame = CGRect(origin: CGPointZero, size: cameraShotContainer.frame.size) + cameraView.layoutIfNeeded() + + albumView.initialize() + cameraView.initialize() + } + + override public func prefersStatusBarHidden() -> Bool { + + return true + } + + @IBAction func closeButtonPressed(sender: UIButton) { + + self.dismissViewControllerAnimated(true, completion: nil) + } + + @IBAction func libraryButtonPressed(sender: UIButton) { + + changeMode(Mode.Library) + } + + @IBAction func photoButtonPressed(sender: UIButton) { + + changeMode(Mode.Camera) + } + + @IBAction func doneButtonPressed(sender: UIButton) { + + let view = albumView.imageCropView + + UIGraphicsBeginImageContextWithOptions(view.frame.size, true, 0) + let context = UIGraphicsGetCurrentContext() + CGContextTranslateCTM(context, -albumView.imageCropView.contentOffset.x, -albumView.imageCropView.contentOffset.y) + view.layer.renderInContext(context!) + let image = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + + delegate?.fusumaImageSelected(image) + self.dismissViewControllerAnimated(true, completion: nil) + } + + func changeMode(mode: Mode) { + + if self.mode == mode { + + return + } + + self.mode = mode + + dishighlightButtons() + + if mode == Mode.Library { + + titleLabel.text = "CAMERA ROLL" + doneButton.hidden = false + + highlightButton(libraryButton) + self.view.insertSubview(photoLibraryViewerContainer, aboveSubview: cameraShotContainer) + + } else { + + titleLabel.text = "PHOTO" + doneButton.hidden = true + + highlightButton(cameraButton) + self.view.insertSubview(cameraShotContainer, aboveSubview: photoLibraryViewerContainer) + } + } + + + func dishighlightButtons() { + + cameraButton.tintColor = UIColor.whiteColor() + libraryButton.tintColor = UIColor.whiteColor() + + if cameraButton.layer.sublayers?.count > 1 { + + for layer in cameraButton.layer.sublayers! { + + if let borderColor = layer.borderColor where UIColor(CGColor: borderColor) == FSTintColor { + + layer.removeFromSuperlayer() + } + + } + } + + if libraryButton.layer.sublayers?.count > 1 { + + for layer in libraryButton.layer.sublayers! { + + if let borderColor = layer.borderColor where UIColor(CGColor: borderColor) == FSTintColor { + + layer.removeFromSuperlayer() + } + + } + } + + } + + func highlightButton(button: UIButton) { + + button.tintColor = FSTintColor + + button.addBottomBorder(FSTintColor, width: 3) + } + + // MARK: FSCameraViewDelegate + func cameraShotFinished(image: UIImage) { + + delegate?.fusumaImageSelected(image) + self.dismissViewControllerAnimated(true, completion: nil) + } + + // MARK: FSAlbumViewDelegate + func albumViewCameraRollUnauthorized() { + + delegate?.fusumaCameraRollUnauthorized() + } +} \ No newline at end of file diff --git a/Classes/Fusuma.xib b/Classes/Fusuma.xib new file mode 100644 index 00000000..2216e18a --- /dev/null +++ b/Classes/Fusuma.xib @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/Fusuma.xcodeproj/project.pbxproj b/Example/Fusuma.xcodeproj/project.pbxproj index fedf9889..02dbd402 100644 --- a/Example/Fusuma.xcodeproj/project.pbxproj +++ b/Example/Fusuma.xcodeproj/project.pbxproj @@ -7,6 +7,17 @@ objects = { /* Begin PBXBuildFile section */ + 5285CC3D1C5E319E0070B639 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5285CC3C1C5E319E0070B639 /* Assets.xcassets */; }; + 5293687A1C5E2DE600370B6C /* FSAlbumView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 529368701C5E2DE600370B6C /* FSAlbumView.swift */; }; + 5293687B1C5E2DE600370B6C /* FSAlbumView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 529368711C5E2DE600370B6C /* FSAlbumView.xib */; }; + 5293687C1C5E2DE600370B6C /* FSAlbumViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 529368721C5E2DE600370B6C /* FSAlbumViewCell.swift */; }; + 5293687D1C5E2DE600370B6C /* FSAlbumViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 529368731C5E2DE600370B6C /* FSAlbumViewCell.xib */; }; + 5293687E1C5E2DE600370B6C /* FSCameraView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 529368741C5E2DE600370B6C /* FSCameraView.swift */; }; + 5293687F1C5E2DE600370B6C /* FSCameraView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 529368751C5E2DE600370B6C /* FSCameraView.xib */; }; + 529368801C5E2DE600370B6C /* FSConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 529368761C5E2DE600370B6C /* FSConstants.swift */; }; + 529368811C5E2DE600370B6C /* FSImageCropView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 529368771C5E2DE600370B6C /* FSImageCropView.swift */; }; + 529368821C5E2DE600370B6C /* Fusuma.swift in Sources */ = {isa = PBXBuildFile; fileRef = 529368781C5E2DE600370B6C /* Fusuma.swift */; }; + 529368831C5E2DE600370B6C /* Fusuma.xib in Resources */ = {isa = PBXBuildFile; fileRef = 529368791C5E2DE600370B6C /* Fusuma.xib */; }; 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; @@ -33,6 +44,17 @@ 3A41D50C0796FDBA21A7D391 /* Fusuma.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Fusuma.podspec; path = ../Fusuma.podspec; sourceTree = ""; }; 3F0C6EA79F7B2F5497CCFB5D /* Pods-Fusuma_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Fusuma_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example.debug.xcconfig"; sourceTree = ""; }; 438EEAF066FAD18D591BBD1B /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; + 5285CC3C1C5E319E0070B639 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 529368701C5E2DE600370B6C /* FSAlbumView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FSAlbumView.swift; sourceTree = ""; }; + 529368711C5E2DE600370B6C /* FSAlbumView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FSAlbumView.xib; sourceTree = ""; }; + 529368721C5E2DE600370B6C /* FSAlbumViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FSAlbumViewCell.swift; sourceTree = ""; }; + 529368731C5E2DE600370B6C /* FSAlbumViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FSAlbumViewCell.xib; sourceTree = ""; }; + 529368741C5E2DE600370B6C /* FSCameraView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FSCameraView.swift; sourceTree = ""; }; + 529368751C5E2DE600370B6C /* FSCameraView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FSCameraView.xib; sourceTree = ""; }; + 529368761C5E2DE600370B6C /* FSConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FSConstants.swift; sourceTree = ""; }; + 529368771C5E2DE600370B6C /* FSImageCropView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FSImageCropView.swift; sourceTree = ""; }; + 529368781C5E2DE600370B6C /* Fusuma.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Fusuma.swift; sourceTree = ""; }; + 529368791C5E2DE600370B6C /* Fusuma.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = Fusuma.xib; sourceTree = ""; }; 556A7EC85EF582AB1B371A93 /* Pods_Fusuma_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Fusuma_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 607FACD01AFB9204008FA782 /* Fusuma_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Fusuma_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -69,6 +91,25 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 5293686F1C5E2DC100370B6C /* Classes */ = { + isa = PBXGroup; + children = ( + 529368701C5E2DE600370B6C /* FSAlbumView.swift */, + 529368711C5E2DE600370B6C /* FSAlbumView.xib */, + 529368721C5E2DE600370B6C /* FSAlbumViewCell.swift */, + 529368731C5E2DE600370B6C /* FSAlbumViewCell.xib */, + 529368741C5E2DE600370B6C /* FSCameraView.swift */, + 529368751C5E2DE600370B6C /* FSCameraView.xib */, + 529368761C5E2DE600370B6C /* FSConstants.swift */, + 529368771C5E2DE600370B6C /* FSImageCropView.swift */, + 529368781C5E2DE600370B6C /* Fusuma.swift */, + 529368791C5E2DE600370B6C /* Fusuma.xib */, + 5285CC3C1C5E319E0070B639 /* Assets.xcassets */, + ); + name = Classes; + path = ../Classes; + sourceTree = ""; + }; 58DBA25892D73B58D5E2FE56 /* Pods */ = { isa = PBXGroup; children = ( @@ -83,8 +124,9 @@ 607FACC71AFB9204008FA782 = { isa = PBXGroup; children = ( + 5293686F1C5E2DC100370B6C /* Classes */, 607FACF51AFB993E008FA782 /* Podspec Metadata */, - 607FACD21AFB9204008FA782 /* Example for Fusuma */, + 607FACD21AFB9204008FA782 /* Example */, 607FACE81AFB9204008FA782 /* Tests */, 607FACD11AFB9204008FA782 /* Products */, 58DBA25892D73B58D5E2FE56 /* Pods */, @@ -101,7 +143,7 @@ name = Products; sourceTree = ""; }; - 607FACD21AFB9204008FA782 /* Example for Fusuma */ = { + 607FACD21AFB9204008FA782 /* Example */ = { isa = PBXGroup; children = ( 607FACD51AFB9204008FA782 /* AppDelegate.swift */, @@ -111,7 +153,7 @@ 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, 607FACD31AFB9204008FA782 /* Supporting Files */, ); - name = "Example for Fusuma"; + name = Example; path = Fusuma; sourceTree = ""; }; @@ -246,7 +288,12 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 5293687F1C5E2DE600370B6C /* FSCameraView.xib in Resources */, + 529368831C5E2DE600370B6C /* Fusuma.xib in Resources */, + 5285CC3D1C5E319E0070B639 /* Assets.xcassets in Resources */, + 5293687D1C5E2DE600370B6C /* FSAlbumViewCell.xib in Resources */, 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */, + 5293687B1C5E2DE600370B6C /* FSAlbumView.xib in Resources */, 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */, ); @@ -359,8 +406,14 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 529368821C5E2DE600370B6C /* Fusuma.swift in Sources */, 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */, + 5293687E1C5E2DE600370B6C /* FSCameraView.swift in Sources */, + 5293687C1C5E2DE600370B6C /* FSAlbumViewCell.swift in Sources */, + 5293687A1C5E2DE600370B6C /* FSAlbumView.swift in Sources */, + 529368801C5E2DE600370B6C /* FSConstants.swift in Sources */, 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, + 529368811C5E2DE600370B6C /* FSImageCropView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -490,6 +543,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; INFOPLIST_FILE = Fusuma/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MODULE_NAME = ExampleApp; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; @@ -503,6 +557,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; INFOPLIST_FILE = Fusuma/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MODULE_NAME = ExampleApp; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; diff --git a/Example/Fusuma.xcworkspace/contents.xcworkspacedata b/Example/Fusuma.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..9bb4c823 --- /dev/null +++ b/Example/Fusuma.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Example/Fusuma/Base.lproj/LaunchScreen.xib b/Example/Fusuma/Base.lproj/LaunchScreen.xib index d9b82952..5d9637ec 100644 --- a/Example/Fusuma/Base.lproj/LaunchScreen.xib +++ b/Example/Fusuma/Base.lproj/LaunchScreen.xib @@ -1,8 +1,8 @@ - + - - + + @@ -12,26 +12,29 @@ - - + - - + + - diff --git a/Example/Fusuma/Base.lproj/Main.storyboard b/Example/Fusuma/Base.lproj/Main.storyboard index 52ea29eb..b46df3d3 100644 --- a/Example/Fusuma/Base.lproj/Main.storyboard +++ b/Example/Fusuma/Base.lproj/Main.storyboard @@ -1,13 +1,14 @@ - + - + + - + @@ -15,11 +16,45 @@ - + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/Fusuma/Images.xcassets/AppIcon.appiconset/Contents.json b/Example/Fusuma/Images.xcassets/AppIcon.appiconset/Contents.json index d3942e94..c64ff0d4 100644 --- a/Example/Fusuma/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Example/Fusuma/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,38 +1,86 @@ { "images" : [ { - "idiom" : "iphone", "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-Small@2x.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-Small@3x.png", "scale" : "3x" }, { - "idiom" : "iphone", "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-40@2x.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-40@3x.png", "scale" : "3x" }, { - "idiom" : "iphone", "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@2x.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@3x.png", "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-Small.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-Small@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-40.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-83.5@2x.png", + "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } -} +} \ No newline at end of file diff --git a/Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-40.png b/Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-40.png new file mode 100644 index 0000000000000000000000000000000000000000..ba5fff975b105abd300d390a22024b839302dfd8 GIT binary patch literal 994 zcmV<810DQ{P)5yS_l1FF=g;r6 zGdsWES3LjR%Z7C<`CkLnQwuPvT7Xg20*tEIS}Y=!L?CM384TLfk=Kq4D1>0?&%ZFb z7DhmcCXrGGecICv zL5BvEQcx z+b+`8^#a-5JFqN^a=FBdFJ;KR_YPWXjPap?;Q83tDDBU*^V|J7EGt2|TxRCd73SxE zCzVQuf)w@4f)E1Nap~CfEI<78E$MV;O@HOMDvo2}cnkWP2vI1ZlY;kq84=V6RN2!T?HSj=xqDTELhV`|1ajzc=#$<}RK zShnrpBc7yCM=bDn${2%EDpD5I`GaRwbo~ zfC1=A006BGQVQng<~ejA$Ito8bhK{*;PWp|u&a9~Uw?CoOr|RsTUnzKHC0LcT>;xJ zGJJ4^8`p1gdg3H^?&Z02FVE?Tliav|li`CS*me;iXgVJ@m8d;W6N@RPr!F!xJHuC} zzU18_!$JSy+%Q7G;oSR7PhDhi=nY)g3wE&)MXJU5*=uyPZ)R|)AJ6k@+Tc(>9qpUR z&t8iXV*Q(iNPyiv+gV(C!1;5ND5YxJ`E!#jETXL}^Trv5>tB*qwe`}UIU$@0O` zag2fffnES6znkX6(Q&dpS$g~SuB0c~)J16uPzZt6hEyuanX?ldI*{YY$Wg{W^3%-X z(nEH2@8rzciJ+uODV{!Hb%091Os0z;FI{+IqOQKZjY5V3H2AwFgur#(m1^MET&?|- zvv2Hl5o{tdMNqpAfMRV~1%TK9ne0MS9HKbNo= Q(*OVf07*qoM6N<$f+AVn;Q#;t literal 0 HcmV?d00001 diff --git a/Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png b/Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5729f99522a2080bfcada382baca92a2b6206c55 GIT binary patch literal 1940 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 K!mvi)E&hLfwb+6H literal 0 HcmV?d00001 diff --git a/Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png b/Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a539d34de7e9ecebc0503607380334b0ad1ff81a GIT binary patch literal 3013 zcmb_e^DPN8vEPl&lOrhYT!2rMWD1zZ~4dPd_pjp^?T+;|xD z-x`B9i(g(Fg8mZN_6AcF4II z;Nf?3jaH`Wspa*Al($t?o!CNyz?=$kLcIA{c~euW@a3vWP3sPwAMv>OG2*unobgLn z*MZg_NQZpFzH>T3IX*e*Mm+w8`z;=?IF1b5YjJ8P9__WCwC-!AzbS93NZoabQT%mz z93X(#1F<6Uw6DHL;c8OQsOlPA(W34dRa2L5pkERU78;mV^xai+y!lX6T#ZK=8Xa9L zn_v1NKzKK6H6%)|KsTo+HX4K=$07{$Wcpv2wzod7%&rl^m@GG+Z`QnkswDTAvB9an zq+{UBa5)DPu+Cz__o#wU0ymG&GLMHM`%~dGAW9Egxx|rz!>zv-;pu-*9Wi0%N*G5d zMHyp$O~Y($ZELr>xI7?rmb$NncxWDGn-A2aMgE$hKFUt z*rfxzI(>7MAWFt|0yj6dw0HmQ*UlYT7;8#8+ENXiDuwzi;NWIb&cS_>oU#=XL=0qo zs}Eu}`(tNkozP4D&ba{@3YW|=`*YH4bI6*4%ab!r zJG-pu>{OLC_ndIto)$AcT)|VSB_cxMJ()i=^cg{Q4!y2^&0f~QL{BHDavw$GTI288 zJNUJq`m%Tuftkjd+u2E`=BT8PtYy@Pie93cwxfi+2g}=H2=0Q$rg6I9gSQ`wU)pz8 za+}%Z`t8x3!mpRqamhnZ{nxfJ+_kIw zkn*vsN*I;fYJHvbQqBQ9y5Y`?ky4pbg%)+dVuAL--?!SEIImJ8l~veiXbsA#&waEz zvWFbipAPqY{z!s7c~TuDApPupwJ$S?Bp4b-y7J*Vxe)#LR9KKeQr_&71>&*J_n}X@ zH}XFwelWs(4IeGqs?5{S(E0NMLK`E}Eh;xiq#hOX=x92QXgaezC%o#T;+}4Br8U%y zk>b5@Q{8^5>M7Cn!9j1L_cB}!ZdkCe;6nJpAxIK*n#DbTRD7x2mB`o?qRqfM1b+}p z4HeR-<5~#Rbi{r(_xCrKQOy}pUY_G9WHxrhp3f%fq#uS>isilTYod_YOAeV%71#T4(7z)~3E;Li)<^{L4SeY-ugSlS#|xkgc9O?fyq^Q%a<$fSx`=Li>_#vIu{Lx_?zeEja2-&&gy9Z zM)gV5YTV`p5fLL!9qk?ZOj4nH;gSk8z%avTU@|Rr6zlDTMq513@B`OBkYjM4_qEa@wJc0cuX8&`@@isZ zStcbeKX@5f<+pmC(>jHIgETfavZdiuUL9QAdPPL=WpKz=bcZ<&7r2aE^hPy)+?C== zaVOrYvPA*90hzRClyyBe!{tP}_R);ISQ{vE2Oz%~-|ImB5V7zc55U7aW3i-5p#&0A9B{b=P~e`v9-MgqjX+y*>L)WBV6J~-HW5zAxS+5Rv9t2}@U z@_ZONWuElRcQZq(IX)rod$a9*p`m3-X2po(p6!5Lkxa0sJr@L`$Oc!+Qw=EnF);QqIVBbZ=5 z+Brch_@9UU(rVwjSA2Z^jZJvl?pp_OOiX0ia*)*J$c3&F^655&$=Ts6(n2F+*Nffe zPU^n-T1(AFFuNbE01EJPdv;C5g>d^;ep!PuJ&Sk32C+@-KkvtTTbgu?=K6#&| znWh2W*v*HKes6K25jVT7?tMGEpL=EP-sF$N%=C*yqUN#lNq{=8$W$tG-S-jf=w8C^ zwXf7hRFtq!?y+0_2+UZnV#urrw&oe!XKYIyGRN~gaLZ)8Wz7T4%J5s7M3p~c!K*5T zrlnLZ<}6b!HbUGUC;JI!DK(qE9?=JP`~`g~%s34_f7_3KXQ{+MNyPR+4q(oYR1D(I zdyDB;>reM0du*&7I+V z8}sw?-xN(cf~BA6b|{(vmMreVAsjZXujO)l8P(5p0!0uoDkJah@!KJC9z&bl(_>AQ z8{IRHe{cVo?aG^wS2!<7i3|W01k)NUy)&6^@4A~LaHc@$sMEz?VZLz~)cHc}M1Of7 zQ2b?OW-4KmZJ5Z36)V4j7Zoi-&%LoSM0Cf4A&URD68*osoysf4&p&B|`f38@IR)6r K!mvi)E&hLfwb+6H literal 0 HcmV?d00001 diff --git a/Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png b/Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6cb2699866ee631bc131a6616b522bc595317878 GIT binary patch literal 4896 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 A^Z)<= literal 0 HcmV?d00001 diff --git a/Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-76.png b/Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-76.png new file mode 100644 index 0000000000000000000000000000000000000000..0cd04978a0a751141e2bc3d84a6d4c5163029a6f GIT binary patch literal 1867 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 literal 0 HcmV?d00001 diff --git a/Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-83.5@2x.png b/Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4abb40ab7eb85959941edd77d047c899f940f134 GIT binary patch literal 4371 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 IOwSGTKh~r$p8x;= literal 0 HcmV?d00001 diff --git a/Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-Small.png b/Example/Fusuma/Images.xcassets/AppIcon.appiconset/Icon-Small.png new file mode 100644 index 0000000000000000000000000000000000000000..3651e80f507a0db25884c5981e5424617359a38f GIT binary patch literal 742 zcmVUm1%j=FsEvzOE)3j+ zseK5N1?j@&d-{|%My`eMT^VC}ZJ*c!KYpdV!Jnz>AwoNc}0ImFk3qpku2q92PA*E#bTbiol$0#p9 zh}H%v1&fPcnVbDYBoanzjb&LFV=yLvC+39;A@Dp!W__J-B+TmS8W-x%&_D2uNF=w=0wpEbwv`twa+!k=0msGh3C;#KQ5qX!B;rZrhR(8zx4utvFbE;&?&_hXwTZs|UOKK_p|8J} zmewY^yLu2p0RCo&FQ{c%0DPWbpe@#n>$;>;%ebyfTdbMS^9$Q_e*~&j_C1eQRxms? zisLwxl|^wJhvA`7j#gG|(-jM!jwCR~@UZJXjSVrbciiG)<9Xh{`^cNuW4!w?w9y*E z*KS2ms+2~EtiRUQRWmj|$WkiBlgGU*rBaNI4^mrKjn-M6@?nPsPnxy0?RlLzS;Nbb z=R34p-?P{N$O$#Z5DEpEnVw_t#VcxRk7JD4bSeW_Qlhj*z^3yEA(&3gGBZ6#C=}eC z4Z?Qs4TgdRGv69(t7}EQH}CZtW3X)t#|iIhUWOy#-=8u+!G#v*3O@<{KYyfs=)VX3 Y0U5?GP)%xfo|4^Fdfo>Icg)=E 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 Re!UR@Gb1ZQs=n)!{{k}qDzX3o literal 0 HcmV?d00001 diff --git a/Example/Fusuma/Images.xcassets/Contents.json b/Example/Fusuma/Images.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/Example/Fusuma/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/Fusuma/Info.plist b/Example/Fusuma/Info.plist index eb18faac..212a7cd1 100644 --- a/Example/Fusuma/Info.plist +++ b/Example/Fusuma/Info.plist @@ -11,7 +11,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - $(PRODUCT_NAME) + Fusuma CFBundlePackageType APPL CFBundleShortVersionString diff --git a/Example/Fusuma/ViewController.swift b/Example/Fusuma/ViewController.swift index d656bde4..ab41f78c 100644 --- a/Example/Fusuma/ViewController.swift +++ b/Example/Fusuma/ViewController.swift @@ -8,11 +8,16 @@ import UIKit -class ViewController: UIViewController { +class ViewController: UIViewController, FusumaDelegate { + + @IBOutlet weak var imageView: UIImageView! + + @IBOutlet weak var showButton: UIButton! override func viewDidLoad() { super.viewDidLoad() - // Do any additional setup after loading the view, typically from a nib. + + showButton.layer.cornerRadius = 2.0 } override func didReceiveMemoryWarning() { @@ -20,5 +25,41 @@ class ViewController: UIViewController { // Dispose of any resources that can be recreated. } + @IBAction func showButtonPressed(sender: UIButton) { + + // Show Fusuma + let fusuma = Fusuma() + fusuma.delegate = self + self.presentViewController(fusuma, animated: true, completion: nil) + + } + + // MARK: FusumaDelegate Protocol + func fusumaImageSelected(image: UIImage) { + + print("Image selected") + imageView.image = image + } + + func fusumaCameraRollUnauthorized() { + + print("Camera roll unauthorized") + + let alert = UIAlertController(title: "Access Requested", message: "Saving image needs to access your photo album", preferredStyle: .Alert) + + alert.addAction(UIAlertAction(title: "Settings", style: .Default, handler: { (action) -> Void in + + if let url = NSURL(string:UIApplicationOpenSettingsURLString) { + UIApplication.sharedApplication().openURL(url) + } + + })) + + alert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: { (action) -> Void in + + })) + + self.presentViewController(alert, animated: true, completion: nil) + } } diff --git a/Example/Podfile.lock b/Example/Podfile.lock new file mode 100644 index 00000000..77a1605b --- /dev/null +++ b/Example/Podfile.lock @@ -0,0 +1,21 @@ +PODS: + - FBSnapshotTestCase (2.0.7): + - FBSnapshotTestCase/SwiftSupport (= 2.0.7) + - FBSnapshotTestCase/Core (2.0.7) + - FBSnapshotTestCase/SwiftSupport (2.0.7): + - FBSnapshotTestCase/Core + - Fusuma (0.1.0) + +DEPENDENCIES: + - FBSnapshotTestCase + - Fusuma (from `../`) + +EXTERNAL SOURCES: + Fusuma: + :path: "../" + +SPEC CHECKSUMS: + FBSnapshotTestCase: 7e85180d0d141a0cf472352edda7e80d7eaeb547 + Fusuma: 370927b809138b8b5e3858a635a2e110eebba885 + +COCOAPODS: 0.39.0 diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase.modulemap b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase.modulemap new file mode 100644 index 00000000..733e78b2 --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase.modulemap @@ -0,0 +1,15 @@ +framework module FBSnapshotTestCase { + umbrella header "FBSnapshotTestCase.h" + + export * + module * { export * } + + header "FBSnapshotTestCase.h" + header "FBSnapshotTestCasePlatform.h" + header "FBSnapshotTestController.h" + + private header "UIImage+Compare.h" + private header "UIImage+Diff.h" + private header "UIImage+Snapshot.h" +} + diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.h b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.h new file mode 100644 index 00000000..9091d62a --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.h @@ -0,0 +1,37 @@ +// +// Created by Gabriel Handford on 3/1/09. +// Copyright 2009-2013. All rights reserved. +// Created by John Boiles on 10/20/11. +// Copyright (c) 2011. All rights reserved +// Modified by Felix Schulze on 2/11/13. +// Copyright 2013. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// + +#import + +@interface UIImage (Compare) + +- (BOOL)fb_compareWithImage:(UIImage *)image tolerance:(CGFloat)tolerance; + +@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.m b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.m new file mode 100644 index 00000000..c997f578 --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.m @@ -0,0 +1,134 @@ +// +// Created by Gabriel Handford on 3/1/09. +// Copyright 2009-2013. All rights reserved. +// Created by John Boiles on 10/20/11. +// Copyright (c) 2011. All rights reserved +// Modified by Felix Schulze on 2/11/13. +// Copyright 2013. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// + +#import + +// This makes debugging much more fun +typedef union { + uint32_t raw; + unsigned char bytes[4]; + struct { + char red; + char green; + char blue; + char alpha; + } __attribute__ ((packed)) pixels; +} FBComparePixel; + +@implementation UIImage (Compare) + +- (BOOL)fb_compareWithImage:(UIImage *)image tolerance:(CGFloat)tolerance +{ + NSAssert(CGSizeEqualToSize(self.size, image.size), @"Images must be same size."); + + CGSize referenceImageSize = CGSizeMake(CGImageGetWidth(self.CGImage), CGImageGetHeight(self.CGImage)); + CGSize imageSize = CGSizeMake(CGImageGetWidth(image.CGImage), CGImageGetHeight(image.CGImage)); + + // The images have the equal size, so we could use the smallest amount of bytes because of byte padding + size_t minBytesPerRow = MIN(CGImageGetBytesPerRow(self.CGImage), CGImageGetBytesPerRow(image.CGImage)); + size_t referenceImageSizeBytes = referenceImageSize.height * minBytesPerRow; + void *referenceImagePixels = calloc(1, referenceImageSizeBytes); + void *imagePixels = calloc(1, referenceImageSizeBytes); + + if (!referenceImagePixels || !imagePixels) { + free(referenceImagePixels); + free(imagePixels); + return NO; + } + + CGContextRef referenceImageContext = CGBitmapContextCreate(referenceImagePixels, + referenceImageSize.width, + referenceImageSize.height, + CGImageGetBitsPerComponent(self.CGImage), + minBytesPerRow, + CGImageGetColorSpace(self.CGImage), + (CGBitmapInfo)kCGImageAlphaPremultipliedLast + ); + CGContextRef imageContext = CGBitmapContextCreate(imagePixels, + imageSize.width, + imageSize.height, + CGImageGetBitsPerComponent(image.CGImage), + minBytesPerRow, + CGImageGetColorSpace(image.CGImage), + (CGBitmapInfo)kCGImageAlphaPremultipliedLast + ); + + if (!referenceImageContext || !imageContext) { + CGContextRelease(referenceImageContext); + CGContextRelease(imageContext); + free(referenceImagePixels); + free(imagePixels); + return NO; + } + + CGContextDrawImage(referenceImageContext, CGRectMake(0, 0, referenceImageSize.width, referenceImageSize.height), self.CGImage); + CGContextDrawImage(imageContext, CGRectMake(0, 0, imageSize.width, imageSize.height), image.CGImage); + + CGContextRelease(referenceImageContext); + CGContextRelease(imageContext); + + BOOL imageEqual = YES; + + // Do a fast compare if we can + if (tolerance == 0) { + imageEqual = (memcmp(referenceImagePixels, imagePixels, referenceImageSizeBytes) == 0); + } else { + // Go through each pixel in turn and see if it is different + const NSInteger pixelCount = referenceImageSize.width * referenceImageSize.height; + + FBComparePixel *p1 = referenceImagePixels; + FBComparePixel *p2 = imagePixels; + + NSInteger numDiffPixels = 0; + for (int n = 0; n < pixelCount; ++n) { + // If this pixel is different, increment the pixel diff count and see + // if we have hit our limit. + if (p1->raw != p2->raw) { + numDiffPixels ++; + + CGFloat percent = (CGFloat)numDiffPixels / pixelCount; + if (percent > tolerance) { + imageEqual = NO; + break; + } + } + + p1++; + p2++; + } + } + + free(referenceImagePixels); + free(imagePixels); + + return imageEqual; +} + +@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.h b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.h new file mode 100644 index 00000000..a0863f30 --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.h @@ -0,0 +1,37 @@ +// +// Created by Gabriel Handford on 3/1/09. +// Copyright 2009-2013. All rights reserved. +// Created by John Boiles on 10/20/11. +// Copyright (c) 2011. All rights reserved +// Modified by Felix Schulze on 2/11/13. +// Copyright 2013. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// + +#import + +@interface UIImage (Diff) + +- (UIImage *)fb_diffWithImage:(UIImage *)image; + +@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.m b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.m new file mode 100644 index 00000000..ebb72fe3 --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.m @@ -0,0 +1,56 @@ +// +// Created by Gabriel Handford on 3/1/09. +// Copyright 2009-2013. All rights reserved. +// Created by John Boiles on 10/20/11. +// Copyright (c) 2011. All rights reserved +// Modified by Felix Schulze on 2/11/13. +// Copyright 2013. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// + +#import + +@implementation UIImage (Diff) + +- (UIImage *)fb_diffWithImage:(UIImage *)image +{ + if (!image) { + return nil; + } + CGSize imageSize = CGSizeMake(MAX(self.size.width, image.size.width), MAX(self.size.height, image.size.height)); + UIGraphicsBeginImageContextWithOptions(imageSize, YES, 0); + CGContextRef context = UIGraphicsGetCurrentContext(); + [self drawInRect:CGRectMake(0, 0, self.size.width, self.size.height)]; + CGContextSetAlpha(context, 0.5); + CGContextBeginTransparencyLayer(context, NULL); + [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)]; + CGContextSetBlendMode(context, kCGBlendModeDifference); + CGContextSetFillColorWithColor(context,[UIColor whiteColor].CGColor); + CGContextFillRect(context, CGRectMake(0, 0, self.size.width, self.size.height)); + CGContextEndTransparencyLayer(context); + UIImage *returnImage = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return returnImage; +} + +@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.h b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.h new file mode 100644 index 00000000..b0d5b26b --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +@interface UIImage (Snapshot) + +/// Uses renderInContext: to get a snapshot of the layer. ++ (UIImage *)fb_imageForLayer:(CALayer *)layer; + +/// Uses renderInContext: to get a snapshot of the view layer. ++ (UIImage *)fb_imageForViewLayer:(UIView *)view; + +/// Uses drawViewHierarchyInRect: to get a snapshot of the view and adds the view into a window if needed. ++ (UIImage *)fb_imageForView:(UIView *)view; + +@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.m b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.m new file mode 100644 index 00000000..c7920774 --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.m @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +@implementation UIImage (Snapshot) + ++ (UIImage *)fb_imageForLayer:(CALayer *)layer +{ + CGRect bounds = layer.bounds; + NSAssert1(CGRectGetWidth(bounds), @"Zero width for layer %@", layer); + NSAssert1(CGRectGetHeight(bounds), @"Zero height for layer %@", layer); + + UIGraphicsBeginImageContextWithOptions(bounds.size, NO, 0); + CGContextRef context = UIGraphicsGetCurrentContext(); + NSAssert1(context, @"Could not generate context for layer %@", layer); + CGContextSaveGState(context); + [layer layoutIfNeeded]; + [layer renderInContext:context]; + CGContextRestoreGState(context); + + UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return snapshot; +} + ++ (UIImage *)fb_imageForViewLayer:(UIView *)view +{ + [view layoutIfNeeded]; + return [self fb_imageForLayer:view.layer]; +} + ++ (UIImage *)fb_imageForView:(UIView *)view +{ + CGRect bounds = view.bounds; + NSAssert1(CGRectGetWidth(bounds), @"Zero width for view %@", view); + NSAssert1(CGRectGetHeight(bounds), @"Zero height for view %@", view); + + UIWindow *window = view.window; + if (window == nil) { + window = [[UIWindow alloc] initWithFrame:bounds]; + [window addSubview:view]; + [window makeKeyAndVisible]; + } + + UIGraphicsBeginImageContextWithOptions(bounds.size, NO, 0); + [view layoutIfNeeded]; + [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES]; + + UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return snapshot; +} + +@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h new file mode 100644 index 00000000..54e301e5 --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +#import + +#import + +#import + +/* + There are three ways of setting reference image directories. + + 1. Set the preprocessor macro FB_REFERENCE_IMAGE_DIR to a double quoted + c-string with the path. + 2. Set an environment variable named FB_REFERENCE_IMAGE_DIR with the path. This + takes precedence over the preprocessor macro to allow for run-time override. + 3. Keep everything unset, which will cause the reference images to be looked up + inside the bundle holding the current test, in the + Resources/ReferenceImages_* directories. + */ +#ifndef FB_REFERENCE_IMAGE_DIR +#define FB_REFERENCE_IMAGE_DIR "" +#endif + +/** + Similar to our much-loved XCTAssert() macros. Use this to perform your test. No need to write an explanation, though. + @param view The view to snapshot + @param identifier An optional identifier, used if there are multiple snapshot tests in a given -test method. + @param suffixes An NSOrderedSet of strings for the different suffixes + @param tolerance The percentage of pixels that can differ and still count as an 'identical' view + */ +#define FBSnapshotVerifyViewWithOptions(view__, identifier__, suffixes__, tolerance__) \ + FBSnapshotVerifyViewOrLayerWithOptions(View, view__, identifier__, suffixes__, tolerance__) + +#define FBSnapshotVerifyView(view__, identifier__) \ + FBSnapshotVerifyViewWithOptions(view__, identifier__, FBSnapshotTestCaseDefaultSuffixes(), 0) + + +/** + Similar to our much-loved XCTAssert() macros. Use this to perform your test. No need to write an explanation, though. + @param layer The layer to snapshot + @param identifier An optional identifier, used is there are multiple snapshot tests in a given -test method. + @param suffixes An NSOrderedSet of strings for the different suffixes + @param tolerance The percentage of pixels that can differ and still count as an 'identical' layer + */ +#define FBSnapshotVerifyLayerWithOptions(layer__, identifier__, suffixes__, tolerance__) \ + FBSnapshotVerifyViewOrLayerWithOptions(Layer, layer__, identifier__, suffixes__, tolerance__) + +#define FBSnapshotVerifyLayer(layer__, identifier__) \ + FBSnapshotVerifyLayerWithOptions(layer__, identifier__, FBSnapshotTestCaseDefaultSuffixes(), 0) + + +#define FBSnapshotVerifyViewOrLayerWithOptions(what__, viewOrLayer__, identifier__, suffixes__, tolerance__) \ +{ \ + NSString *referenceImageDirectory = [self getReferenceImageDirectoryWithDefault:(@ FB_REFERENCE_IMAGE_DIR)]; \ + XCTAssertNotNil(referenceImageDirectory, @"Missing value for referenceImagesDirectory - Set FB_REFERENCE_IMAGE_DIR as Environment variable in your scheme.");\ + XCTAssertTrue((suffixes__.count > 0), @"Suffixes set cannot be empty %@", suffixes__); \ + \ + BOOL testSuccess__ = NO; \ + NSError *error__ = nil; \ + NSMutableArray *errors__ = [NSMutableArray array]; \ + \ + if (self.recordMode) { \ + \ + NSString *referenceImagesDirectory__ = [NSString stringWithFormat:@"%@%@", referenceImageDirectory, suffixes__.firstObject]; \ + BOOL referenceImageSaved__ = [self compareSnapshotOf ## what__ :(viewOrLayer__) referenceImagesDirectory:referenceImagesDirectory__ identifier:(identifier__) tolerance:(tolerance__) error:&error__]; \ + if (!referenceImageSaved__) { \ + [errors__ addObject:error__]; \ + } \ + } else { \ + \ + for (NSString *suffix__ in suffixes__) { \ + NSString *referenceImagesDirectory__ = [NSString stringWithFormat:@"%@%@", referenceImageDirectory, suffix__]; \ + BOOL referenceImageAvailable = [self referenceImageRecordedInDirectory:referenceImagesDirectory__ identifier:(identifier__) error:&error__]; \ + \ + if (referenceImageAvailable) { \ + BOOL comparisonSuccess__ = [self compareSnapshotOf ## what__ :(viewOrLayer__) referenceImagesDirectory:referenceImagesDirectory__ identifier:(identifier__) tolerance:(tolerance__) error:&error__]; \ + [errors__ removeAllObjects]; \ + if (comparisonSuccess__) { \ + testSuccess__ = YES; \ + break; \ + } else { \ + [errors__ addObject:error__]; \ + } \ + } else { \ + [errors__ addObject:error__]; \ + } \ + } \ + } \ + XCTAssertTrue(testSuccess__, @"Snapshot comparison failed: %@", errors__.firstObject); \ + XCTAssertFalse(self.recordMode, @"Test ran in record mode. Reference image is now saved. Disable record mode to perform an actual snapshot comparison!"); \ +} + + +/** + The base class of view snapshotting tests. If you have small UI component, it's often easier to configure it in a test + and compare an image of the view to a reference image that write lots of complex layout-code tests. + + In order to flip the tests in your subclass to record the reference images set @c recordMode to @c YES. + + @attention When recording, the reference image directory should be explicitly + set, otherwise the images may be written to somewhere inside the + simulator directory. + + For example: + @code + - (void)setUp + { + [super setUp]; + self.recordMode = YES; + } + @endcode + */ +@interface FBSnapshotTestCase : XCTestCase + +/** + When YES, the test macros will save reference images, rather than performing an actual test. + */ +@property (readwrite, nonatomic, assign) BOOL recordMode; + +/** + When @c YES appends the name of the device model and OS to the snapshot file name. + The default value is @c NO. + */ +@property (readwrite, nonatomic, assign, getter=isDeviceAgnostic) BOOL deviceAgnostic; + +/** + When YES, renders a snapshot of the complete view hierarchy as visible onscreen. + There are several things that do not work if renderInContext: is used. + - UIVisualEffect #70 + - UIAppearance #91 + - Size Classes #92 + + @attention If the view does't belong to a UIWindow, it will create one and add the view as a subview. + */ +@property (readwrite, nonatomic, assign) BOOL usesDrawViewHierarchyInRect; + +- (void)setUp NS_REQUIRES_SUPER; +- (void)tearDown NS_REQUIRES_SUPER; + +/** + Performs the comparison or records a snapshot of the layer if recordMode is YES. + @param layer The Layer to snapshot + @param referenceImagesDirectory The directory in which reference images are stored. + @param identifier An optional identifier, used if there are multiple snapshot tests in a given -test method. + @param tolerance The percentage difference to still count as identical - 0 mean pixel perfect, 1 means I don't care + @param errorPtr An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). + @returns YES if the comparison (or saving of the reference image) succeeded. + */ +- (BOOL)compareSnapshotOfLayer:(CALayer *)layer + referenceImagesDirectory:(NSString *)referenceImagesDirectory + identifier:(NSString *)identifier + tolerance:(CGFloat)tolerance + error:(NSError **)errorPtr; + +/** + Performs the comparison or records a snapshot of the view if recordMode is YES. + @param view The view to snapshot + @param referenceImagesDirectory The directory in which reference images are stored. + @param identifier An optional identifier, used if there are multiple snapshot tests in a given -test method. + @param tolerance The percentage difference to still count as identical - 0 mean pixel perfect, 1 means I don't care + @param errorPtr An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). + @returns YES if the comparison (or saving of the reference image) succeeded. + */ +- (BOOL)compareSnapshotOfView:(UIView *)view + referenceImagesDirectory:(NSString *)referenceImagesDirectory + identifier:(NSString *)identifier + tolerance:(CGFloat)tolerance + error:(NSError **)errorPtr; + +/** + Checks if reference image with identifier based name exists in the reference images directory. + @param referenceImagesDirectory The directory in which reference images are stored. + @param identifier An optional identifier, used if there are multiple snapshot tests in a given -test method. + @param errorPtr An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). + @returns YES if reference image exists. + */ +- (BOOL)referenceImageRecordedInDirectory:(NSString *)referenceImagesDirectory + identifier:(NSString *)identifier + error:(NSError **)errorPtr; + +/** + Returns the reference image directory. + + Helper function used to implement the assert macros. + + @param dir directory to use if environment variable not specified. Ignored if null or empty. + */ +- (NSString *)getReferenceImageDirectoryWithDefault:(NSString *)dir; + +@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.m b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.m new file mode 100644 index 00000000..3ee351f4 --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.m @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import +#import + +@implementation FBSnapshotTestCase +{ + FBSnapshotTestController *_snapshotController; +} + +#pragma mark - Overrides + +- (void)setUp +{ + [super setUp]; + _snapshotController = [[FBSnapshotTestController alloc] initWithTestName:NSStringFromClass([self class])]; +} + +- (void)tearDown +{ + _snapshotController = nil; + [super tearDown]; +} + +- (BOOL)recordMode +{ + return _snapshotController.recordMode; +} + +- (void)setRecordMode:(BOOL)recordMode +{ + NSAssert1(_snapshotController, @"%s cannot be called before [super setUp]", __FUNCTION__); + _snapshotController.recordMode = recordMode; +} + +- (BOOL)isDeviceAgnostic +{ + return _snapshotController.deviceAgnostic; +} + +- (void)setDeviceAgnostic:(BOOL)deviceAgnostic +{ + NSAssert1(_snapshotController, @"%s cannot be called before [super setUp]", __FUNCTION__); + _snapshotController.deviceAgnostic = deviceAgnostic; +} + +- (BOOL)usesDrawViewHierarchyInRect +{ + return _snapshotController.usesDrawViewHierarchyInRect; +} + +- (void)setUsesDrawViewHierarchyInRect:(BOOL)usesDrawViewHierarchyInRect +{ + NSAssert1(_snapshotController, @"%s cannot be called before [super setUp]", __FUNCTION__); + _snapshotController.usesDrawViewHierarchyInRect = usesDrawViewHierarchyInRect; +} + +#pragma mark - Public API + +- (BOOL)compareSnapshotOfLayer:(CALayer *)layer + referenceImagesDirectory:(NSString *)referenceImagesDirectory + identifier:(NSString *)identifier + tolerance:(CGFloat)tolerance + error:(NSError **)errorPtr +{ + return [self _compareSnapshotOfViewOrLayer:layer + referenceImagesDirectory:referenceImagesDirectory + identifier:identifier + tolerance:tolerance + error:errorPtr]; +} + +- (BOOL)compareSnapshotOfView:(UIView *)view + referenceImagesDirectory:(NSString *)referenceImagesDirectory + identifier:(NSString *)identifier + tolerance:(CGFloat)tolerance + error:(NSError **)errorPtr +{ + return [self _compareSnapshotOfViewOrLayer:view + referenceImagesDirectory:referenceImagesDirectory + identifier:identifier + tolerance:tolerance + error:errorPtr]; +} + +- (BOOL)referenceImageRecordedInDirectory:(NSString *)referenceImagesDirectory + identifier:(NSString *)identifier + error:(NSError **)errorPtr +{ + NSAssert1(_snapshotController, @"%s cannot be called before [super setUp]", __FUNCTION__); + _snapshotController.referenceImagesDirectory = referenceImagesDirectory; + UIImage *referenceImage = [_snapshotController referenceImageForSelector:self.invocation.selector + identifier:identifier + error:errorPtr]; + + return (referenceImage != nil); +} + +- (NSString *)getReferenceImageDirectoryWithDefault:(NSString *)dir +{ + NSString *envReferenceImageDirectory = [NSProcessInfo processInfo].environment[@"FB_REFERENCE_IMAGE_DIR"]; + if (envReferenceImageDirectory) { + return envReferenceImageDirectory; + } + if (dir && dir.length > 0) { + return dir; + } + return [[NSBundle bundleForClass:self.class].resourcePath stringByAppendingPathComponent:@"ReferenceImages"]; +} + + +#pragma mark - Private API + +- (BOOL)_compareSnapshotOfViewOrLayer:(id)viewOrLayer + referenceImagesDirectory:(NSString *)referenceImagesDirectory + identifier:(NSString *)identifier + tolerance:(CGFloat)tolerance + error:(NSError **)errorPtr +{ + _snapshotController.referenceImagesDirectory = referenceImagesDirectory; + return [_snapshotController compareSnapshotOfViewOrLayer:viewOrLayer + selector:self.invocation.selector + identifier:identifier + tolerance:tolerance + error:errorPtr]; +} + +@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h new file mode 100644 index 00000000..e04acf2f --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Returns a Boolean value that indicates whether the snapshot test is running in 64Bit. + This method is a convenience for creating the suffixes set based on the architecture + that the test is running. + + @returns @c YES if the test is running in 64bit, otherwise @c NO. + */ +BOOL FBSnapshotTestCaseIs64Bit(void); + +/** + Returns a default set of strings that is used to append a suffix based on the architectures. + @warning Do not modify this function, you can create your own and use it with @c FBSnapshotVerifyViewWithOptions() + + @returns An @c NSOrderedSet object containing strings that are appended to the reference images directory. + */ +NSOrderedSet *FBSnapshotTestCaseDefaultSuffixes(void); + +/** + Returns a fully «normalized» file name. + Strips punctuation and spaces and replaces them with @c _. Also appends the device model, running OS and screen size to the file name. + + @returns An @c NSString object containing the passed @c fileName with the device model, OS and screen size appended at the end. + */ +NSString *FBDeviceAgnosticNormalizedFileName(NSString *fileName); + +#ifdef __cplusplus +} +#endif diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.m b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.m new file mode 100644 index 00000000..4f6fb01e --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.m @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import +#import + +BOOL FBSnapshotTestCaseIs64Bit(void) +{ +#if __LP64__ + return YES; +#else + return NO; +#endif +} + +NSOrderedSet *FBSnapshotTestCaseDefaultSuffixes(void) +{ + NSMutableOrderedSet *suffixesSet = [[NSMutableOrderedSet alloc] init]; + [suffixesSet addObject:@"_32"]; + [suffixesSet addObject:@"_64"]; + if (FBSnapshotTestCaseIs64Bit()) { + return [suffixesSet reversedOrderedSet]; + } + return [suffixesSet copy]; +} + +NSString *FBDeviceAgnosticNormalizedFileName(NSString *fileName) +{ + UIDevice *device = [UIDevice currentDevice]; + CGSize screenSize = [[UIApplication sharedApplication] keyWindow].bounds.size; + NSString *os = device.systemVersion; + + fileName = [NSString stringWithFormat:@"%@_%@%@_%.0fx%.0f", fileName, device.model, os, screenSize.width, screenSize.height]; + + NSMutableCharacterSet *invalidCharacters = [NSMutableCharacterSet new]; + [invalidCharacters formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]]; + [invalidCharacters formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]]; + NSArray *validComponents = [fileName componentsSeparatedByCharactersInSet:invalidCharacters]; + fileName = [validComponents componentsJoinedByString:@"_"]; + + return fileName; +} \ No newline at end of file diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h new file mode 100644 index 00000000..5719abac --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import +#import + +typedef NS_ENUM(NSInteger, FBSnapshotTestControllerErrorCode) { + FBSnapshotTestControllerErrorCodeUnknown, + FBSnapshotTestControllerErrorCodeNeedsRecord, + FBSnapshotTestControllerErrorCodePNGCreationFailed, + FBSnapshotTestControllerErrorCodeImagesDifferentSizes, + FBSnapshotTestControllerErrorCodeImagesDifferent, +}; +/** + Errors returned by the methods of FBSnapshotTestController use this domain. + */ +extern NSString *const FBSnapshotTestControllerErrorDomain; + +/** + Errors returned by the methods of FBSnapshotTestController sometimes contain this key in the `userInfo` dictionary. + */ +extern NSString *const FBReferenceImageFilePathKey; + +/** + Provides the heavy-lifting for FBSnapshotTestCase. It loads and saves images, along with performing the actual pixel- + by-pixel comparison of images. + Instances are initialized with the test class, and directories to read and write to. + */ +@interface FBSnapshotTestController : NSObject + +/** + Record snapshots. + */ +@property (readwrite, nonatomic, assign) BOOL recordMode; + +/** + When @c YES appends the name of the device model and OS to the snapshot file name. + The default value is @c NO. + */ +@property (readwrite, nonatomic, assign, getter=isDeviceAgnostic) BOOL deviceAgnostic; + +/** + Uses drawViewHierarchyInRect:afterScreenUpdates: to draw the image instead of renderInContext: + */ +@property (readwrite, nonatomic, assign) BOOL usesDrawViewHierarchyInRect; + +/** + The directory in which referfence images are stored. + */ +@property (readwrite, nonatomic, copy) NSString *referenceImagesDirectory; + +/** + @param testClass The subclass of FBSnapshotTestCase that is using this controller. + @returns An instance of FBSnapshotTestController. + */ +- (instancetype)initWithTestClass:(Class)testClass; + +/** + Designated initializer. + @param testName The name of the tests. + @returns An instance of FBSnapshotTestController. + */ +- (instancetype)initWithTestName:(NSString *)testName; + +/** + Performs the comparison of the layer. + @param layer The Layer to snapshot. + @param selector The test method being run. + @param identifier An optional identifier, used is there are muliptle snapshot tests in a given -test method. + @param error An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). + @returns YES if the comparison (or saving of the reference image) succeeded. + */ +- (BOOL)compareSnapshotOfLayer:(CALayer *)layer + selector:(SEL)selector + identifier:(NSString *)identifier + error:(NSError **)errorPtr; + +/** + Performs the comparison of the view. + @param view The view to snapshot. + @param selector The test method being run. + @param identifier An optional identifier, used is there are muliptle snapshot tests in a given -test method. + @param error An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). + @returns YES if the comparison (or saving of the reference image) succeeded. + */ +- (BOOL)compareSnapshotOfView:(UIView *)view + selector:(SEL)selector + identifier:(NSString *)identifier + error:(NSError **)errorPtr; + +/** + Performs the comparison of a view or layer. + @param view The view or layer to snapshot. + @param selector The test method being run. + @param identifier An optional identifier, used is there are muliptle snapshot tests in a given -test method. + @param tolerance The percentage of pixels that can differ and still be considered 'identical' + @param error An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). + @returns YES if the comparison (or saving of the reference image) succeeded. + */ +- (BOOL)compareSnapshotOfViewOrLayer:(id)viewOrLayer + selector:(SEL)selector + identifier:(NSString *)identifier + tolerance:(CGFloat)tolerance + error:(NSError **)errorPtr; + +/** + Loads a reference image. + @param selector The test method being run. + @param identifier The optional identifier, used when multiple images are tested in a single -test method. + @param errorPtr An error, if this methods returns nil, the error will be something useful. + @returns An image. + */ +- (UIImage *)referenceImageForSelector:(SEL)selector + identifier:(NSString *)identifier + error:(NSError **)errorPtr; + +/** + Performs a pixel-by-pixel comparison of the two images with an allowable margin of error. + @param referenceImage The reference (correct) image. + @param image The image to test against the reference. + @param tolerance The percentage of pixels that can differ and still be considered 'identical' + @param errorPtr An error that indicates why the comparison failed if it does. + @returns YES if the comparison succeeded and the images are the same(ish). + */ +- (BOOL)compareReferenceImage:(UIImage *)referenceImage + toImage:(UIImage *)image + tolerance:(CGFloat)tolerance + error:(NSError **)errorPtr; + +/** + Saves the reference image and the test image to `failedOutputDirectory`. + @param referenceImage The reference (correct) image. + @param testImage The image to test against the reference. + @param selector The test method being run. + @param identifier The optional identifier, used when multiple images are tested in a single -test method. + @param errorPtr An error that indicates why the comparison failed if it does. + @returns YES if the save succeeded. + */ +- (BOOL)saveFailedReferenceImage:(UIImage *)referenceImage + testImage:(UIImage *)testImage + selector:(SEL)selector + identifier:(NSString *)identifier + error:(NSError **)errorPtr; +@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.m b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.m new file mode 100644 index 00000000..4cebe104 --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.m @@ -0,0 +1,356 @@ +/* + * Copyright (c) 2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ + +#import +#import +#import +#import +#import + +#import + +NSString *const FBSnapshotTestControllerErrorDomain = @"FBSnapshotTestControllerErrorDomain"; +NSString *const FBReferenceImageFilePathKey = @"FBReferenceImageFilePathKey"; + +typedef NS_ENUM(NSUInteger, FBTestSnapshotFileNameType) { + FBTestSnapshotFileNameTypeReference, + FBTestSnapshotFileNameTypeFailedReference, + FBTestSnapshotFileNameTypeFailedTest, + FBTestSnapshotFileNameTypeFailedTestDiff, +}; + +@implementation FBSnapshotTestController +{ + NSString *_testName; + NSFileManager *_fileManager; +} + +#pragma mark - Initializers + +- (instancetype)initWithTestClass:(Class)testClass; +{ + return [self initWithTestName:NSStringFromClass(testClass)]; +} + +- (instancetype)initWithTestName:(NSString *)testName +{ + if (self = [super init]) { + _testName = [testName copy]; + _deviceAgnostic = NO; + + _fileManager = [[NSFileManager alloc] init]; + } + return self; +} + +#pragma mark - Overrides + +- (NSString *)description +{ + return [NSString stringWithFormat:@"%@ %@", [super description], _referenceImagesDirectory]; +} + +#pragma mark - Public API + +- (BOOL)compareSnapshotOfLayer:(CALayer *)layer + selector:(SEL)selector + identifier:(NSString *)identifier + error:(NSError **)errorPtr +{ + return [self compareSnapshotOfViewOrLayer:layer + selector:selector + identifier:identifier + tolerance:0 + error:errorPtr]; +} + +- (BOOL)compareSnapshotOfView:(UIView *)view + selector:(SEL)selector + identifier:(NSString *)identifier + error:(NSError **)errorPtr +{ + return [self compareSnapshotOfViewOrLayer:view + selector:selector + identifier:identifier + tolerance:0 + error:errorPtr]; +} + +- (BOOL)compareSnapshotOfViewOrLayer:(id)viewOrLayer + selector:(SEL)selector + identifier:(NSString *)identifier + tolerance:(CGFloat)tolerance + error:(NSError **)errorPtr +{ + if (self.recordMode) { + return [self _recordSnapshotOfViewOrLayer:viewOrLayer selector:selector identifier:identifier error:errorPtr]; + } else { + return [self _performPixelComparisonWithViewOrLayer:viewOrLayer selector:selector identifier:identifier tolerance:tolerance error:errorPtr]; + } +} + +- (UIImage *)referenceImageForSelector:(SEL)selector + identifier:(NSString *)identifier + error:(NSError **)errorPtr +{ + NSString *filePath = [self _referenceFilePathForSelector:selector identifier:identifier]; + UIImage *image = [UIImage imageWithContentsOfFile:filePath]; + if (nil == image && NULL != errorPtr) { + BOOL exists = [_fileManager fileExistsAtPath:filePath]; + if (!exists) { + *errorPtr = [NSError errorWithDomain:FBSnapshotTestControllerErrorDomain + code:FBSnapshotTestControllerErrorCodeNeedsRecord + userInfo:@{ + FBReferenceImageFilePathKey: filePath, + NSLocalizedDescriptionKey: @"Unable to load reference image.", + NSLocalizedFailureReasonErrorKey: @"Reference image not found. You need to run the test in record mode", + }]; + } else { + *errorPtr = [NSError errorWithDomain:FBSnapshotTestControllerErrorDomain + code:FBSnapshotTestControllerErrorCodeUnknown + userInfo:nil]; + } + } + return image; +} + +- (BOOL)compareReferenceImage:(UIImage *)referenceImage + toImage:(UIImage *)image + tolerance:(CGFloat)tolerance + error:(NSError **)errorPtr +{ + if (CGSizeEqualToSize(referenceImage.size, image.size)) { + BOOL imagesEqual = [referenceImage fb_compareWithImage:image tolerance:tolerance]; + if (NULL != errorPtr) { + *errorPtr = [NSError errorWithDomain:FBSnapshotTestControllerErrorDomain + code:FBSnapshotTestControllerErrorCodeImagesDifferent + userInfo:@{ + NSLocalizedDescriptionKey: @"Images different", + }]; + } + return imagesEqual; + } + if (NULL != errorPtr) { + *errorPtr = [NSError errorWithDomain:FBSnapshotTestControllerErrorDomain + code:FBSnapshotTestControllerErrorCodeImagesDifferentSizes + userInfo:@{ + NSLocalizedDescriptionKey: @"Images different sizes", + NSLocalizedFailureReasonErrorKey: [NSString stringWithFormat:@"referenceImage:%@, image:%@", + NSStringFromCGSize(referenceImage.size), + NSStringFromCGSize(image.size)], + }]; + } + return NO; +} + +- (BOOL)saveFailedReferenceImage:(UIImage *)referenceImage + testImage:(UIImage *)testImage + selector:(SEL)selector + identifier:(NSString *)identifier + error:(NSError **)errorPtr +{ + NSData *referencePNGData = UIImagePNGRepresentation(referenceImage); + NSData *testPNGData = UIImagePNGRepresentation(testImage); + + NSString *referencePath = [self _failedFilePathForSelector:selector + identifier:identifier + fileNameType:FBTestSnapshotFileNameTypeFailedReference]; + + NSError *creationError = nil; + BOOL didCreateDir = [_fileManager createDirectoryAtPath:[referencePath stringByDeletingLastPathComponent] + withIntermediateDirectories:YES + attributes:nil + error:&creationError]; + if (!didCreateDir) { + if (NULL != errorPtr) { + *errorPtr = creationError; + } + return NO; + } + + if (![referencePNGData writeToFile:referencePath options:NSDataWritingAtomic error:errorPtr]) { + return NO; + } + + NSString *testPath = [self _failedFilePathForSelector:selector + identifier:identifier + fileNameType:FBTestSnapshotFileNameTypeFailedTest]; + + if (![testPNGData writeToFile:testPath options:NSDataWritingAtomic error:errorPtr]) { + return NO; + } + + NSString *diffPath = [self _failedFilePathForSelector:selector + identifier:identifier + fileNameType:FBTestSnapshotFileNameTypeFailedTestDiff]; + + UIImage *diffImage = [referenceImage fb_diffWithImage:testImage]; + NSData *diffImageData = UIImagePNGRepresentation(diffImage); + + if (![diffImageData writeToFile:diffPath options:NSDataWritingAtomic error:errorPtr]) { + return NO; + } + + NSLog(@"If you have Kaleidoscope installed you can run this command to see an image diff:\n" + @"ksdiff \"%@\" \"%@\"", referencePath, testPath); + + return YES; +} + +#pragma mark - Private API + +- (NSString *)_fileNameForSelector:(SEL)selector + identifier:(NSString *)identifier + fileNameType:(FBTestSnapshotFileNameType)fileNameType +{ + NSString *fileName = nil; + switch (fileNameType) { + case FBTestSnapshotFileNameTypeFailedReference: + fileName = @"reference_"; + break; + case FBTestSnapshotFileNameTypeFailedTest: + fileName = @"failed_"; + break; + case FBTestSnapshotFileNameTypeFailedTestDiff: + fileName = @"diff_"; + break; + default: + fileName = @""; + break; + } + fileName = [fileName stringByAppendingString:NSStringFromSelector(selector)]; + if (0 < identifier.length) { + fileName = [fileName stringByAppendingFormat:@"_%@", identifier]; + } + + if (self.isDeviceAgnostic) { + fileName = FBDeviceAgnosticNormalizedFileName(fileName); + } + + if ([[UIScreen mainScreen] scale] > 1) { + fileName = [fileName stringByAppendingFormat:@"@%.fx", [[UIScreen mainScreen] scale]]; + } + fileName = [fileName stringByAppendingPathExtension:@"png"]; + return fileName; +} + +- (NSString *)_referenceFilePathForSelector:(SEL)selector + identifier:(NSString *)identifier +{ + NSString *fileName = [self _fileNameForSelector:selector + identifier:identifier + fileNameType:FBTestSnapshotFileNameTypeReference]; + NSString *filePath = [_referenceImagesDirectory stringByAppendingPathComponent:_testName]; + filePath = [filePath stringByAppendingPathComponent:fileName]; + return filePath; +} + +- (NSString *)_failedFilePathForSelector:(SEL)selector + identifier:(NSString *)identifier + fileNameType:(FBTestSnapshotFileNameType)fileNameType +{ + NSString *fileName = [self _fileNameForSelector:selector + identifier:identifier + fileNameType:fileNameType]; + NSString *folderPath = NSTemporaryDirectory(); + if (getenv("IMAGE_DIFF_DIR")) { + folderPath = @(getenv("IMAGE_DIFF_DIR")); + } + NSString *filePath = [folderPath stringByAppendingPathComponent:_testName]; + filePath = [filePath stringByAppendingPathComponent:fileName]; + return filePath; +} + +- (BOOL)_performPixelComparisonWithViewOrLayer:(id)viewOrLayer + selector:(SEL)selector + identifier:(NSString *)identifier + tolerance:(CGFloat)tolerance + error:(NSError **)errorPtr +{ + UIImage *referenceImage = [self referenceImageForSelector:selector identifier:identifier error:errorPtr]; + if (nil != referenceImage) { + UIImage *snapshot = [self _imageForViewOrLayer:viewOrLayer]; + BOOL imagesSame = [self compareReferenceImage:referenceImage toImage:snapshot tolerance:tolerance error:errorPtr]; + if (!imagesSame) { + [self saveFailedReferenceImage:referenceImage + testImage:snapshot + selector:selector + identifier:identifier + error:errorPtr]; + } + return imagesSame; + } + return NO; +} + +- (BOOL)_recordSnapshotOfViewOrLayer:(id)viewOrLayer + selector:(SEL)selector + identifier:(NSString *)identifier + error:(NSError **)errorPtr +{ + UIImage *snapshot = [self _imageForViewOrLayer:viewOrLayer]; + return [self _saveReferenceImage:snapshot selector:selector identifier:identifier error:errorPtr]; +} + +- (BOOL)_saveReferenceImage:(UIImage *)image + selector:(SEL)selector + identifier:(NSString *)identifier + error:(NSError **)errorPtr +{ + BOOL didWrite = NO; + if (nil != image) { + NSString *filePath = [self _referenceFilePathForSelector:selector identifier:identifier]; + NSData *pngData = UIImagePNGRepresentation(image); + if (nil != pngData) { + NSError *creationError = nil; + BOOL didCreateDir = [_fileManager createDirectoryAtPath:[filePath stringByDeletingLastPathComponent] + withIntermediateDirectories:YES + attributes:nil + error:&creationError]; + if (!didCreateDir) { + if (NULL != errorPtr) { + *errorPtr = creationError; + } + return NO; + } + didWrite = [pngData writeToFile:filePath options:NSDataWritingAtomic error:errorPtr]; + if (didWrite) { + NSLog(@"Reference image save at: %@", filePath); + } + } else { + if (nil != errorPtr) { + *errorPtr = [NSError errorWithDomain:FBSnapshotTestControllerErrorDomain + code:FBSnapshotTestControllerErrorCodePNGCreationFailed + userInfo:@{ + FBReferenceImageFilePathKey: filePath, + }]; + } + } + } + return didWrite; +} + +- (UIImage *)_imageForViewOrLayer:(id)viewOrLayer +{ + if ([viewOrLayer isKindOfClass:[UIView class]]) { + if (_usesDrawViewHierarchyInRect) { + return [UIImage fb_imageForView:viewOrLayer]; + } else { + return [UIImage fb_imageForViewLayer:viewOrLayer]; + } + } else if ([viewOrLayer isKindOfClass:[CALayer class]]) { + return [UIImage fb_imageForLayer:viewOrLayer]; + } else { + [NSException raise:@"Only UIView and CALayer classes can be snapshotted" format:@"%@", viewOrLayer]; + } + return nil; +} + +@end diff --git a/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/SwiftSupport.swift b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/SwiftSupport.swift new file mode 100644 index 00000000..d3058fbc --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/SwiftSupport.swift @@ -0,0 +1,66 @@ +/* +* Copyright (c) 2015, Facebook, Inc. +* All rights reserved. +* +* This source code is licensed under the BSD-style license found in the +* LICENSE file in the root directory of this source tree. An additional grant +* of patent rights can be found in the PATENTS file in the same directory. +* +*/ + +public extension FBSnapshotTestCase { + public func FBSnapshotVerifyView(view: UIView, identifier: String = "", suffixes: NSOrderedSet = FBSnapshotTestCaseDefaultSuffixes(), file: String = __FILE__, line: UInt = __LINE__) { + FBSnapshotVerifyViewOrLayer(view, identifier: identifier, suffixes: suffixes) + } + + public func FBSnapshotVerifyLayer(layer: CALayer, identifier: String = "", suffixes: NSOrderedSet = FBSnapshotTestCaseDefaultSuffixes(), file: String = __FILE__, line: UInt = __LINE__) { + FBSnapshotVerifyViewOrLayer(layer, identifier: identifier, suffixes: suffixes) + } + + private func FBSnapshotVerifyViewOrLayer(viewOrLayer: AnyObject, identifier: String = "", suffixes: NSOrderedSet = FBSnapshotTestCaseDefaultSuffixes(), file: String = __FILE__, line: UInt = __LINE__) { + let envReferenceImageDirectory = self.getReferenceImageDirectoryWithDefault(FB_REFERENCE_IMAGE_DIR) + var error: NSError? + var comparisonSuccess = false + + if let envReferenceImageDirectory = envReferenceImageDirectory { + for suffix in suffixes { + let referenceImagesDirectory = "\(envReferenceImageDirectory)\(suffix)" + if viewOrLayer.isKindOfClass(UIView) { + do { + try compareSnapshotOfView(viewOrLayer as! UIView, referenceImagesDirectory: referenceImagesDirectory, identifier: identifier, tolerance: 0) + comparisonSuccess = true + } catch let error1 as NSError { + error = error1 + comparisonSuccess = false + } + } else if viewOrLayer.isKindOfClass(CALayer) { + do { + try compareSnapshotOfLayer(viewOrLayer as! CALayer, referenceImagesDirectory: referenceImagesDirectory, identifier: identifier, tolerance: 0) + comparisonSuccess = true + } catch let error1 as NSError { + error = error1 + comparisonSuccess = false + } + } else { + assertionFailure("Only UIView and CALayer classes can be snapshotted") + } + + assert(recordMode == false, message: "Test ran in record mode. Reference image is now saved. Disable record mode to perform an actual snapshot comparison!", file: file, line: line) + + if comparisonSuccess || recordMode { + break + } + + assert(comparisonSuccess, message: "Snapshot comparison failed: \(error)", file: file, line: line) + } + } else { + XCTFail("Missing value for referenceImagesDirectory - Set FB_REFERENCE_IMAGE_DIR as Environment variable in your scheme.") + } + } + + func assert(assertion: Bool, message: String, file: String, line: UInt) { + if !assertion { + XCTFail(message, file: file, line: line) + } + } +} diff --git a/Example/Pods/FBSnapshotTestCase/LICENSE b/Example/Pods/FBSnapshotTestCase/LICENSE new file mode 100644 index 00000000..2dd780cb --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/LICENSE @@ -0,0 +1,29 @@ +BSD License + +For the FBSnapshotTestCase software + +Copyright (c) 2013, Facebook, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Example/Pods/FBSnapshotTestCase/README.md b/Example/Pods/FBSnapshotTestCase/README.md new file mode 100644 index 00000000..bc23b837 --- /dev/null +++ b/Example/Pods/FBSnapshotTestCase/README.md @@ -0,0 +1,97 @@ +FBSnapshotTestCase +====================== + +[![Build Status](https://travis-ci.org/facebook/ios-snapshot-test-case.svg)](https://travis-ci.org/facebook/ios-snapshot-test-case) [![Cocoa Pod Version](https://cocoapod-badges.herokuapp.com/v/FBSnapshotTestCase/badge.svg)](http://cocoadocs.org/docsets/FBSnapshotTestCase/) + +What it does +------------ + +A "snapshot test case" takes a configured `UIView` or `CALayer` and uses the +`renderInContext:` method to get an image snapshot of its contents. It +compares this snapshot to a "reference image" stored in your source code +repository and fails the test if the two images don't match. + +Why? +---- + +At Facebook we write a lot of UI code. As you might imagine, each type of +feed story is rendered using a subclass of `UIView`. There are a lot of edge +cases that we want to handle correctly: + +- What if there is more text than can fit in the space available? +- What if an image doesn't match the size of an image view? +- What should the highlighted state look like? + +It's straightforward to test logic code, but less obvious how you should test +views. You can do a lot of rectangle asserts, but these are hard to understand +or visualize. Looking at an image diff shows you exactly what changed and how +it will look to users. + +We developed `FBSnapshotTestCase` to make snapshot tests easy. + +Installation with CocoaPods +--------------------------- + +1. Add the following lines to your Podfile: + + ``` + target "Tests" do + pod 'FBSnapshotTestCase' + end + ``` + + If you support iOS 7 use `FBSnapshotTestCase/Core` instead, which doesn't contain Swift support. + + Replace "Tests" with the name of your test project. + +2. There are [three ways](https://github.com/facebook/ios-snapshot-test-case/blob/master/FBSnapshotTestCase/FBSnapshotTestCase.h#L19-L29) of setting reference image directories, the recommended one is to define `FB_REFERENCE_IMAGE_DIR` in your scheme. This should point to the directory where you want reference images to be stored. At Facebook, we normally use this: + +|Name|Value| +|:---|:----| +|`FB_REFERENCE_IMAGE_DIR`|`$(SOURCE_ROOT)/$(PROJECT_NAME)Tests/ReferenceImages`| + + +![](FBSnapshotTestCaseDemo/Scheme_FB_REFERENCE_IMAGE_DIR.png) + +Creating a snapshot test +------------------------ + +1. Subclass `FBSnapshotTestCase` instead of `XCTestCase`. +2. From within your test, use `FBSnapshotVerifyView`. +3. Run the test once with `self.recordMode = YES;` in the test's `-setUp` + method. (This creates the reference images on disk.) +4. Remove the line enabling record mode and run the test. + +Features +-------- + +- Automatically names reference images on disk according to test class and + selector. +- Prints a descriptive error message to the console on failure. (Bonus: + failure message includes a one-line command to see an image diff if + you have [Kaleidoscope](http://www.kaleidoscopeapp.com) installed.) +- Supply an optional "identifier" if you want to perform multiple snapshots + in a single test method. +- Support for `CALayer` via `FBSnapshotVerifyLayer`. +- `usesDrawViewHierarchyInRect` to handle cases like `UIVisualEffect`, `UIAppearance` and Size Classes. +- `isDeviceAgnostic` to allow appending the device model (`iPhone`, `iPad`, `iPod Touch`, etc), OS version and screen size to the images (allowing to have multiple tests for the same «snapshot» for different `OS`s and devices). + +Notes +----- + +Your unit test must be an "application test", not a "logic test." (That is, it +must be run within the Simulator so that it has access to UIKit.) In Xcode 5 +and later new projects only offer application tests, but older projects will +have separate targets for the two types. + +Authors +------- + +`FBSnapshotTestCase` was written at Facebook by +[Jonathan Dann](https://facebook.com/j.p.dann) with significant contributions by +[Todd Krabach](https://facebook.com/toddkrabach). + +License +------- + +`FBSnapshotTestCase` is BSD-licensed. See `LICENSE`. diff --git a/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestCase.h b/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestCase.h new file mode 120000 index 00000000..2925eab1 --- /dev/null +++ b/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestCase.h @@ -0,0 +1 @@ +../../../FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCase.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h b/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h new file mode 120000 index 00000000..6127a30c --- /dev/null +++ b/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h @@ -0,0 +1 @@ +../../../FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestCasePlatform.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestController.h b/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestController.h new file mode 120000 index 00000000..4a7dea13 --- /dev/null +++ b/Example/Pods/Headers/Private/FBSnapshotTestCase/FBSnapshotTestController.h @@ -0,0 +1 @@ +../../../FBSnapshotTestCase/FBSnapshotTestCase/FBSnapshotTestController.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Compare.h b/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Compare.h new file mode 120000 index 00000000..2fd266d7 --- /dev/null +++ b/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Compare.h @@ -0,0 +1 @@ +../../../FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Compare.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Diff.h b/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Diff.h new file mode 120000 index 00000000..2ecee67c --- /dev/null +++ b/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Diff.h @@ -0,0 +1 @@ +../../../FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Diff.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Snapshot.h b/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Snapshot.h new file mode 120000 index 00000000..577a4cb8 --- /dev/null +++ b/Example/Pods/Headers/Private/FBSnapshotTestCase/UIImage+Snapshot.h @@ -0,0 +1 @@ +../../../FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIImage+Snapshot.h \ No newline at end of file diff --git a/Example/Pods/Local Podspecs/Fusuma.podspec.json b/Example/Pods/Local Podspecs/Fusuma.podspec.json new file mode 100644 index 00000000..d22a85ad --- /dev/null +++ b/Example/Pods/Local Podspecs/Fusuma.podspec.json @@ -0,0 +1,25 @@ +{ + "name": "Fusuma", + "version": "0.1.0", + "summary": "A short description of Fusuma.", + "description": "", + "homepage": "https://github.com//Fusuma", + "license": "MIT", + "authors": { + "ytakzk": "shyss.ak@gmail.com" + }, + "source": { + "git": "https://github.com//Fusuma.git", + "tag": "0.1.0" + }, + "platforms": { + "ios": "8.0" + }, + "requires_arc": true, + "source_files": "Pod/Classes/**/*", + "resource_bundles": { + "Fusuma": [ + "Pod/Assets/*.png" + ] + } +} diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock new file mode 100644 index 00000000..77a1605b --- /dev/null +++ b/Example/Pods/Manifest.lock @@ -0,0 +1,21 @@ +PODS: + - FBSnapshotTestCase (2.0.7): + - FBSnapshotTestCase/SwiftSupport (= 2.0.7) + - FBSnapshotTestCase/Core (2.0.7) + - FBSnapshotTestCase/SwiftSupport (2.0.7): + - FBSnapshotTestCase/Core + - Fusuma (0.1.0) + +DEPENDENCIES: + - FBSnapshotTestCase + - Fusuma (from `../`) + +EXTERNAL SOURCES: + Fusuma: + :path: "../" + +SPEC CHECKSUMS: + FBSnapshotTestCase: 7e85180d0d141a0cf472352edda7e80d7eaeb547 + Fusuma: 370927b809138b8b5e3858a635a2e110eebba885 + +COCOAPODS: 0.39.0 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 00000000..e7880b4c --- /dev/null +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,1018 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 0E9793A2578331A4E608C2C1F9DEF0EA /* Fusuma-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C7822AFD709D262FF5C2E11974A805EC /* Fusuma-dummy.m */; }; + 163C6E8E5E7CEE1E0BEEB9CA0939DA3A /* UIImage+Diff.m in Sources */ = {isa = PBXBuildFile; fileRef = 73003A0752F3CABAA497D1FD1F5E4E44 /* UIImage+Diff.m */; }; + 18F301611D39BA3FB4821E3F0756A697 /* Pods-Fusuma_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8D296BC6DB8D37DCEEEA113E211223 /* Pods-Fusuma_Example-dummy.m */; }; + 1F118728B3D74089480152A6B660EA9A /* UIImage+Compare.h in Headers */ = {isa = PBXBuildFile; fileRef = A729E2AD854B4CEB4EF52289C017EB3B /* UIImage+Compare.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 28F2071FFF5C5B0E9DEB6C3FE43A30CC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2393D1A899C707F79A64672C46ED238F /* UIKit.framework */; }; + 2DF7D439515EF3632C8D9E8A4BEC0E9B /* ReplaceMe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E8373611F7D63DD46B861F01EB6B2D8 /* ReplaceMe.swift */; }; + 2E53AE45FFC635DAAB6422AA6097126D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D31B096AB4A0164C61B63F0E59AD76C9 /* Foundation.framework */; }; + 35848D70EAC9237246BDF63457729694 /* FBSnapshotTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 2523693A8A7BA4278BFC866F16021FFF /* FBSnapshotTestCase.m */; }; + 399C248734A4DEF62FD2D524356E776B /* Fusuma.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 5AA781882CCAFF1CA5DC35B3BCC1F553 /* Fusuma.bundle */; }; + 41D8739E2720D3535592391C25507158 /* FBSnapshotTestCasePlatform.h in Headers */ = {isa = PBXBuildFile; fileRef = 12CC4BD9C5F6D514C917D7942DF2D2F4 /* FBSnapshotTestCasePlatform.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4A5AE3D95F6770E864AE8EFB5882614A /* Pods-Fusuma_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 73CB20963142B3B807D03C987137B5CE /* Pods-Fusuma_Tests-dummy.m */; }; + 52B0263F90696E7FD87CB146D5C5E2C1 /* UIImage+Diff.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CAAAB29C54DB2D5220028C4110E45E6 /* UIImage+Diff.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 52F7A46AB0053D8BB1D793B917D37BB2 /* SwiftSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDE5208FE4A05C9114818BC72105E5F7 /* SwiftSupport.swift */; }; + 5D14695A69EC4A8DF7488D0FC59C105C /* FBSnapshotTestCasePlatform.m in Sources */ = {isa = PBXBuildFile; fileRef = E38041D93EDE9398D62F150F8F25DE47 /* FBSnapshotTestCasePlatform.m */; }; + 723FDDFD804188090511DEFA8309A06B /* UIImage+Snapshot.h in Headers */ = {isa = PBXBuildFile; fileRef = 0345D737618C6A063BD152389ACCBF87 /* UIImage+Snapshot.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 788E3D9458FE9540469981BE9A0B227C /* UIImage+Compare.m in Sources */ = {isa = PBXBuildFile; fileRef = 5999002674B86E70DC7970CEA62F278E /* UIImage+Compare.m */; }; + 7BEF20E09F0E864478905311672F91AB /* FBSnapshotTestController.h in Headers */ = {isa = PBXBuildFile; fileRef = 4AC2C5814DCFC7590AC8C46AAB7FCEEF /* FBSnapshotTestController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 821A26883ED14BDCD7EBADD37D671D17 /* FBSnapshotTestCase.h in Headers */ = {isa = PBXBuildFile; fileRef = 0EE4692BF9A76DAAA67A8FF4DABD27E8 /* FBSnapshotTestCase.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8D549E01DA1D5104335CCEABFF870005 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D31B096AB4A0164C61B63F0E59AD76C9 /* Foundation.framework */; }; + AA8501741ABB8D75C6C47DE086BACD37 /* FBSnapshotTestController.m in Sources */ = {isa = PBXBuildFile; fileRef = BFFD97972C24EE7435D0E04686569BBE /* FBSnapshotTestController.m */; }; + AAE9742FF575EAC61C6CC029E5282131 /* Pods-Fusuma_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F4F636BE78ADF7AAB0AD80C64D3F32B /* Pods-Fusuma_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AD4D905241DED4AEAD67447088ACB23D /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 853C84AC883B6FC690E82525E7ECB377 /* XCTest.framework */; }; + B9AD04E077FB832053198FF52D9DAEA9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D31B096AB4A0164C61B63F0E59AD76C9 /* Foundation.framework */; }; + C1669014DB8183A294075CB5A1749490 /* Fusuma-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = DF76F18CCA850483F9DBCBB272B7791E /* Fusuma-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CC2BD0A04199B280AD93F459968CAFC2 /* FBSnapshotTestCase-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DF90F95FC2B36AB64D2FB3AF22E996D2 /* FBSnapshotTestCase-dummy.m */; }; + CF9DB2096C715EA61E263021EE406DB1 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0528444EFC68619AD1FEB8A7CD4A01BA /* QuartzCore.framework */; }; + EB392447B823C18344254D4C13A7320B /* Pods-Fusuma_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = DE9DF6B572BEE3083DA90479E85EDD47 /* Pods-Fusuma_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EDD91D0CC316AC322E1607D3749F1C0A /* UIImage+Snapshot.m in Sources */ = {isa = PBXBuildFile; fileRef = 5121BCE99CCFB208275F3437CCF6EBB6 /* UIImage+Snapshot.m */; }; + FB194C53F6EC17C6DB32D0BBDC57AE6D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D31B096AB4A0164C61B63F0E59AD76C9 /* Foundation.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 23C3E3A128D59860342F32A960B00DD4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0F59FC5E9FE3F55E728633DB02B81F59; + remoteInfo = "Fusuma-Fusuma"; + }; + 5B5C8E59191AF7EE5EF0407DDCE8686B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 495BE7BA2816E52ACF8A9257930AFDA0; + remoteInfo = Fusuma; + }; + 81401DABADABC65328E9441D0373993B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = A5C935B614DD08342117AD0B06959CB9; + remoteInfo = FBSnapshotTestCase; + }; + E78EB29E88D43FD2B966748143E958BC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 495BE7BA2816E52ACF8A9257930AFDA0; + remoteInfo = Fusuma; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 0345D737618C6A063BD152389ACCBF87 /* UIImage+Snapshot.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Snapshot.h"; path = "FBSnapshotTestCase/Categories/UIImage+Snapshot.h"; sourceTree = ""; }; + 0528444EFC68619AD1FEB8A7CD4A01BA /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; + 0EE4692BF9A76DAAA67A8FF4DABD27E8 /* FBSnapshotTestCase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestCase.h; path = FBSnapshotTestCase/FBSnapshotTestCase.h; sourceTree = ""; }; + 0F01AA0F45B0B5CC535F9884FF44262A /* FBSnapshotTestCase.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = FBSnapshotTestCase.modulemap; sourceTree = ""; }; + 0F3709A44207C47436B4545A9F0A09A5 /* Pods-Fusuma_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-Fusuma_Tests.modulemap"; sourceTree = ""; }; + 12CC4BD9C5F6D514C917D7942DF2D2F4 /* FBSnapshotTestCasePlatform.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestCasePlatform.h; path = FBSnapshotTestCase/FBSnapshotTestCasePlatform.h; sourceTree = ""; }; + 2393D1A899C707F79A64672C46ED238F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + 2523693A8A7BA4278BFC866F16021FFF /* FBSnapshotTestCase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestCase.m; path = FBSnapshotTestCase/FBSnapshotTestCase.m; sourceTree = ""; }; + 2A8D296BC6DB8D37DCEEEA113E211223 /* Pods-Fusuma_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Fusuma_Example-dummy.m"; sourceTree = ""; }; + 2A8DAE5BB5171C19214D037B040EEF59 /* Fusuma-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Fusuma-prefix.pch"; sourceTree = ""; }; + 2EFEACEE41B88B59F6A24DCEDB59BBB5 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2F1D2BF82A1AC5CF0693F6CE80D39B61 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 31CD7CDA24FC15ED23D4327751FB9396 /* Fusuma.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Fusuma.modulemap; sourceTree = ""; }; + 39CA496CE8B366E877933631498D4661 /* Pods-Fusuma_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Fusuma_Example.release.xcconfig"; sourceTree = ""; }; + 3CDD9962E7C6687DEEC40FC2F5F6DC17 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 3D7394429B9876A34AF637C53F8C1A69 /* Pods_Fusuma_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Fusuma_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3F4F636BE78ADF7AAB0AD80C64D3F32B /* Pods-Fusuma_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Fusuma_Tests-umbrella.h"; sourceTree = ""; }; + 42A681D3AF997235908A3089BB9BCB20 /* FBSnapshotTestCase.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FBSnapshotTestCase.xcconfig; sourceTree = ""; }; + 4AC2C5814DCFC7590AC8C46AAB7FCEEF /* FBSnapshotTestController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestController.h; path = FBSnapshotTestCase/FBSnapshotTestController.h; sourceTree = ""; }; + 4E8373611F7D63DD46B861F01EB6B2D8 /* ReplaceMe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ReplaceMe.swift; sourceTree = ""; }; + 5121BCE99CCFB208275F3437CCF6EBB6 /* UIImage+Snapshot.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Snapshot.m"; path = "FBSnapshotTestCase/Categories/UIImage+Snapshot.m"; sourceTree = ""; }; + 5999002674B86E70DC7970CEA62F278E /* UIImage+Compare.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Compare.m"; path = "FBSnapshotTestCase/Categories/UIImage+Compare.m"; sourceTree = ""; }; + 5AA781882CCAFF1CA5DC35B3BCC1F553 /* Fusuma.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Fusuma.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 663950C2897BB44D47E66F92F30A85BB /* Pods_Fusuma_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Fusuma_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 73003A0752F3CABAA497D1FD1F5E4E44 /* UIImage+Diff.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Diff.m"; path = "FBSnapshotTestCase/Categories/UIImage+Diff.m"; sourceTree = ""; }; + 73CB20963142B3B807D03C987137B5CE /* Pods-Fusuma_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Fusuma_Tests-dummy.m"; sourceTree = ""; }; + 7CAAAB29C54DB2D5220028C4110E45E6 /* UIImage+Diff.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Diff.h"; path = "FBSnapshotTestCase/Categories/UIImage+Diff.h"; sourceTree = ""; }; + 801EE0D54A4586911DEBDEB6A26B5485 /* Pods-Fusuma_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Fusuma_Example-acknowledgements.plist"; sourceTree = ""; }; + 84CFBA2EF6D4CD77AA563A0A5019434D /* Pods-Fusuma_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Fusuma_Example-frameworks.sh"; sourceTree = ""; }; + 853C84AC883B6FC690E82525E7ECB377 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 9646EE6ADBD60CAB6CEC25F100CB1807 /* Pods-Fusuma_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-Fusuma_Example.modulemap"; sourceTree = ""; }; + A366361C6FE8F0D9503675269FB9769D /* Pods-Fusuma_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Fusuma_Example.debug.xcconfig"; sourceTree = ""; }; + A434175E9C69147A87A7C4CAE30A951F /* Fusuma.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Fusuma.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A4351AD76108362655FE221382161321 /* Pods-Fusuma_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Fusuma_Tests.release.xcconfig"; sourceTree = ""; }; + A590B780507AB1DB52395AEAD1C6A294 /* Pods-Fusuma_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Fusuma_Tests-acknowledgements.plist"; sourceTree = ""; }; + A729E2AD854B4CEB4EF52289C017EB3B /* UIImage+Compare.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Compare.h"; path = "FBSnapshotTestCase/Categories/UIImage+Compare.h"; sourceTree = ""; }; + A9159462EDC41265390998A43B6D0D8E /* Pods-Fusuma_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Fusuma_Tests-frameworks.sh"; sourceTree = ""; }; + AE3C07BDCD86BECD6BE6006374ED8507 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B3D08C65AB18ACF0D05C7C79DB5737E4 /* FBSnapshotTestCase-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBSnapshotTestCase-prefix.pch"; sourceTree = ""; }; + BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + BFFD97972C24EE7435D0E04686569BBE /* FBSnapshotTestController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestController.m; path = FBSnapshotTestCase/FBSnapshotTestController.m; sourceTree = ""; }; + C47BAC587657A3C6071724268CF61C3A /* Fusuma.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Fusuma.xcconfig; sourceTree = ""; }; + C55CCA512BC9E4174283BA00EF4D873D /* Pods-Fusuma_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Fusuma_Tests-acknowledgements.markdown"; sourceTree = ""; }; + C7822AFD709D262FF5C2E11974A805EC /* Fusuma-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Fusuma-dummy.m"; sourceTree = ""; }; + D31B096AB4A0164C61B63F0E59AD76C9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + DD32F9ACA7D549946F8FD755BCB0C82C /* Pods-Fusuma_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Fusuma_Tests-resources.sh"; sourceTree = ""; }; + DE9DF6B572BEE3083DA90479E85EDD47 /* Pods-Fusuma_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Fusuma_Example-umbrella.h"; sourceTree = ""; }; + DF76F18CCA850483F9DBCBB272B7791E /* Fusuma-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Fusuma-umbrella.h"; sourceTree = ""; }; + DF90F95FC2B36AB64D2FB3AF22E996D2 /* FBSnapshotTestCase-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FBSnapshotTestCase-dummy.m"; sourceTree = ""; }; + E38041D93EDE9398D62F150F8F25DE47 /* FBSnapshotTestCasePlatform.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestCasePlatform.m; path = FBSnapshotTestCase/FBSnapshotTestCasePlatform.m; sourceTree = ""; }; + E66B473CD9E0975235D4ED68F47A8C07 /* Pods-Fusuma_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Fusuma_Tests.debug.xcconfig"; sourceTree = ""; }; + EA1A57DE50ED65ED9390392151A8C8BE /* Pods-Fusuma_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Fusuma_Example-acknowledgements.markdown"; sourceTree = ""; }; + F952CCC470815E49C0B42A28D0671206 /* FBSnapshotTestCase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FBSnapshotTestCase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FCB521867E6606524950DBEC836D30F8 /* Pods-Fusuma_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Fusuma_Example-resources.sh"; sourceTree = ""; }; + FDE5208FE4A05C9114818BC72105E5F7 /* SwiftSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftSupport.swift; path = FBSnapshotTestCase/SwiftSupport.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 0203B6E16A0B9580D529F8D9D17565CB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 2E53AE45FFC635DAAB6422AA6097126D /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4832BDD3D37B2D57809205D834E53728 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B9AD04E077FB832053198FF52D9DAEA9 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8CCD26ED5D9B4902A541718B0C4EC9AD /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + FB194C53F6EC17C6DB32D0BBDC57AE6D /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 96317938B7BBB0DE5B6C6F27B4A6333F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D549E01DA1D5104335CCEABFF870005 /* Foundation.framework in Frameworks */, + CF9DB2096C715EA61E263021EE406DB1 /* QuartzCore.framework in Frameworks */, + 28F2071FFF5C5B0E9DEB6C3FE43A30CC /* UIKit.framework in Frameworks */, + AD4D905241DED4AEAD67447088ACB23D /* XCTest.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A7F6C7B1AE228B955D6515DEFD831398 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 10456B9CCA62048DB1831568B5D98877 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + F35EF10C82A034023B265DCF3C6E7842 /* Pods-Fusuma_Example */, + 832C9A6EF239C6D1658BEA216F80BB00 /* Pods-Fusuma_Tests */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 14B8B9B15ECBE87983FF987239AB2D7B /* Frameworks */ = { + isa = PBXGroup; + children = ( + CD3FB7D37E46A5379C926728A416D78E /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + 150F8F3D038E87D35E80F2285E2E627A /* Fusuma */ = { + isa = PBXGroup; + children = ( + E0FCED99734D68DA9FE46AC9692B3DEA /* Pod */, + 26C431B72423E33B6E01CDA8D9E86C83 /* Support Files */, + ); + name = Fusuma; + path = ../..; + sourceTree = ""; + }; + 26C431B72423E33B6E01CDA8D9E86C83 /* Support Files */ = { + isa = PBXGroup; + children = ( + 31CD7CDA24FC15ED23D4327751FB9396 /* Fusuma.modulemap */, + C47BAC587657A3C6071724268CF61C3A /* Fusuma.xcconfig */, + C7822AFD709D262FF5C2E11974A805EC /* Fusuma-dummy.m */, + 2A8DAE5BB5171C19214D037B040EEF59 /* Fusuma-prefix.pch */, + DF76F18CCA850483F9DBCBB272B7791E /* Fusuma-umbrella.h */, + 2EFEACEE41B88B59F6A24DCEDB59BBB5 /* Info.plist */, + ); + name = "Support Files"; + path = "Example/Pods/Target Support Files/Fusuma"; + sourceTree = ""; + }; + 329CC004AB83B695DB001E6BBD6F7707 /* SwiftSupport */ = { + isa = PBXGroup; + children = ( + FDE5208FE4A05C9114818BC72105E5F7 /* SwiftSupport.swift */, + ); + name = SwiftSupport; + sourceTree = ""; + }; + 5060B33D8CFD3C2E88D6F156E54E3265 /* Core */ = { + isa = PBXGroup; + children = ( + 0EE4692BF9A76DAAA67A8FF4DABD27E8 /* FBSnapshotTestCase.h */, + 2523693A8A7BA4278BFC866F16021FFF /* FBSnapshotTestCase.m */, + 12CC4BD9C5F6D514C917D7942DF2D2F4 /* FBSnapshotTestCasePlatform.h */, + E38041D93EDE9398D62F150F8F25DE47 /* FBSnapshotTestCasePlatform.m */, + 4AC2C5814DCFC7590AC8C46AAB7FCEEF /* FBSnapshotTestController.h */, + BFFD97972C24EE7435D0E04686569BBE /* FBSnapshotTestController.m */, + A729E2AD854B4CEB4EF52289C017EB3B /* UIImage+Compare.h */, + 5999002674B86E70DC7970CEA62F278E /* UIImage+Compare.m */, + 7CAAAB29C54DB2D5220028C4110E45E6 /* UIImage+Diff.h */, + 73003A0752F3CABAA497D1FD1F5E4E44 /* UIImage+Diff.m */, + 0345D737618C6A063BD152389ACCBF87 /* UIImage+Snapshot.h */, + 5121BCE99CCFB208275F3437CCF6EBB6 /* UIImage+Snapshot.m */, + ); + name = Core; + sourceTree = ""; + }; + 5D1A1E5B9D7D0B054374C882B73D91F7 /* Products */ = { + isa = PBXGroup; + children = ( + F952CCC470815E49C0B42A28D0671206 /* FBSnapshotTestCase.framework */, + 5AA781882CCAFF1CA5DC35B3BCC1F553 /* Fusuma.bundle */, + A434175E9C69147A87A7C4CAE30A951F /* Fusuma.framework */, + 3D7394429B9876A34AF637C53F8C1A69 /* Pods_Fusuma_Example.framework */, + 663950C2897BB44D47E66F92F30A85BB /* Pods_Fusuma_Tests.framework */, + ); + name = Products; + sourceTree = ""; + }; + 5FCEB579E2D44D563306F9DA10939F00 /* Classes */ = { + isa = PBXGroup; + children = ( + 4E8373611F7D63DD46B861F01EB6B2D8 /* ReplaceMe.swift */, + ); + path = Classes; + sourceTree = ""; + }; + 7DB346D0F39D3F0E887471402A8071AB = { + isa = PBXGroup; + children = ( + BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */, + E2712C833DF76CEC26C98381E173644F /* Development Pods */, + 14B8B9B15ECBE87983FF987239AB2D7B /* Frameworks */, + FBD2D672921284E66F309CA3462F84D6 /* Pods */, + 5D1A1E5B9D7D0B054374C882B73D91F7 /* Products */, + 10456B9CCA62048DB1831568B5D98877 /* Targets Support Files */, + ); + sourceTree = ""; + }; + 8004835372142699707E98D241D8C23D /* FBSnapshotTestCase */ = { + isa = PBXGroup; + children = ( + 5060B33D8CFD3C2E88D6F156E54E3265 /* Core */, + A78CE87681B42105A65DA44E0F79FC82 /* Support Files */, + 329CC004AB83B695DB001E6BBD6F7707 /* SwiftSupport */, + ); + path = FBSnapshotTestCase; + sourceTree = ""; + }; + 832C9A6EF239C6D1658BEA216F80BB00 /* Pods-Fusuma_Tests */ = { + isa = PBXGroup; + children = ( + AE3C07BDCD86BECD6BE6006374ED8507 /* Info.plist */, + 0F3709A44207C47436B4545A9F0A09A5 /* Pods-Fusuma_Tests.modulemap */, + C55CCA512BC9E4174283BA00EF4D873D /* Pods-Fusuma_Tests-acknowledgements.markdown */, + A590B780507AB1DB52395AEAD1C6A294 /* Pods-Fusuma_Tests-acknowledgements.plist */, + 73CB20963142B3B807D03C987137B5CE /* Pods-Fusuma_Tests-dummy.m */, + A9159462EDC41265390998A43B6D0D8E /* Pods-Fusuma_Tests-frameworks.sh */, + DD32F9ACA7D549946F8FD755BCB0C82C /* Pods-Fusuma_Tests-resources.sh */, + 3F4F636BE78ADF7AAB0AD80C64D3F32B /* Pods-Fusuma_Tests-umbrella.h */, + E66B473CD9E0975235D4ED68F47A8C07 /* Pods-Fusuma_Tests.debug.xcconfig */, + A4351AD76108362655FE221382161321 /* Pods-Fusuma_Tests.release.xcconfig */, + ); + name = "Pods-Fusuma_Tests"; + path = "Target Support Files/Pods-Fusuma_Tests"; + sourceTree = ""; + }; + A78CE87681B42105A65DA44E0F79FC82 /* Support Files */ = { + isa = PBXGroup; + children = ( + 0F01AA0F45B0B5CC535F9884FF44262A /* FBSnapshotTestCase.modulemap */, + 42A681D3AF997235908A3089BB9BCB20 /* FBSnapshotTestCase.xcconfig */, + DF90F95FC2B36AB64D2FB3AF22E996D2 /* FBSnapshotTestCase-dummy.m */, + B3D08C65AB18ACF0D05C7C79DB5737E4 /* FBSnapshotTestCase-prefix.pch */, + 3CDD9962E7C6687DEEC40FC2F5F6DC17 /* Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/FBSnapshotTestCase"; + sourceTree = ""; + }; + CD3FB7D37E46A5379C926728A416D78E /* iOS */ = { + isa = PBXGroup; + children = ( + D31B096AB4A0164C61B63F0E59AD76C9 /* Foundation.framework */, + 0528444EFC68619AD1FEB8A7CD4A01BA /* QuartzCore.framework */, + 2393D1A899C707F79A64672C46ED238F /* UIKit.framework */, + 853C84AC883B6FC690E82525E7ECB377 /* XCTest.framework */, + ); + name = iOS; + sourceTree = ""; + }; + E0FCED99734D68DA9FE46AC9692B3DEA /* Pod */ = { + isa = PBXGroup; + children = ( + 5FCEB579E2D44D563306F9DA10939F00 /* Classes */, + ); + path = Pod; + sourceTree = ""; + }; + E2712C833DF76CEC26C98381E173644F /* Development Pods */ = { + isa = PBXGroup; + children = ( + 150F8F3D038E87D35E80F2285E2E627A /* Fusuma */, + ); + name = "Development Pods"; + sourceTree = ""; + }; + F35EF10C82A034023B265DCF3C6E7842 /* Pods-Fusuma_Example */ = { + isa = PBXGroup; + children = ( + 2F1D2BF82A1AC5CF0693F6CE80D39B61 /* Info.plist */, + 9646EE6ADBD60CAB6CEC25F100CB1807 /* Pods-Fusuma_Example.modulemap */, + EA1A57DE50ED65ED9390392151A8C8BE /* Pods-Fusuma_Example-acknowledgements.markdown */, + 801EE0D54A4586911DEBDEB6A26B5485 /* Pods-Fusuma_Example-acknowledgements.plist */, + 2A8D296BC6DB8D37DCEEEA113E211223 /* Pods-Fusuma_Example-dummy.m */, + 84CFBA2EF6D4CD77AA563A0A5019434D /* Pods-Fusuma_Example-frameworks.sh */, + FCB521867E6606524950DBEC836D30F8 /* Pods-Fusuma_Example-resources.sh */, + DE9DF6B572BEE3083DA90479E85EDD47 /* Pods-Fusuma_Example-umbrella.h */, + A366361C6FE8F0D9503675269FB9769D /* Pods-Fusuma_Example.debug.xcconfig */, + 39CA496CE8B366E877933631498D4661 /* Pods-Fusuma_Example.release.xcconfig */, + ); + name = "Pods-Fusuma_Example"; + path = "Target Support Files/Pods-Fusuma_Example"; + sourceTree = ""; + }; + FBD2D672921284E66F309CA3462F84D6 /* Pods */ = { + isa = PBXGroup; + children = ( + 8004835372142699707E98D241D8C23D /* FBSnapshotTestCase */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 6A3BB9E32BDAD9EDB00EDFE657BDB001 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 821A26883ED14BDCD7EBADD37D671D17 /* FBSnapshotTestCase.h in Headers */, + 41D8739E2720D3535592391C25507158 /* FBSnapshotTestCasePlatform.h in Headers */, + 7BEF20E09F0E864478905311672F91AB /* FBSnapshotTestController.h in Headers */, + 1F118728B3D74089480152A6B660EA9A /* UIImage+Compare.h in Headers */, + 52B0263F90696E7FD87CB146D5C5E2C1 /* UIImage+Diff.h in Headers */, + 723FDDFD804188090511DEFA8309A06B /* UIImage+Snapshot.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 73B5B7F1EB55D782EE63736D7F0F7E74 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + AAE9742FF575EAC61C6CC029E5282131 /* Pods-Fusuma_Tests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 93F784FF32BFA9B4AA28F13080E1E948 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + C1669014DB8183A294075CB5A1749490 /* Fusuma-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A484864533B4DF20593A7AEA52B2249B /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + EB392447B823C18344254D4C13A7320B /* Pods-Fusuma_Example-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 0F59FC5E9FE3F55E728633DB02B81F59 /* Fusuma-Fusuma */ = { + isa = PBXNativeTarget; + buildConfigurationList = 29730FE1084A8D249AD03A08FE165E36 /* Build configuration list for PBXNativeTarget "Fusuma-Fusuma" */; + buildPhases = ( + 4667E9AC7BD6CA2198192D5D646DF1EA /* Sources */, + A7F6C7B1AE228B955D6515DEFD831398 /* Frameworks */, + 05A9DD1523406218854479F7F02A006C /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Fusuma-Fusuma"; + productName = "Fusuma-Fusuma"; + productReference = 5AA781882CCAFF1CA5DC35B3BCC1F553 /* Fusuma.bundle */; + productType = "com.apple.product-type.bundle"; + }; + 495BE7BA2816E52ACF8A9257930AFDA0 /* Fusuma */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7A777FE62F03571EC4D539EFBC057FD6 /* Build configuration list for PBXNativeTarget "Fusuma" */; + buildPhases = ( + E2B71E9FBC4C48996A50CA7F4BFCCD0A /* Sources */, + 8CCD26ED5D9B4902A541718B0C4EC9AD /* Frameworks */, + D8A82D7A98A58CDDC1706CE98BFDE99B /* Resources */, + 93F784FF32BFA9B4AA28F13080E1E948 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + E7EE4ACE04993B3D71F255124052E6AD /* PBXTargetDependency */, + ); + name = Fusuma; + productName = Fusuma; + productReference = A434175E9C69147A87A7C4CAE30A951F /* Fusuma.framework */; + productType = "com.apple.product-type.framework"; + }; + 4A8BF5E2D0451A4A0A9705782CFCEF22 /* Pods-Fusuma_Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4F502A4A06AB92D9A9E8312878D463AC /* Build configuration list for PBXNativeTarget "Pods-Fusuma_Example" */; + buildPhases = ( + 88E187F229695DD39AD3CADAAD46F88C /* Sources */, + 4832BDD3D37B2D57809205D834E53728 /* Frameworks */, + A484864533B4DF20593A7AEA52B2249B /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 24FE1EE482DCCD9C40F60DE2D67314C0 /* PBXTargetDependency */, + ); + name = "Pods-Fusuma_Example"; + productName = "Pods-Fusuma_Example"; + productReference = 3D7394429B9876A34AF637C53F8C1A69 /* Pods_Fusuma_Example.framework */; + productType = "com.apple.product-type.framework"; + }; + A5C935B614DD08342117AD0B06959CB9 /* FBSnapshotTestCase */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0EDC9486793060341F389ED396820195 /* Build configuration list for PBXNativeTarget "FBSnapshotTestCase" */; + buildPhases = ( + 2CC3E7452D970C2994AA3AB9C9EBB620 /* Sources */, + 96317938B7BBB0DE5B6C6F27B4A6333F /* Frameworks */, + 6A3BB9E32BDAD9EDB00EDFE657BDB001 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = FBSnapshotTestCase; + productName = FBSnapshotTestCase; + productReference = F952CCC470815E49C0B42A28D0671206 /* FBSnapshotTestCase.framework */; + productType = "com.apple.product-type.framework"; + }; + BA9C902D836E71A32A4F998A1888BB78 /* Pods-Fusuma_Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = DE64D5CB53250CC80181CB5CC6C7C829 /* Build configuration list for PBXNativeTarget "Pods-Fusuma_Tests" */; + buildPhases = ( + 18EE6D60C809E53945785689A1B7DBDC /* Sources */, + 0203B6E16A0B9580D529F8D9D17565CB /* Frameworks */, + 73B5B7F1EB55D782EE63736D7F0F7E74 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 3730CA69B08A5112658DD7B46ED3FF10 /* PBXTargetDependency */, + 04AF3705AFC281B0CE44B557544E1D4A /* PBXTargetDependency */, + ); + name = "Pods-Fusuma_Tests"; + productName = "Pods-Fusuma_Tests"; + productReference = 663950C2897BB44D47E66F92F30A85BB /* Pods_Fusuma_Tests.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0700; + LastUpgradeCheck = 0700; + }; + buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 7DB346D0F39D3F0E887471402A8071AB; + productRefGroup = 5D1A1E5B9D7D0B054374C882B73D91F7 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + A5C935B614DD08342117AD0B06959CB9 /* FBSnapshotTestCase */, + 495BE7BA2816E52ACF8A9257930AFDA0 /* Fusuma */, + 0F59FC5E9FE3F55E728633DB02B81F59 /* Fusuma-Fusuma */, + 4A8BF5E2D0451A4A0A9705782CFCEF22 /* Pods-Fusuma_Example */, + BA9C902D836E71A32A4F998A1888BB78 /* Pods-Fusuma_Tests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 05A9DD1523406218854479F7F02A006C /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D8A82D7A98A58CDDC1706CE98BFDE99B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 399C248734A4DEF62FD2D524356E776B /* Fusuma.bundle in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 18EE6D60C809E53945785689A1B7DBDC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4A5AE3D95F6770E864AE8EFB5882614A /* Pods-Fusuma_Tests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2CC3E7452D970C2994AA3AB9C9EBB620 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CC2BD0A04199B280AD93F459968CAFC2 /* FBSnapshotTestCase-dummy.m in Sources */, + 35848D70EAC9237246BDF63457729694 /* FBSnapshotTestCase.m in Sources */, + 5D14695A69EC4A8DF7488D0FC59C105C /* FBSnapshotTestCasePlatform.m in Sources */, + AA8501741ABB8D75C6C47DE086BACD37 /* FBSnapshotTestController.m in Sources */, + 52F7A46AB0053D8BB1D793B917D37BB2 /* SwiftSupport.swift in Sources */, + 788E3D9458FE9540469981BE9A0B227C /* UIImage+Compare.m in Sources */, + 163C6E8E5E7CEE1E0BEEB9CA0939DA3A /* UIImage+Diff.m in Sources */, + EDD91D0CC316AC322E1607D3749F1C0A /* UIImage+Snapshot.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4667E9AC7BD6CA2198192D5D646DF1EA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 88E187F229695DD39AD3CADAAD46F88C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 18F301611D39BA3FB4821E3F0756A697 /* Pods-Fusuma_Example-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E2B71E9FBC4C48996A50CA7F4BFCCD0A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0E9793A2578331A4E608C2C1F9DEF0EA /* Fusuma-dummy.m in Sources */, + 2DF7D439515EF3632C8D9E8A4BEC0E9B /* ReplaceMe.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 04AF3705AFC281B0CE44B557544E1D4A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Fusuma; + target = 495BE7BA2816E52ACF8A9257930AFDA0 /* Fusuma */; + targetProxy = 5B5C8E59191AF7EE5EF0407DDCE8686B /* PBXContainerItemProxy */; + }; + 24FE1EE482DCCD9C40F60DE2D67314C0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Fusuma; + target = 495BE7BA2816E52ACF8A9257930AFDA0 /* Fusuma */; + targetProxy = E78EB29E88D43FD2B966748143E958BC /* PBXContainerItemProxy */; + }; + 3730CA69B08A5112658DD7B46ED3FF10 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = FBSnapshotTestCase; + target = A5C935B614DD08342117AD0B06959CB9 /* FBSnapshotTestCase */; + targetProxy = 81401DABADABC65328E9441D0373993B /* PBXContainerItemProxy */; + }; + E7EE4ACE04993B3D71F255124052E6AD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Fusuma-Fusuma"; + target = 0F59FC5E9FE3F55E728633DB02B81F59 /* Fusuma-Fusuma */; + targetProxy = 23C3E3A128D59860342F32A960B00DD4 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 017323F51165FCAA8519A7BE1EBBAD91 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 42A681D3AF997235908A3089BB9BCB20 /* FBSnapshotTestCase.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/FBSnapshotTestCase/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = FBSnapshotTestCase; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 0BB6FC7896D9FAF7FC132AF2B5F1B3A9 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E66B473CD9E0975235D4ED68F47A8C07 /* Pods-Fusuma_Tests.debug.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = "Target Support Files/Pods-Fusuma_Tests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = Pods_Fusuma_Tests; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 10DE1947DAC0ED28F6C0A9F9BD75D546 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = "RELEASE=1"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 3779F0F2C1340186A02C494B6C835B2C /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C47BAC587657A3C6071724268CF61C3A /* Fusuma.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Fusuma/Fusuma-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Fusuma/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Fusuma/Fusuma.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = Fusuma; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 520617715504F3FE3CA9075CFD4065A9 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C47BAC587657A3C6071724268CF61C3A /* Fusuma.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Fusuma/Fusuma-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Fusuma/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Fusuma/Fusuma.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = Fusuma; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 552D02D5BA751AC2E8790D2811D496CA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + ONLY_ACTIVE_ARCH = YES; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + 9263636507E5A6C750D7DB8581979EFE /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 42A681D3AF997235908A3089BB9BCB20 /* FBSnapshotTestCase.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/FBSnapshotTestCase/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = FBSnapshotTestCase; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + B805F68821402408C905217C83EB8CD0 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A4351AD76108362655FE221382161321 /* Pods-Fusuma_Tests.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = "Target Support Files/Pods-Fusuma_Tests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = Pods_Fusuma_Tests; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + DB1232EE9787B15850B9F23A4116A04D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 39CA496CE8B366E877933631498D4661 /* Pods-Fusuma_Example.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = "Target Support Files/Pods-Fusuma_Example/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = Pods_Fusuma_Example; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + E5B69FF7AE6C058B0E8BB0A11224AF45 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C47BAC587657A3C6071724268CF61C3A /* Fusuma.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + PRODUCT_NAME = Fusuma; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + F35E44A3D00673AEBA46108052823596 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C47BAC587657A3C6071724268CF61C3A /* Fusuma.xcconfig */; + buildSettings = { + ENABLE_STRICT_OBJC_MSGSEND = YES; + PRODUCT_NAME = Fusuma; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + FFD3077096FE5A7FDFB3D8ABB255E47C /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A366361C6FE8F0D9503675269FB9769D /* Pods-Fusuma_Example.debug.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + INFOPLIST_FILE = "Target Support Files/Pods-Fusuma_Example/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = Pods_Fusuma_Example; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 0EDC9486793060341F389ED396820195 /* Build configuration list for PBXNativeTarget "FBSnapshotTestCase" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9263636507E5A6C750D7DB8581979EFE /* Debug */, + 017323F51165FCAA8519A7BE1EBBAD91 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 29730FE1084A8D249AD03A08FE165E36 /* Build configuration list for PBXNativeTarget "Fusuma-Fusuma" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E5B69FF7AE6C058B0E8BB0A11224AF45 /* Debug */, + F35E44A3D00673AEBA46108052823596 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 552D02D5BA751AC2E8790D2811D496CA /* Debug */, + 10DE1947DAC0ED28F6C0A9F9BD75D546 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4F502A4A06AB92D9A9E8312878D463AC /* Build configuration list for PBXNativeTarget "Pods-Fusuma_Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FFD3077096FE5A7FDFB3D8ABB255E47C /* Debug */, + DB1232EE9787B15850B9F23A4116A04D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7A777FE62F03571EC4D539EFBC057FD6 /* Build configuration list for PBXNativeTarget "Fusuma" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3779F0F2C1340186A02C494B6C835B2C /* Debug */, + 520617715504F3FE3CA9075CFD4065A9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DE64D5CB53250CC80181CB5CC6C7C829 /* Build configuration list for PBXNativeTarget "Pods-Fusuma_Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0BB6FC7896D9FAF7FC132AF2B5F1B3A9 /* Debug */, + B805F68821402408C905217C83EB8CD0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; +} diff --git a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Fusuma.xcscheme b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Fusuma.xcscheme new file mode 100644 index 00000000..f06ad8e8 --- /dev/null +++ b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Fusuma.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-dummy.m b/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-dummy.m new file mode 100644 index 00000000..fb0c8fe9 --- /dev/null +++ b/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_FBSnapshotTestCase : NSObject +@end +@implementation PodsDummy_FBSnapshotTestCase +@end diff --git a/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch b/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch new file mode 100644 index 00000000..aa992a4a --- /dev/null +++ b/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch @@ -0,0 +1,4 @@ +#ifdef __OBJC__ +#import +#endif + diff --git a/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap b/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap new file mode 100644 index 00000000..733e78b2 --- /dev/null +++ b/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap @@ -0,0 +1,15 @@ +framework module FBSnapshotTestCase { + umbrella header "FBSnapshotTestCase.h" + + export * + module * { export * } + + header "FBSnapshotTestCase.h" + header "FBSnapshotTestCasePlatform.h" + header "FBSnapshotTestController.h" + + private header "UIImage+Compare.h" + private header "UIImage+Diff.h" + private header "UIImage+Snapshot.h" +} + diff --git a/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.xcconfig b/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.xcconfig new file mode 100644 index 00000000..f30c1e2d --- /dev/null +++ b/Example/Pods/Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.xcconfig @@ -0,0 +1,8 @@ +ENABLE_BITCODE = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/FBSnapshotTestCase" "${PODS_ROOT}/Headers/Public" +OTHER_LDFLAGS = -framework "Foundation" -framework "QuartzCore" -framework "UIKit" -framework "XCTest" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Example/Pods/Target Support Files/FBSnapshotTestCase/Info.plist b/Example/Pods/Target Support Files/FBSnapshotTestCase/Info.plist new file mode 100644 index 00000000..9f0e44ce --- /dev/null +++ b/Example/Pods/Target Support Files/FBSnapshotTestCase/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.0.7 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/Fusuma/Fusuma-dummy.m b/Example/Pods/Target Support Files/Fusuma/Fusuma-dummy.m new file mode 100644 index 00000000..690a52c7 --- /dev/null +++ b/Example/Pods/Target Support Files/Fusuma/Fusuma-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Fusuma : NSObject +@end +@implementation PodsDummy_Fusuma +@end diff --git a/Example/Pods/Target Support Files/Fusuma/Fusuma-prefix.pch b/Example/Pods/Target Support Files/Fusuma/Fusuma-prefix.pch new file mode 100644 index 00000000..aa992a4a --- /dev/null +++ b/Example/Pods/Target Support Files/Fusuma/Fusuma-prefix.pch @@ -0,0 +1,4 @@ +#ifdef __OBJC__ +#import +#endif + diff --git a/Example/Pods/Target Support Files/Fusuma/Fusuma-umbrella.h b/Example/Pods/Target Support Files/Fusuma/Fusuma-umbrella.h new file mode 100644 index 00000000..a9a7486b --- /dev/null +++ b/Example/Pods/Target Support Files/Fusuma/Fusuma-umbrella.h @@ -0,0 +1,6 @@ +#import + + +FOUNDATION_EXPORT double FusumaVersionNumber; +FOUNDATION_EXPORT const unsigned char FusumaVersionString[]; + diff --git a/Example/Pods/Target Support Files/Fusuma/Fusuma.modulemap b/Example/Pods/Target Support Files/Fusuma/Fusuma.modulemap new file mode 100644 index 00000000..ba95cd97 --- /dev/null +++ b/Example/Pods/Target Support Files/Fusuma/Fusuma.modulemap @@ -0,0 +1,6 @@ +framework module Fusuma { + umbrella header "Fusuma-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/Fusuma/Fusuma.xcconfig b/Example/Pods/Target Support Files/Fusuma/Fusuma.xcconfig new file mode 100644 index 00000000..ac5c6d2a --- /dev/null +++ b/Example/Pods/Target Support Files/Fusuma/Fusuma.xcconfig @@ -0,0 +1,5 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Fusuma" "${PODS_ROOT}/Headers/Public" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Fusuma/Info.plist b/Example/Pods/Target Support Files/Fusuma/Info.plist new file mode 100644 index 00000000..4ba5fa28 --- /dev/null +++ b/Example/Pods/Target Support Files/Fusuma/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.1.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/Pods-Fusuma_Example/Info.plist b/Example/Pods/Target Support Files/Pods-Fusuma_Example/Info.plist new file mode 100644 index 00000000..69745425 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Fusuma_Example/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-acknowledgements.markdown new file mode 100644 index 00000000..360d62de --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-acknowledgements.markdown @@ -0,0 +1,26 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## Fusuma + +Copyright (c) 2016 ytakzk + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +Generated by CocoaPods - http://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-acknowledgements.plist new file mode 100644 index 00000000..dec34101 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-acknowledgements.plist @@ -0,0 +1,56 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2016 ytakzk <shyss.ak@gmail.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + Title + Fusuma + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - http://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-dummy.m b/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-dummy.m new file mode 100644 index 00000000..a7cfdeda --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_Fusuma_Example : NSObject +@end +@implementation PodsDummy_Pods_Fusuma_Example +@end diff --git a/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-frameworks.sh b/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-frameworks.sh new file mode 100755 index 00000000..e4b729a3 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-frameworks.sh @@ -0,0 +1,91 @@ +#!/bin/sh +set -e + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # use filter instead of exclude so missing patterns dont' throw errors + echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\"" + /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + # Get architectures for current file + archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + stripped="" + for arch in $archs; do + if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" || exit 1 + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi +} + + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "Pods-Fusuma_Example/Fusuma.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "Pods-Fusuma_Example/Fusuma.framework" +fi diff --git a/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-resources.sh b/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-resources.sh new file mode 100755 index 00000000..16774fb4 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-resources.sh @@ -0,0 +1,95 @@ +#!/bin/sh +set -e + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +realpath() { + DIRECTORY="$(cd "${1%/*}" && pwd)" + FILENAME="${1##*/}" + echo "$DIRECTORY/$FILENAME" +} + +install_resource() +{ + case $1 in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.framework) + echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" + xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + /*) + echo "$1" + echo "$1" >> "$RESOURCES_TO_COPY" + ;; + *) + echo "${PODS_ROOT}/$1" + echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; + esac + + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "`realpath $PODS_ROOT`*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-umbrella.h b/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-umbrella.h new file mode 100644 index 00000000..6eaa7f2b --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example-umbrella.h @@ -0,0 +1,6 @@ +#import + + +FOUNDATION_EXPORT double Pods_Fusuma_ExampleVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_Fusuma_ExampleVersionString[]; + diff --git a/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example.debug.xcconfig b/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example.debug.xcconfig new file mode 100644 index 00000000..fea69352 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example.debug.xcconfig @@ -0,0 +1,8 @@ +EMBEDDED_CONTENT_CONTAINS_SWIFT = YES +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/Fusuma.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Fusuma" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-Fusuma_Example +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example.modulemap b/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example.modulemap new file mode 100644 index 00000000..aad44b98 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example.modulemap @@ -0,0 +1,6 @@ +framework module Pods_Fusuma_Example { + umbrella header "Pods-Fusuma_Example-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example.release.xcconfig b/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example.release.xcconfig new file mode 100644 index 00000000..fea69352 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Fusuma_Example/Pods-Fusuma_Example.release.xcconfig @@ -0,0 +1,8 @@ +EMBEDDED_CONTENT_CONTAINS_SWIFT = YES +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/Fusuma.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Fusuma" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-Fusuma_Example +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Info.plist b/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Info.plist new file mode 100644 index 00000000..69745425 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-acknowledgements.markdown new file mode 100644 index 00000000..65b89bd3 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-acknowledgements.markdown @@ -0,0 +1,59 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## Fusuma + +Copyright (c) 2016 ytakzk + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +## FBSnapshotTestCase + +BSD License + +For the FBSnapshotTestCase software + +Copyright (c) 2013, Facebook, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Generated by CocoaPods - http://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-acknowledgements.plist new file mode 100644 index 00000000..b12cf293 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-acknowledgements.plist @@ -0,0 +1,93 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2016 ytakzk <shyss.ak@gmail.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + Title + Fusuma + Type + PSGroupSpecifier + + + FooterText + BSD License + +For the FBSnapshotTestCase software + +Copyright (c) 2013, Facebook, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Title + FBSnapshotTestCase + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - http://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-dummy.m b/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-dummy.m new file mode 100644 index 00000000..34e8bd3d --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_Fusuma_Tests : NSObject +@end +@implementation PodsDummy_Pods_Fusuma_Tests +@end diff --git a/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-frameworks.sh b/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-frameworks.sh new file mode 100755 index 00000000..59028871 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-frameworks.sh @@ -0,0 +1,93 @@ +#!/bin/sh +set -e + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # use filter instead of exclude so missing patterns dont' throw errors + echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\"" + /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + # Get architectures for current file + archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + stripped="" + for arch in $archs; do + if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" || exit 1 + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi +} + + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "Pods-Fusuma_Tests/Fusuma.framework" + install_framework "Pods-Fusuma_Tests/FBSnapshotTestCase.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "Pods-Fusuma_Tests/Fusuma.framework" + install_framework "Pods-Fusuma_Tests/FBSnapshotTestCase.framework" +fi diff --git a/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-resources.sh b/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-resources.sh new file mode 100755 index 00000000..16774fb4 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-resources.sh @@ -0,0 +1,95 @@ +#!/bin/sh +set -e + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +realpath() { + DIRECTORY="$(cd "${1%/*}" && pwd)" + FILENAME="${1##*/}" + echo "$DIRECTORY/$FILENAME" +} + +install_resource() +{ + case $1 in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" + ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" + ;; + *.framework) + echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" + xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" + xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + /*) + echo "$1" + echo "$1" >> "$RESOURCES_TO_COPY" + ;; + *) + echo "${PODS_ROOT}/$1" + echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; + esac + + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "`realpath $PODS_ROOT`*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-umbrella.h b/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-umbrella.h new file mode 100644 index 00000000..ec0f1558 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests-umbrella.h @@ -0,0 +1,6 @@ +#import + + +FOUNDATION_EXPORT double Pods_Fusuma_TestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_Fusuma_TestsVersionString[]; + diff --git a/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests.debug.xcconfig new file mode 100644 index 00000000..9f0c78c7 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests.debug.xcconfig @@ -0,0 +1,8 @@ +EMBEDDED_CONTENT_CONTAINS_SWIFT = YES +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/FBSnapshotTestCase.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/Fusuma.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "FBSnapshotTestCase" -framework "Fusuma" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-Fusuma_Tests +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests.modulemap b/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests.modulemap new file mode 100644 index 00000000..0f09b997 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_Fusuma_Tests { + umbrella header "Pods-Fusuma_Tests-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests.release.xcconfig b/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests.release.xcconfig new file mode 100644 index 00000000..9f0c78c7 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Fusuma_Tests/Pods-Fusuma_Tests.release.xcconfig @@ -0,0 +1,8 @@ +EMBEDDED_CONTENT_CONTAINS_SWIFT = YES +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/FBSnapshotTestCase.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/Fusuma.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "FBSnapshotTestCase" -framework "Fusuma" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-Fusuma_Tests +PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Fusuma.podspec b/Fusuma.podspec index 33957c44..e0371c7d 100644 --- a/Fusuma.podspec +++ b/Fusuma.podspec @@ -1,30 +1,13 @@ -# -# Be sure to run `pod lib lint Fusuma.podspec' to ensure this is a -# valid spec before submitting. -# -# Any lines starting with a # are optional, but their use is encouraged -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# - Pod::Spec.new do |s| s.name = "Fusuma" s.version = "0.1.0" - s.summary = "A short description of Fusuma." - -# This description is used to generate tags and improve search results. -# * Think: What does it do? Why did you write it? What is the focus? -# * Try to keep it short, snappy and to the point. -# * Write the description between the DESC delimiters below. -# * Finally, don't worry about the indent, CocoaPods strips it! - s.description = <<-DESC - DESC + s.summary = "Instagram-like photo browser" - s.homepage = "https://github.com//Fusuma" - # s.screenshots = "www.example.com/screenshots_1", "www.example.com/screenshots_2" + s.homepage = "https://github.com/ytakzk/Fusuma" + s.screenshots = "https://raw.githubusercontent.com/wiki/ytakzk/Fusuma/images/main.jpg" s.license = 'MIT' s.author = { "ytakzk" => "shyss.ak@gmail.com" } s.source = { :git => "https://github.com//Fusuma.git", :tag => s.version.to_s } - # s.social_media_url = 'https://twitter.com/' s.platform = :ios, '8.0' s.requires_arc = true @@ -34,7 +17,4 @@ Pod::Spec.new do |s| 'Fusuma' => ['Pod/Assets/*.png'] } - # s.public_header_files = 'Pod/Classes/**/*.h' - # s.frameworks = 'UIKit', 'MapKit' - # s.dependency 'AFNetworking', '~> 2.3' end