├── Screenshot1.gif ├── Screenshot2.gif ├── scripts ├── certs │ ├── apple.cer │ ├── dist.cer.enc │ └── dist.p12.enc ├── remove-key.sh ├── update-bundle.sh ├── add-key.sh ├── sign-and-upload.sh └── profile │ └── CPImageViewer.mobileprovision.enc ├── CPImageViewer ├── Assets.xcassets │ ├── Contents.json │ ├── 1.imageset │ │ ├── 1.png │ │ └── Contents.json │ ├── 2.imageset │ │ ├── 2.png │ │ └── Contents.json │ ├── 3.imageset │ │ ├── 3.png │ │ └── Contents.json │ ├── 4.imageset │ │ ├── 4.png │ │ └── Contents.json │ ├── 5.imageset │ │ ├── 5.png │ │ └── Contents.json │ ├── 6.imageset │ │ ├── 6.png │ │ └── Contents.json │ ├── 7.imageset │ │ ├── 7.png │ │ └── Contents.json │ ├── 8.imageset │ │ ├── 8.png │ │ └── Contents.json │ ├── 9.imageset │ │ ├── 9.png │ │ └── Contents.json │ ├── 10.imageset │ │ ├── 10.png │ │ └── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── CollectionViewCell.swift ├── Info.plist ├── GeneralViewController.swift ├── AppDelegate.swift ├── CollectionViewController.swift ├── TableViewController.swift ├── ViewController.swift └── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── CPImageViewer.xcodeproj ├── xcuserdata │ ├── zhaowei.xcuserdatad │ │ ├── xcdebugger │ │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ │ ├── xcschememanagement.plist │ │ │ └── CPImageViewer.xcscheme │ └── WZ.xcuserdatad │ │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ └── xcschememanagement.plist ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcuserdata │ │ ├── WZ.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ │ └── zhaowei.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ └── xcshareddata │ │ └── WorkspaceSettings.xcsettings ├── xcshareddata │ └── xcschemes │ │ ├── CPImageViewer.xcscheme │ │ └── CPImageViewerExample.xcscheme └── project.pbxproj ├── CPImageViewer.podspec ├── Classes ├── CPImageViewer.h ├── Info.plist ├── CPImageControllerProtocol.swift ├── CPImageViewerAnimator.swift ├── CPImageViewerAnimationTransition.swift ├── CPImageViewerViewController.swift └── CPImageViewerInteractiveTransition.swift ├── CPImageViewerTests ├── Info.plist └── CPImageViewerTests.swift ├── LICENSE ├── .gitignore ├── README.md └── .travis.yml /Screenshot1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/genius/CPImageViewer/master/Screenshot1.gif -------------------------------------------------------------------------------- /Screenshot2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/genius/CPImageViewer/master/Screenshot2.gif -------------------------------------------------------------------------------- /scripts/certs/apple.cer: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/genius/CPImageViewer/master/scripts/certs/apple.cer -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/1.imageset/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/genius/CPImageViewer/master/CPImageViewer/Assets.xcassets/1.imageset/1.png -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/2.imageset/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/genius/CPImageViewer/master/CPImageViewer/Assets.xcassets/2.imageset/2.png -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/3.imageset/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/genius/CPImageViewer/master/CPImageViewer/Assets.xcassets/3.imageset/3.png -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/4.imageset/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/genius/CPImageViewer/master/CPImageViewer/Assets.xcassets/4.imageset/4.png -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/5.imageset/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/genius/CPImageViewer/master/CPImageViewer/Assets.xcassets/5.imageset/5.png -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/6.imageset/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/genius/CPImageViewer/master/CPImageViewer/Assets.xcassets/6.imageset/6.png -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/7.imageset/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/genius/CPImageViewer/master/CPImageViewer/Assets.xcassets/7.imageset/7.png -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/8.imageset/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/genius/CPImageViewer/master/CPImageViewer/Assets.xcassets/8.imageset/8.png -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/9.imageset/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/genius/CPImageViewer/master/CPImageViewer/Assets.xcassets/9.imageset/9.png -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/10.imageset/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/genius/CPImageViewer/master/CPImageViewer/Assets.xcassets/10.imageset/10.png -------------------------------------------------------------------------------- /scripts/remove-key.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | security delete-keychain ios-build.keychain 3 | rm -f ~/Library/MobileDevice/Provisioning\ Profiles/$PROFILE_NAME.mobileprovision 4 | -------------------------------------------------------------------------------- /CPImageViewer.xcodeproj/xcuserdata/zhaowei.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /CPImageViewer.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CPImageViewer.xcodeproj/project.xcworkspace/xcuserdata/WZ.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/genius/CPImageViewer/master/CPImageViewer.xcodeproj/project.xcworkspace/xcuserdata/WZ.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /CPImageViewer.xcodeproj/project.xcworkspace/xcuserdata/zhaowei.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/genius/CPImageViewer/master/CPImageViewer.xcodeproj/project.xcworkspace/xcuserdata/zhaowei.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /CPImageViewer.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /CPImageViewer/CollectionViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionViewCell.swift 3 | // CPImageViewer 4 | // 5 | // Created by ZhaoWei on 16/2/27. 6 | // Copyright © 2016年 cp3hnu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class CollectionViewCell: UICollectionViewCell { 12 | @IBOutlet var imageView: UIImageView! 13 | 14 | @IBOutlet var label: UILabel! 15 | } 16 | -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "1.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "2.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "3.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "4.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "5.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "6.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/7.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "7.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/8.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "8.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/9.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "9.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/10.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "10.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /CPImageViewer.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "CPImageViewer" 3 | s.version = "3.0.1" 4 | s.summary = "Viewing a single image using transition animation." 5 | s.homepage = "https://github.com/cp3hnu/CPImageViewer.git" 6 | s.license = 'MIT' 7 | s.author = { "Wei Zhao" => "cp3hnu@gmail.com" } 8 | s.source = { :git => "https://github.com/cp3hnu/CPImageViewer.git", :tag => s.version } 9 | s.platform = :ios, '8.0' 10 | s.requires_arc = true 11 | s.source_files = 'Classes/*.swift' 12 | end 13 | -------------------------------------------------------------------------------- /Classes/CPImageViewer.h: -------------------------------------------------------------------------------- 1 | // 2 | // CPImageViewer.h 3 | // CPImageViewer 4 | // 5 | // Created by CP3 on 16/5/7. 6 | // Copyright © 2016年 cp3hnu. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for CPImageViewer. 12 | FOUNDATION_EXPORT double CPImageViewerVersionNumber; 13 | 14 | //! Project version string for CPImageViewer. 15 | FOUNDATION_EXPORT const unsigned char CPImageViewerVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /CPImageViewer.xcodeproj/xcuserdata/WZ.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /scripts/update-bundle.sh: -------------------------------------------------------------------------------- 1 | if [ ! -z "$INFO_PLIST" ]; then 2 | /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $TRAVIS_BUILD_NUMBER" "$INFO_PLIST" 3 | echo "Set CFBundleVersion to $TRAVIS_BUILD_NUMBER" 4 | fi 5 | 6 | if [ ! -z "$BUNDLE_IDENTIFIER" ]; then 7 | /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $BUNDLE_IDENTIFIER" "$INFO_PLIST" 8 | echo "Set CFBundleIdentifier to $BUNDLE_IDENTIFIER" 9 | fi 10 | 11 | if [ ! -z "$BUNDLE_DISPLAY_NAME" ]; then 12 | /usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName $BUNDLE_DISPLAY_NAME" "$INFO_PLIST" 13 | echo "Set CFBundleDisplayName to $BUNDLE_DISPLAY_NAME" 14 | fi 15 | -------------------------------------------------------------------------------- /CPImageViewer.xcodeproj/xcuserdata/zhaowei.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | CPImageViewer.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 95D3A30E1C71E26F003A750C 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /CPImageViewer/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /CPImageViewerTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Classes/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 3.0.1 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 0 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /scripts/add-key.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | KEY_CHAIN=ios-build.keychain 4 | security create-keychain -p travis $KEY_CHAIN 5 | # Make the keychain the default so identities are found 6 | security default-keychain -s $KEY_CHAIN 7 | # Unlock the keychain 8 | security unlock-keychain -p travis $KEY_CHAIN 9 | # Set keychain locking timeout to 3600 seconds 10 | security set-keychain-settings -t 3600 -u $KEY_CHAIN 11 | 12 | security import ./scripts/certs/apple.cer -k $KEY_CHAIN -T /usr/bin/codesign 13 | security import ./scripts/certs/dist.cer -k $KEY_CHAIN -T /usr/bin/codesign 14 | security import ./scripts/certs/dist.p12 -k $KEY_CHAIN -P $KEY_PASSWORD -T /usr/bin/codesign 15 | echo "Add keychain to keychain-list" 16 | security find-identity -p codesigning $KEY_CHAIN 17 | 18 | mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles 19 | cp ./scripts/profile/$PROFILE_NAME.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/ 20 | echo $PROFILE_NAME -------------------------------------------------------------------------------- /CPImageViewer.xcodeproj/xcuserdata/WZ.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | CPImageViewer.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 1 11 | 12 | CPImageViewerExample.xcscheme_^#shared#^_ 13 | 14 | orderHint 15 | 0 16 | 17 | 18 | SuppressBuildableAutocreation 19 | 20 | 353941661CDDF47E0044FD7C 21 | 22 | primary 23 | 24 | 25 | 3539416F1CDDF47F0044FD7C 26 | 27 | primary 28 | 29 | 30 | 95D3A30E1C71E26F003A750C 31 | 32 | primary 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Wei Zhao 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /CPImageViewerTests/CPImageViewerTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CPImageViewerTests.swift 3 | // CPImageViewerTests 4 | // 5 | // Created by CP3 on 16/5/7. 6 | // Copyright © 2016年 cp3hnu. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import CPImageViewer 11 | 12 | class CPImageViewerTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | // This is an example of a functional test case. 26 | // Use XCTAssert and related functions to verify your tests produce the correct results. 27 | } 28 | 29 | func testPerformanceExample() { 30 | // This is an example of a performance test case. 31 | self.measureBlock { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /CPImageViewer/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 3.0.1 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UIViewControllerBasedStatusBarAppearance 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /CPImageViewer/GeneralViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NormalViewController.swift 3 | // ImageViewer 4 | // 5 | // Created by ZhaoWei on 16/2/23. 6 | // Copyright © 2016年 cp3hnu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import CPImageViewer 11 | 12 | class GeneralViewController: UIViewController, CPImageControllerProtocol { 13 | 14 | var isPresented = false 15 | 16 | @IBOutlet var animationImageView: UIImageView! 17 | var animator = CPImageViewerAnimator() 18 | 19 | override func viewDidLoad() { 20 | super.viewDidLoad() 21 | 22 | let tap = UITapGestureRecognizer(target: self, action: #selector(GeneralViewController.tap)) 23 | animationImageView.addGestureRecognizer(tap) 24 | animationImageView.userInteractionEnabled = true 25 | 26 | if !isPresented { 27 | self.navigationController?.delegate = animator 28 | } 29 | } 30 | 31 | func tap() { 32 | let controller = CPImageViewerViewController() 33 | controller.transitioningDelegate = animator 34 | controller.image = animationImageView.image 35 | 36 | if !isPresented { 37 | controller.viewerStyle = .Push 38 | controller.title = "CPImageViewer" 39 | self.navigationController?.pushViewController(controller, animated: true) 40 | } else { 41 | self.presentViewController(controller, animated: true, completion: nil) 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /scripts/sign-and-upload.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | if [[ "$TRAVIS_PULL_REQUEST" != "false" ]]; then 3 | echo "This is a pull request. No deployment will be done." 4 | exit 0 5 | fi 6 | if [[ "$TRAVIS_BRANCH" != "master" ]]; then 7 | echo "Testing on a branch other than master. No deployment will be done." 8 | exit 0 9 | fi 10 | 11 | # Thanks @djacobs https://gist.github.com/djacobs/2411095 12 | # Thanks @johanneswuerbach https://gist.github.com/johanneswuerbach/5559514 13 | 14 | PROVISIONING_PROFILE="$HOME/Library/MobileDevice/Provisioning Profiles/$PROFILE_NAME.mobileprovision" 15 | OUTPUTDIR="$PWD/build/Release-iphoneos" 16 | 17 | echo "***************************" 18 | echo "* Signing *" 19 | echo "***************************" 20 | xcrun -log -sdk iphoneos PackageApplication "$OUTPUTDIR/$APP_NAME.app" -o "$OUTPUTDIR/$APP_NAME.ipa" -sign "$DEVELOPER_NAME" -embed "$PROVISIONING_PROFILE" 21 | 22 | zip -r -9 "$OUTPUTDIR/$APP_NAME.app.dSYM.zip" "$OUTPUTDIR/$APP_NAME.app.dSYM" 23 | 24 | RELEASE_DATE=`date '+%Y-%m-%d %H:%M:%S'` 25 | RELEASE_NOTES="Build: $TRAVIS_BUILD_NUMBER\nUploaded: $RELEASE_DATE" 26 | 27 | if [ ! -z "$HOCKEY_APP_ID" ] && [ ! -z "$HOCKEY_APP_TOKEN" ]; then 28 | echo "" 29 | echo "***************************" 30 | echo "* Uploading to Hockeyapp *" 31 | echo "***************************" 32 | curl https://rink.hockeyapp.net/api/2/apps/$HOCKEY_APP_ID/app_versions \ 33 | -F status="2" \ 34 | -F notify="0" \ 35 | -F notes="$RELEASE_NOTES" \ 36 | -F notes_type="0" \ 37 | -F ipa="@$OUTPUTDIR/$APP_NAME.ipa" \ 38 | -F dsym="@$OUTPUTDIR/$APP_NAME.app.dSYM.zip" \ 39 | -H "X-HockeyAppToken: $HOCKEY_APP_TOKEN" 40 | fi 41 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata 19 | 20 | ## Other 21 | *.xccheckout 22 | *.moved-aside 23 | *.xcuserstate 24 | *.xcscmblueprint 25 | 26 | ## Obj-C/Swift specific 27 | *.hmap 28 | *.ipa 29 | 30 | ## Playgrounds 31 | timeline.xctimeline 32 | playground.xcworkspace 33 | 34 | # Swift Package Manager 35 | # 36 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 37 | # Packages/ 38 | .build/ 39 | 40 | # CocoaPods 41 | # 42 | # We recommend against adding the Pods directory to your .gitignore. However 43 | # you should judge for yourself, the pros and cons are mentioned at: 44 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 45 | # 46 | # Pods/ 47 | 48 | # Carthage 49 | # 50 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 51 | # Carthage/Checkouts 52 | 53 | Carthage/Build 54 | 55 | # fastlane 56 | # 57 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 58 | # screenshots whenever they are needed. 59 | # For more information about the recommended setup visit: 60 | # https://github.com/fastlane/fastlane/blob/master/docs/Gitignore.md 61 | 62 | fastlane/report.xml 63 | fastlane/screenshots 64 | 65 | #injectionforxcode 66 | iOSInjectionProject/ 67 | -------------------------------------------------------------------------------- /Classes/CPImageControllerProtocol.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CPImageControllerProtocol.swift 3 | // CPImageViewer 4 | // 5 | // Created by CP3 on 16/5/12. 6 | // Copyright © 2016年 cp3hnu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import ObjectiveC 11 | 12 | public protocol CPImageControllerProtocol { 13 | /// The animation imageView 14 | var animationImageView: UIImageView! { get } 15 | } 16 | 17 | //http://stackoverflow.com/questions/24133058/is-there-a-way-to-set-associated-objects-in-swift/24133626#24133626 18 | //http://nshipster.cn/swift-objc-runtime/ 19 | 20 | extension UINavigationController : CPImageControllerProtocol { 21 | 22 | /// The animation imageView conforming to `CPImageControllerProtocol` 23 | public var animationImageView: UIImageView! { 24 | get { 25 | return objc_getAssociatedObject(self, &AssociatedKeys.DescriptiveName) as! UIImageView 26 | } 27 | set { 28 | return objc_setAssociatedObject(self, &AssociatedKeys.DescriptiveName, newValue, .OBJC_ASSOCIATION_RETAIN) 29 | } 30 | } 31 | 32 | private struct AssociatedKeys { 33 | static var DescriptiveName = "cp_navigation_animationImageView" 34 | } 35 | } 36 | 37 | 38 | extension UITabBarController : CPImageControllerProtocol { 39 | 40 | /// The animation imageView conforming to `CPImageControllerProtocol` 41 | public var animationImageView: UIImageView! { 42 | get { 43 | return objc_getAssociatedObject(self, &AssociatedKeys.DescriptiveName) as! UIImageView 44 | } 45 | set { 46 | return objc_setAssociatedObject(self, &AssociatedKeys.DescriptiveName, newValue, .OBJC_ASSOCIATION_RETAIN) 47 | } 48 | } 49 | 50 | private struct AssociatedKeys { 51 | static var DescriptiveName = "cp_tabBar_animationImageView" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /scripts/certs/dist.cer.enc: -------------------------------------------------------------------------------- 1 | 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 32 | -------------------------------------------------------------------------------- /CPImageViewer/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // CPImageViewer 4 | // 5 | // Created by ZhaoWei on 16/2/15. 6 | // Copyright © 2016年 cp3hnu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 18 | // Override point for customization after application launch. 19 | return true 20 | } 21 | 22 | func applicationWillResignActive(application: UIApplication) { 23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 24 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 25 | } 26 | 27 | func applicationDidEnterBackground(application: UIApplication) { 28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | func applicationWillEnterForeground(application: UIApplication) { 33 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | func applicationDidBecomeActive(application: UIApplication) { 37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 38 | } 39 | 40 | func applicationWillTerminate(application: UIApplication) { 41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /CPImageViewer/CollectionViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionViewController.swift 3 | // CPImageViewer 4 | // 5 | // Created by ZhaoWei on 16/2/27. 6 | // Copyright © 2016年 cp3hnu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import CPImageViewer 11 | 12 | private let reuseIdentifier = "Cell" 13 | 14 | class CollectionViewController: UICollectionViewController, CPImageControllerProtocol { 15 | 16 | var isPresented = false 17 | var animationImageView: UIImageView! 18 | var animator = CPImageViewerAnimator() 19 | 20 | override func viewDidLoad() { 21 | super.viewDidLoad() 22 | 23 | if !isPresented { 24 | self.navigationController?.delegate = animator 25 | } 26 | } 27 | 28 | // MARK: UICollectionViewDataSource 29 | override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 30 | return 1 31 | } 32 | 33 | 34 | override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 35 | return 10 36 | } 37 | 38 | override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 39 | let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! CollectionViewCell 40 | 41 | // Configure the cell 42 | cell.imageView.image = UIImage(named: "\(indexPath.item + 1)") 43 | cell.label.text = "\(indexPath.item + 1)" 44 | 45 | return cell 46 | } 47 | 48 | // MARK: UICollectionViewDelegate 49 | override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 50 | 51 | let cell = collectionView.cellForItemAtIndexPath(indexPath) as! CollectionViewCell 52 | 53 | animationImageView = cell.imageView 54 | 55 | tap() 56 | } 57 | 58 | func tap() { 59 | let controller = CPImageViewerViewController() 60 | controller.transitioningDelegate = animator 61 | controller.image = animationImageView.image 62 | 63 | if !isPresented { 64 | controller.viewerStyle = .Push 65 | controller.title = "CPImageViewer" 66 | self.navigationController?.pushViewController(controller, animated: true) 67 | } else { 68 | self.presentViewController(controller, animated: true, completion: nil) 69 | } 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /CPImageViewer/TableViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TableViewController.swift 3 | // CPImageViewer 4 | // 5 | // Created by ZhaoWei on 16/2/27. 6 | // Copyright © 2016年 cp3hnu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import CPImageViewer 11 | 12 | private let reuseIdentifier = "Cell" 13 | 14 | class TableViewController: UITableViewController, CPImageControllerProtocol { 15 | 16 | var isPresented = false 17 | var animationImageView: UIImageView! 18 | var animator = CPImageViewerAnimator() 19 | 20 | override func viewDidLoad() { 21 | super.viewDidLoad() 22 | 23 | if !isPresented { 24 | self.navigationController?.delegate = animator 25 | } 26 | } 27 | 28 | // MARK: - Table view data source 29 | override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 30 | return 1 31 | } 32 | 33 | override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 34 | return 10 35 | } 36 | 37 | override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 38 | let cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier, forIndexPath: indexPath) 39 | 40 | let name = "\(indexPath.row + 1)" 41 | let imageView = cell.contentView.viewWithTag(100) as! UIImageView 42 | let label = cell.contentView.viewWithTag(101) as! UILabel 43 | imageView.image = UIImage(named: name) 44 | label.text = name 45 | 46 | return cell 47 | } 48 | 49 | override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 50 | tableView.deselectRowAtIndexPath(indexPath, animated: false) 51 | let cell = tableView.cellForRowAtIndexPath(indexPath) 52 | let imageView = cell!.contentView.viewWithTag(100) as! UIImageView 53 | 54 | animationImageView = imageView 55 | 56 | tap() 57 | } 58 | 59 | func tap() { 60 | let controller = CPImageViewerViewController() 61 | controller.transitioningDelegate = animator 62 | controller.image = animationImageView.image 63 | 64 | if !isPresented { 65 | controller.viewerStyle = .Push 66 | controller.title = "CPImageViewer" 67 | 68 | self.navigationController?.pushViewController(controller, animated: true) 69 | } else { 70 | self.presentViewController(controller, animated: true, completion: nil) 71 | } 72 | } 73 | 74 | } 75 | -------------------------------------------------------------------------------- /CPImageViewer/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // ImageViewer 4 | // 5 | // Created by ZhaoWei on 16/2/23. 6 | // Copyright © 2016年 cp3hnu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ViewController: UITableViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | // Do any additional setup after loading the view, typically from a nib. 16 | 17 | self.title = "CPImageViewer Demo" 18 | } 19 | 20 | override func didReceiveMemoryWarning() { 21 | super.didReceiveMemoryWarning() 22 | // Dispose of any resources that can be recreated. 23 | } 24 | 25 | override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 26 | return 2 27 | } 28 | 29 | override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 30 | return 3 31 | } 32 | 33 | override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 34 | let cell = tableView.dequeueReusableCellWithIdentifier("Cell")! 35 | switch indexPath.row { 36 | case 0: 37 | cell.textLabel?.text = "General" 38 | 39 | case 1: 40 | cell.textLabel?.text = "TableView" 41 | 42 | case 2: 43 | cell.textLabel?.text = "CollectionView" 44 | 45 | default: 46 | break 47 | } 48 | 49 | return cell 50 | } 51 | 52 | override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 53 | switch section { 54 | case 0: 55 | return "Present" 56 | default: 57 | return "Navigation" 58 | } 59 | } 60 | 61 | override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 62 | 63 | var isPresented = false 64 | if indexPath.section == 0 { 65 | isPresented = true 66 | } 67 | 68 | let storyboard = UIStoryboard(name: "Main", bundle: nil) 69 | var controller: UIViewController 70 | if indexPath.row == 0 { 71 | controller = storyboard.instantiateViewControllerWithIdentifier("GeneralVC") 72 | (controller as! GeneralViewController).isPresented = isPresented 73 | } else if indexPath.row == 1 { 74 | controller = storyboard.instantiateViewControllerWithIdentifier("TableVC") 75 | (controller as! TableViewController).isPresented = isPresented 76 | } else { 77 | controller = storyboard.instantiateViewControllerWithIdentifier("CollectionVC") 78 | (controller as! CollectionViewController).isPresented = isPresented 79 | } 80 | 81 | self.navigationController?.pushViewController(controller, animated: true) 82 | } 83 | } 84 | 85 | -------------------------------------------------------------------------------- /CPImageViewer/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /CPImageViewer.xcodeproj/xcshareddata/xcschemes/CPImageViewer.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /Classes/CPImageViewerAnimator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseViewController.swift 3 | // CPImageViewer 4 | // 5 | // Created by ZhaoWei on 16/2/27. 6 | // Copyright © 2016年 cp3hnu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public class CPImageViewerAnimator: NSObject, UINavigationControllerDelegate, UIViewControllerTransitioningDelegate { 12 | 13 | private let animator = CPImageViewerAnimationTransition() 14 | private let interativeAnimator = CPImageViewerInteractiveTransition() 15 | 16 | //MARK: - UIViewControllerTransitioningDelegate 17 | public func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? { 18 | 19 | if source is CPImageControllerProtocol && presenting is CPImageControllerProtocol && presented is CPImageViewerViewController { 20 | if let navi = presenting as? UINavigationController { 21 | navi.animationImageView = (source as! CPImageControllerProtocol).animationImageView 22 | } else if let tabBarVC = presenting as? UITabBarController { 23 | tabBarVC.animationImageView = (source as! CPImageControllerProtocol).animationImageView 24 | } 25 | 26 | interativeAnimator.wireToViewController(presented as! CPImageViewerViewController) 27 | interativeAnimator.isPresented = true 28 | animator.isBack = false 29 | return animator 30 | } 31 | 32 | return nil 33 | } 34 | 35 | public func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { 36 | 37 | if dismissed is CPImageViewerViewController { 38 | animator.isBack = true 39 | return animator 40 | } 41 | 42 | return nil 43 | } 44 | 45 | public func interactionControllerForDismissal(animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { 46 | return interativeAnimator.interactionInProgress ? interativeAnimator : nil 47 | } 48 | 49 | //MARK: - UINavigationDelegate 50 | public func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { 51 | 52 | if operation == .Push && fromVC is CPImageControllerProtocol && toVC is CPImageViewerViewController { 53 | interativeAnimator.wireToViewController(toVC as! CPImageViewerViewController) 54 | interativeAnimator.isPresented = false 55 | animator.isBack = false 56 | return animator 57 | } else if operation == .Pop && fromVC is CPImageViewerViewController && toVC is CPImageControllerProtocol { 58 | animator.isBack = true 59 | return animator 60 | } 61 | 62 | return nil 63 | } 64 | 65 | public func navigationController(navigationController: UINavigationController, interactionControllerForAnimationController animationController: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { 66 | return interativeAnimator.interactionInProgress ? interativeAnimator : nil 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CPImageViewer 2 | 3 | Viewing a single image using transition animation. Supporting presentation and push & pop. 4 | 5 | ## Screenshot 6 | 7 | #####Present & Dismiss 8 | 9 | ![](Screenshot1.gif) 10 | 11 | 12 | 13 | #####Push & Pop 14 | 15 | ![](Screenshot2.gif) 16 | 17 | ## Installation 18 | 19 | ### Manually 20 | 21 | The simplest way to install this library is to copy `Classes/*.swift` to your project. 22 | 23 | ### CocoaPods 24 | 25 | You can also install this library using CocoaPods. Just add this line to your Podfile: 26 | 27 | ``` ruby 28 | platform :ios, '8.0' 29 | use_frameworks! 30 | 31 | pod 'CPImageViewer' 32 | ``` 33 | 34 | Then import library module like so: 35 | 36 | ``` swift 37 | import CPImageViewer 38 | ``` 39 | 40 | ### Carthage 41 | 42 | ```swift 43 | github "cp3hnu/CPImageViewer" 44 | ``` 45 | 46 | * Drag and drop *CPImageViewer.framework* from /Carthage/Build/iOS/ to Linked frameworks and libraries in Xcode (Project>Target>General>Linked frameworks and libraries) 47 | 48 | * Add new run script 49 | 50 | ``` 51 | /usr/local/bin/carthage copy-frameworks 52 | ``` 53 | 54 | * Add Input files *$(SRCROOT)/Carthage/Build/iOS/CPImageViewer.framework* 55 | 56 | ​ 57 | 58 | ## Properties 59 | 60 | These properties is global and applied to the whole project. 61 | 62 | ``` swift 63 | /// The viewer style. Defaults to Presentation 64 | public var viewerStyle = CPImageViewerStyle.Presentation 65 | 66 | /// The image of animation image view 67 | public var image: UIImage? 68 | 69 | /// The title of *navigationItem.rightBarButtonItem* when viewerStyle is Push 70 | public var rightBarItemTitle: String? 71 | 72 | /// The image of *navigationItem.rightBarButtonItem* when viewerStyle is Push 73 | public var rightBarItemImage: UIImage? 74 | 75 | /// The action of *navigationItem.rightBarButtonItem* when viewerStyle is Push 76 | public var rightAction: ((Void) -> (Void))? 77 | ``` 78 | 79 | 80 | 81 | ## Usage 82 | 83 | It's very easy to use **CPImageViewer**. 84 | 85 | Firstly, conforming to *CPImageControllerProtocol* protocol and initializing the *animationImageView* or assigning it an image view. 86 | ``` swift 87 | class ViewController: UIViewController, ImageControllerProtocol { 88 | var animationImageView: UIImageView! 89 | } 90 | 91 | override func viewDidLoad() { 92 | animationImageView = UIImageView() 93 | animationImageView.frame = <#frame#> 94 | animationImageView.image = <#image#> 95 | self.view.addSubview(animationImageView) 96 | } 97 | ``` 98 | 99 | Then, presenting the *CPImageViewerViewController* 100 | 101 | ``` swift 102 | let controller = CPImageViewerViewController() 103 | controller.transitioningDelegate = CPImageViewerAnimator() 104 | controller.image = animationImageView.image 105 | self.presentViewController(controller, animated: true, completion: nil) 106 | ``` 107 | 108 | or pushing the *CPImageViewerViewController* 109 | 110 | ``` swift 111 | override func viewDidLoad() { 112 | self.navigationController?.delegate = CPImageViewerAnimator() 113 | } 114 | 115 | let controller = CPImageViewerViewController() 116 | controller.viewerStyle = .Push 117 | controller.image = animationImageView.image 118 | controller.title = "CPImageViewer" 119 | self.navigationController?.pushViewController(controller, animated: true) 120 | ``` 121 | 122 | 123 | 124 | ## Requirements 125 | 126 | * Swift 2.2 127 | * Xcode 7.3 128 | * iOS 8+ 129 | 130 | ## License 131 | 132 | Released under the MIT license. See LICENSE for details. -------------------------------------------------------------------------------- /CPImageViewer.xcodeproj/xcuserdata/zhaowei.xcuserdatad/xcschemes/CPImageViewer.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | osx_image: xcode7.3 3 | before_script: 4 | - openssl aes-256-cbc -k "$ENCRYPTION_SECRET" -in scripts/profile/CPImageViewer.mobileprovision.enc 5 | -d -a -out scripts/profile/CPImageViewer.mobileprovision 6 | - openssl aes-256-cbc -k "$ENCRYPTION_SECRET" -in scripts/certs/dist.cer.enc -d -a 7 | -out scripts/certs/dist.cer 8 | - openssl aes-256-cbc -k "$ENCRYPTION_SECRET" -in scripts/certs/dist.p12.enc -d -a 9 | -out scripts/certs/dist.p12 10 | - "./scripts/add-key.sh" 11 | script: 12 | - xcodebuild -project CPImageViewer.xcodeproj -target CPImageViewer -sdk iphoneos 13 | -configuration Release OBJROOT="$PWD/build" SYMROOT="$PWD/build" ONLY_ACTIVE_ARCH=NO CODE_SIGN_IDENTITY="$DEVELOPER_NAME" 'CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist' 14 | after_script: 15 | - "./scripts/remove-key.sh" 16 | after_success: 17 | - "./scripts/sign-and-upload.sh" 18 | env: 19 | global: 20 | - APP_NAME="CPImageViewer" 21 | - 'DEVELOPER_NAME="iPhone Distribution: ZTE Software Changsha Co., Ltd"' 22 | - PROFILE_NAME="CPImageViewer" 23 | - PROVISIONING_PROFILE="$HOME/Library/MobileDevice/Provisioning Profiles/$PROFILE_NAME.mobileprovision" 24 | - TRAVIS_BRANCH="master" 25 | - TRAVIS_BUILD_NUMBER="1.0.0" 26 | - INFO_PLIST="CPImageViewer/Info.plist" 27 | - BUNDLE_DISPLAY_NAME="CPImageViewer" 28 | - secure: dUb6mo0R6/E61c43oyHGDYvvGPBoe7fkXgIsLbSqFh+/v5DF1KWjtdXFn8RdlLjfUZMfwcz8eVYTDYMjg1Sku7b2JNbJg6vWCqhc1et6hwgtFo8vQrli9AlNEel7H74LVX264UGv/B98hBNZxsHE4tw5rjmhye6b4gE300WKDIt7moedPcaBfmBIwqZoT45BSD0YA8v0WotlUd+zNgwSQQcOB/XZFMeT55rRQiOEUsexnoeRiAVuFO5fug2IlaAaHyv4g6kl/hB4xaVWu/Gz1oOUTbL45xhYZBgFANH9fyr23Cml+yRC26dEAUuFsgLu0VQ+NZV0bboUv3O+nCFKENZoWYFfJroTd8fMMR0hDBNy324/U3IjCt7dic3zyj1lKjd6SyI8s8Pd7WP8WqLG71bRATvms8OynkRgpHDisO6ye/s6O/b5f67JCVjdkVhbxHTBZRYNMETCOcL5XBf/xzj4bu+QIr+8MCApaePgf75L2PvShHhzjto/cS+PxMKD+F1SfqjcFOKxDQo31t6M+7Xlmi88jMTR7Ga3k8aeqpd5B2SNhvt6LoakB+u9w2JPEzQbZxXKFfeVzQL6aEH95w5/Fw+G1io9DY2oaLGGHnlb5A8Q/Bx8YLpK6qv9i+do3uM2of0KHap5e2QoHbxKVvUVKy/o61E9idCEh2qNwbk= 29 | - secure: z6B5h1SDdXsFmzylgThptf77udVLhgT/Q895VTcWsCRrEYVm9h3g2IS5ure/HrpUuCK06KG1GAQI2L/pGyafgaayy10KOVtjUKBP+l2gQMKwGk6GaQmS64Bnlb1Wr8yJ7oPheYsuQc+97WachGXZPAKXlp0eHk07C9RuUfyODo86DOZGrPF99A9/N8qTGVNOfWu0XI0BhvKGFFfNCehhPqGEpeL8WI2mVMqlH71JXuOSM6riEr5dPmpZoCrNytBFjcmxBsfpwmsg1ymP5yTZEuM0TfFZxw9BEYIPH6+/GSgy3DAARlc1b3l31WozSElbaa6Qd9CpKRBB+WmcIvIp/OkrsBhzmh/eDAWfNEJx6N9wD3wbcGER7frZHGhWyCyUonpxgOn/+xgKWAvBd9GKdTboU3Q7A4qsKBLj0NrHJGChsa3M/OTohXSiqDAIk+KtV+3SyMPTwi2mHoojg6ejd+FFiGu/3Uq+x6kUp5KPAUUU+w+5n9KL8Av5qpa1a6tOye7lP/Gs1xv2OeXmLwWg4NHMWrx0ANoi/b0hFVTDGD+CgcXE1NzTRW/WM8FJpKh03n9h/kxm6kDZnjsGQ9vbLmwi7eJ00WVJAjxrB4KrGMIqqq9JSxvlOqn/BaHR/nhS/f7bmnrkVYa3huhegsWBq2lpaWARpBcaklZhF2Ex7Og= 30 | - secure: udebJesyABcZ+gVAEf87yyFqZJbt/jdtm/fKEQwhXYm5MVczEY6Ll9yn7T6bGBOqhEPl+uIiUxjeEIyQlVOZLMF8xCSgV8gtXgq2+ZJKQvGgw6oxbxldICLjHaU5ct7W8FICPGofamcR6M0iB7MjP61yNPOCaYxP0kbj/qawW1mjbe70nS5mtZuhYKXbno641a8c/Zb4dLypYPWXoXIcjhdTSPmQwbvGOowKMkwXop7aAV2Z/2yi6Ps3BQ00WozSXToa4TJkXdHi6qZViR+2wWv9kZPOQpII/DIWiO2k2jdkd65ZIaULOHHmbEClidq/+oZ5FI1390mIO+1zKJ8vUmLbMCfRxmZETQpBon6nduVaD8cStY3hU4zYSlcW2IEf5YJEMvFwPEexPHezaNTyYaejnxBKadqNNVDhz9/W3aMlkrOeXaoMoy3q4pDtYzj7aiitqmQQc/eeu2FrK3mzAuni18TYVJv8lDTJNcgcHcZ8jLX7ZqUs5XlnGC2DeZ64RBSFUL8K2utDzZ7v0U0Z3LM1XPB9wSh2jIQ2uDVun9tIGa4fKzK9EEHBmkdvdokssabNQUoOwK+VxcuKVVMUxjbCnpnZAmvNpYHVp/IOwjlHMnY3D99WjjEnoGpCoCgaY/6UAFyg3RVj8SdTC8IoW5nnntKCIHxBAolZR4oo534= 31 | - secure: kuQfUtP5nXy4b8rg8kvD+MDcTeX9Zq+mG/fcx8MGuwrDIyi3IqcyjbcRrJKDn+JwwPJ1VsD7IpVH4gbVjutXvFtzngtdlNIw/hbyETmUj99IzYc/xWzUvZkgCcxDtSUgcIzAEHCvmFU4TaJu+bsGIgWGZH+pym6PTWqcw3JCvJpe/7Cr8AN8tXQLV1dZKzcV6gK3TdKmiO9IoghPEvhRM/SiV3Fk5CAf/Q0fkLzcCwYj5q4wbpIxSq5ZbofYGqgN8Xe7OsgJFAUFhVA6jxNAczf8XjRQDzzdjpjWefFo5/sUyZ6DxeIGudLOYhiZtZEKqpZc+puYNt4Dk0KUE8fwXlGzzNDsK1eO5cBS9JftcQbt07aJKcpXwDP57lDdKZdW5RyPxMMig4BgkdDLk+hISkDRkrH43RDC872eUcKjKUQzL6atW2gHGSFFz4OgPivHt5ScowXNMu/L5UYF+fGw0+Eb2ZgDYxr6FyBEZxDrpt4uHKFEBPoIY4fIa7LkvEZRanA9GhieNcYaiUypkcfn2+sAGFDXEvwcLx75nRJKQO3re9Oay/TkZn3/OvF9U+K81LlNuferq1XfyHmQNTg6s56Ihh2N2aQCgfiJ0VQRH0Whv1Obs8l9xDFYQQg+wWyyTygN41e6kid0r782kYcEBHyQjrORXZviP2VmKQ1HWMA= 32 | -------------------------------------------------------------------------------- /CPImageViewer.xcodeproj/xcshareddata/xcschemes/CPImageViewerExample.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 85 | 91 | 92 | 93 | 94 | 96 | 97 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /Classes/CPImageViewerAnimationTransition.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImageViewerAnimationController.swift 3 | // EdusnsClient 4 | // 5 | // Created by ZhaoWei on 16/2/2. 6 | // Copyright © 2016年 csdept. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public class CPImageViewerAnimationTransition: NSObject, UIViewControllerAnimatedTransitioning { 12 | 13 | 14 | /// Be false when Push or Present, and true when Pop or Dismiss 15 | public var isBack = false 16 | 17 | public func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval { 18 | return 0.3 19 | } 20 | 21 | public func animateTransition(transitionContext: UIViewControllerContextTransitioning) { 22 | 23 | let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)! 24 | let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)! 25 | let containerView = transitionContext.containerView()! 26 | let style = transitionContext.presentationStyle() 27 | let finalFrame = transitionContext.finalFrameForViewController(toVC) 28 | 29 | // Solving the error of location of image view after rotating device and returning to previous controller. See ImageViewerViewController.init() 30 | // The OverFullScreen style don't need add toVC.view 31 | // The style is None when ImageViewerViewController.viewerStyle is CPImageViewerStyle.Push 32 | if style != .OverFullScreen && isBack { 33 | containerView.addSubview(toVC.view) 34 | containerView.sendSubviewToBack(toVC.view) 35 | 36 | if toVC.view.bounds.size != finalFrame.size { 37 | toVC.view.frame = finalFrame 38 | toVC.view.setNeedsLayout() 39 | toVC.view.layoutIfNeeded() 40 | } 41 | } 42 | 43 | let backgroundView = UIView(frame: finalFrame) 44 | backgroundView.backgroundColor = UIColor.blackColor() 45 | containerView.addSubview(backgroundView) 46 | 47 | let fromImageView = (fromVC as! CPImageControllerProtocol).animationImageView 48 | let toImageView = (toVC as! CPImageControllerProtocol).animationImageView 49 | let fromFrame = fromImageView.convertRect(fromImageView.bounds, toView: containerView) 50 | let toFrame = toImageView.convertRect(toImageView.bounds, toView: containerView) 51 | 52 | let newImageView = UIImageView(frame: fromFrame) 53 | newImageView.image = fromImageView.image 54 | newImageView.contentMode = .ScaleAspectFit 55 | containerView.addSubview(newImageView) 56 | 57 | if !isBack { 58 | backgroundView.alpha = 0.0 59 | fromImageView.alpha = 0.0 60 | } else { 61 | backgroundView.alpha = 1.0 62 | fromVC.view.alpha = 0.0 63 | } 64 | 65 | let duration = transitionDuration(transitionContext) 66 | UIView.animateWithDuration(duration, delay: 0, options: .CurveEaseInOut, animations: { 67 | if !self.isBack { 68 | newImageView.frame = finalFrame 69 | backgroundView.alpha = 1.0 70 | } else { 71 | newImageView.frame = toFrame 72 | backgroundView.alpha = 0.0 73 | } 74 | }, completion: { finished in 75 | newImageView.removeFromSuperview() 76 | backgroundView.removeFromSuperview() 77 | 78 | let cancel = transitionContext.transitionWasCancelled() 79 | 80 | if !self.isBack { 81 | if cancel { 82 | fromImageView.alpha = 1.0 83 | } else { 84 | containerView.addSubview(toVC.view) 85 | } 86 | } else { 87 | if cancel { 88 | fromVC.view.alpha = 1.0 89 | if style != .OverFullScreen { 90 | toVC.view.removeFromSuperview() 91 | } 92 | } else { 93 | toImageView.alpha = 1.0 94 | } 95 | } 96 | transitionContext.completeTransition(!cancel) 97 | }) 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /scripts/certs/dist.p12.enc: -------------------------------------------------------------------------------- 1 | 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 70 | y6ZRv6i/X/rxNeEwIS5Shg== 71 | -------------------------------------------------------------------------------- /Classes/CPImageViewerViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DeleteImageViewController.swift 3 | // EdusnsClient 4 | // 5 | // Created by ZhaoWei on 16/2/2. 6 | // Copyright © 2016年 csdept. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public enum CPImageViewerStyle { 12 | /// Present style 13 | case Presentation 14 | 15 | /// Navigation style 16 | case Push 17 | } 18 | 19 | public class CPImageViewerViewController: UIViewController, UIScrollViewDelegate, UIGestureRecognizerDelegate, CPImageControllerProtocol { 20 | 21 | /// The animation imageView conforming to `CPImageControllerProtocol` 22 | public var animationImageView: UIImageView! 23 | 24 | /// The viewer style. Defaults to **Presentation** 25 | public var viewerStyle = CPImageViewerStyle.Presentation 26 | 27 | /// The image of animation image view 28 | public var image: UIImage? 29 | 30 | /// The title of *navigationItem.rightBarButtonItem* when viewerStyle is Push 31 | public var rightBarItemTitle: String? 32 | 33 | /// The image of *navigationItem.rightBarButtonItem* when viewerStyle is Push 34 | public var rightBarItemImage: UIImage? 35 | 36 | /// The action of *navigationItem.rightBarButtonItem* when viewerStyle is Push 37 | public var rightAction: ((Void) -> (Void))? 38 | 39 | private var scrollView: UIScrollView! 40 | 41 | private var isViewDidAppear = false 42 | 43 | public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { 44 | super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 45 | 46 | //Solving the error of location of image view after rotating device and returning to previous controller. 47 | self.modalPresentationStyle = .OverFullScreen 48 | self.modalPresentationCapturesStatusBarAppearance = true 49 | } 50 | 51 | public required init?(coder aDecoder: NSCoder) { 52 | super.init(coder: aDecoder) 53 | } 54 | 55 | public override func viewDidLoad() { 56 | super.viewDidLoad() 57 | 58 | self.view.backgroundColor = UIColor.blackColor() 59 | 60 | scrollView = UIScrollView() 61 | scrollView.backgroundColor = UIColor.blackColor() 62 | scrollView.maximumZoomScale = 5.0 63 | scrollView.showsVerticalScrollIndicator = false 64 | scrollView.showsHorizontalScrollIndicator = false 65 | scrollView.delegate = self 66 | scrollView.translatesAutoresizingMaskIntoConstraints = false 67 | self.view.addSubview(scrollView) 68 | 69 | self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[scrollView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["scrollView" : scrollView])) 70 | self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[scrollView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["scrollView" : scrollView])) 71 | 72 | animationImageView = UIImageView() 73 | animationImageView.image = image 74 | scrollView.addSubview(animationImageView) 75 | 76 | if viewerStyle == .Presentation { 77 | let tap = UITapGestureRecognizer(target: self, action: #selector(CPImageViewerViewController.dismiss)) 78 | scrollView.addGestureRecognizer(tap) 79 | } else if let title = rightBarItemTitle { 80 | let rightItem = UIBarButtonItem(title: title, style: .Plain, target: self, action: #selector(CPImageViewerViewController.rightBarItemAction)) 81 | self.navigationItem.rightBarButtonItem = rightItem 82 | } else if let image = rightBarItemImage { 83 | let rightItem = UIBarButtonItem(image: image, style: .Plain, target: self, action: #selector(CPImageViewerViewController.rightBarItemAction)) 84 | self.navigationItem.rightBarButtonItem = rightItem 85 | } 86 | } 87 | 88 | public override func viewDidAppear(animated: Bool) { 89 | super.viewDidAppear(animated) 90 | 91 | isViewDidAppear = true 92 | self.setNeedsStatusBarAppearanceUpdate() 93 | } 94 | 95 | public override func viewDidLayoutSubviews() { 96 | super.viewDidLayoutSubviews() 97 | scrollView.zoomScale = 1.0 98 | scrollView.contentInset = UIEdgeInsetsZero 99 | animationImageView.frame = centerFrameForImageView() 100 | } 101 | 102 | public override func prefersStatusBarHidden() -> Bool { 103 | if viewerStyle == .Presentation && isViewDidAppear { 104 | return true 105 | } 106 | 107 | return super.prefersStatusBarHidden() 108 | } 109 | 110 | //MARK: - Custom Methods 111 | private func centerFrameForImageView() -> CGRect { 112 | guard let aImage = image else { return CGRectZero } 113 | 114 | let viewWidth = scrollView.frame.size.width 115 | let viewHeight = scrollView.frame.size.height 116 | let imageWidth = aImage.size.width 117 | let imageHeight = aImage.size.height 118 | let newWidth = min(viewWidth, CGFloat(floorf(Float(imageWidth * (viewHeight / imageHeight))))) 119 | let newHeight = min(viewHeight, CGFloat(floorf(Float(imageHeight * (viewWidth / imageWidth))))) 120 | 121 | return CGRectMake((viewWidth - newWidth)/2, (viewHeight - newHeight)/2, newWidth, newHeight) 122 | } 123 | 124 | private func centerScrollViewContents() { 125 | let viewWidth = scrollView.frame.size.width 126 | let viewHeight = scrollView.frame.size.height 127 | let imageWidth = animationImageView.frame.size.width 128 | let imageHeight = animationImageView.frame.size.height 129 | 130 | let originX = max(0, (viewWidth - imageWidth)/2) 131 | let originY = max(0, (viewHeight - imageHeight)/2) 132 | animationImageView.frame.origin = CGPointMake(originX, originY) 133 | } 134 | 135 | //MARK: - Button Action 136 | @objc private func rightBarItemAction() { 137 | self.navigationController!.popViewControllerAnimated(true) 138 | if let block = rightAction { 139 | block() 140 | } 141 | } 142 | 143 | @objc private func dismiss() { 144 | dismissViewControllerAnimated(true, completion: nil) 145 | } 146 | 147 | //MARK: - UIScrollViewDelegate 148 | public func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? { 149 | return animationImageView 150 | } 151 | 152 | public func scrollViewDidZoom(scrollView: UIScrollView) { 153 | centerScrollViewContents() 154 | } 155 | } 156 | -------------------------------------------------------------------------------- /Classes/CPImageViewerInteractiveTransition.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InteractiveTransition.swift 3 | // CPImageViewer 4 | // 5 | // Created by ZhaoWei on 16/2/27. 6 | // Copyright © 2016年 cp3hnu. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public class CPImageViewerInteractiveTransition: NSObject, UIViewControllerInteractiveTransitioning, UIGestureRecognizerDelegate { 12 | 13 | /// Be true when Present, and false when Push 14 | public var isPresented = true 15 | 16 | /// Whether is interaction in progress. Default is false 17 | private(set) public var interactionInProgress = false 18 | 19 | private weak var imageViewerVC: CPImageViewerViewController! 20 | private var distance = UIScreen.mainScreen().bounds.size.height/2 21 | private var shouldCompleteTransition = false 22 | private var startInteractive = false 23 | private var transitionContext: UIViewControllerContextTransitioning? 24 | private var toVC: UIViewController! 25 | private var newImageView: UIImageView! 26 | private var backgroundView: UIView! 27 | private var toImageView: UIImageView! 28 | private var fromFrame: CGRect = CGRectZero 29 | private var toFrame: CGRect = CGRectZero 30 | private var style = UIModalPresentationStyle.FullScreen 31 | 32 | /** 33 | Install the pan gesture recognizer on view of *vc* 34 | 35 | - parameter vc: The *CPImageViewerViewController* view controller 36 | */ 37 | public func wireToViewController(vc: CPImageViewerViewController) { 38 | imageViewerVC = vc 39 | let panGesture = UIPanGestureRecognizer(target: self, action: #selector(CPImageViewerInteractiveTransition.handlePan(_:))) 40 | panGesture.maximumNumberOfTouches = 1 41 | panGesture.minimumNumberOfTouches = 1 42 | panGesture.delegate = self 43 | vc.view.addGestureRecognizer(panGesture) 44 | } 45 | 46 | //MARK: - UIViewControllerInteractiveTransitioning 47 | public func startInteractiveTransition(transitionContext: UIViewControllerContextTransitioning) { 48 | startInteractive = true 49 | self.transitionContext = transitionContext 50 | style = transitionContext.presentationStyle() 51 | 52 | toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) 53 | let containerView = transitionContext.containerView()! 54 | let finalFrame = transitionContext.finalFrameForViewController(toVC) 55 | 56 | // Solving the error of location of image view after rotating device and returning to previous controller. See ImageViewerViewController.init() 57 | // The OverFullScreen style don't need add toVC.view 58 | // The style is None when ImageViewerViewController.viewerStyle is CPImageViewerStyle.Push 59 | if style != .OverFullScreen { 60 | containerView.addSubview(toVC.view) 61 | containerView.sendSubviewToBack(toVC.view) 62 | 63 | if toVC.view.bounds.size != finalFrame.size { 64 | toVC.view.frame = finalFrame 65 | toVC.view.setNeedsLayout() 66 | toVC.view.layoutIfNeeded() 67 | } 68 | } 69 | 70 | backgroundView = UIView(frame: finalFrame) 71 | backgroundView.backgroundColor = UIColor.blackColor() 72 | containerView.addSubview(backgroundView) 73 | 74 | let fromImageView = imageViewerVC.animationImageView 75 | toImageView = (toVC as! CPImageControllerProtocol).animationImageView 76 | fromFrame = fromImageView.convertRect(fromImageView.bounds, toView: containerView) 77 | toFrame = toImageView.convertRect(toImageView.bounds, toView: containerView) 78 | 79 | newImageView = UIImageView(frame: fromFrame) 80 | newImageView.image = fromImageView.image 81 | newImageView.contentMode = .ScaleAspectFit 82 | containerView.addSubview(newImageView) 83 | 84 | imageViewerVC.view.alpha = 0.0 85 | } 86 | 87 | //MARK: - UIPanGestureRecognizer 88 | @objc private func handlePan(gesture: UIPanGestureRecognizer) { 89 | 90 | let currentPoint = gesture.translationInView(imageViewerVC.view) 91 | switch (gesture.state) { 92 | case .Began: 93 | interactionInProgress = true 94 | if isPresented { 95 | imageViewerVC.dismissViewControllerAnimated(true, completion: nil) 96 | } else { 97 | imageViewerVC.navigationController?.popViewControllerAnimated(true) 98 | } 99 | 100 | case .Changed: 101 | 102 | updateInteractiveTransition(currentPoint) 103 | 104 | case .Ended, .Cancelled: 105 | interactionInProgress = false 106 | if (!shouldCompleteTransition || gesture.state == .Cancelled) { 107 | cancelTransition() 108 | } else { 109 | completeTransition() 110 | } 111 | 112 | default: 113 | break 114 | } 115 | } 116 | 117 | public func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool { 118 | if let panGesture = gestureRecognizer as? UIPanGestureRecognizer { 119 | let currentPoint = panGesture.translationInView(imageViewerVC.view) 120 | return fabs(currentPoint.y) > fabs(currentPoint.x) 121 | } 122 | 123 | return true 124 | } 125 | 126 | //MARK: - Update & Complete & Cancel 127 | private func updateInteractiveTransition(currentPoint: CGPoint) { 128 | guard startInteractive else { return } 129 | 130 | let percent = min(fabs(currentPoint.y) / distance, 1) 131 | 132 | shouldCompleteTransition = (percent > 0.3) 133 | transitionContext?.updateInteractiveTransition(percent) 134 | backgroundView.alpha = 1 - percent 135 | newImageView.frame.origin.y = fromFrame.origin.y + currentPoint.y 136 | 137 | if (fromFrame.width > UIScreen.mainScreen().bounds.size.width - 60) 138 | { 139 | newImageView.frame.size.width = fromFrame.width - percent * 60.0 140 | newImageView.frame.origin.x = fromFrame.origin.x + percent * 30.0 141 | } 142 | } 143 | 144 | private func completeTransition() { 145 | guard startInteractive else { return } 146 | 147 | let duration = 0.3 148 | UIView.animateWithDuration(duration, delay: 0, options: .CurveEaseInOut, animations: { 149 | self.newImageView.frame = self.toFrame 150 | self.backgroundView.alpha = 0.0 151 | }, completion: { finished in 152 | self.startInteractive = false 153 | 154 | self.newImageView.removeFromSuperview() 155 | self.backgroundView.removeFromSuperview() 156 | 157 | self.toImageView.alpha = 1.0 158 | 159 | self.transitionContext?.finishInteractiveTransition() 160 | self.transitionContext?.completeTransition(true) 161 | }) 162 | } 163 | 164 | private func cancelTransition() { 165 | guard startInteractive else { return } 166 | 167 | let duration = 0.3 168 | UIView.animateWithDuration(duration, delay: 0, options: .CurveEaseInOut, animations: { 169 | self.newImageView.frame = self.fromFrame 170 | self.backgroundView.alpha = 1.0 171 | }, completion: { finished in 172 | self.startInteractive = false 173 | 174 | self.newImageView.removeFromSuperview() 175 | self.backgroundView.removeFromSuperview() 176 | 177 | self.imageViewerVC.view.alpha = 1.0 178 | if self.style != .OverFullScreen { 179 | self.toVC.view.removeFromSuperview() 180 | } 181 | 182 | self.transitionContext?.cancelInteractiveTransition() 183 | self.transitionContext?.completeTransition(false) 184 | }) 185 | } 186 | } 187 | -------------------------------------------------------------------------------- /scripts/profile/CPImageViewer.mobileprovision.enc: -------------------------------------------------------------------------------- 1 | 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 173 | uJ50n/9kOfKfMHeGn4J4VA== 174 | -------------------------------------------------------------------------------- /CPImageViewer/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | -------------------------------------------------------------------------------- /CPImageViewer.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 3518AE9A1CE4C7BB00F86184 /* CPImageControllerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3518AE991CE4C7BB00F86184 /* CPImageControllerProtocol.swift */; }; 11 | 353941711CDDF47F0044FD7C /* CPImageViewer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 353941671CDDF47E0044FD7C /* CPImageViewer.framework */; }; 12 | 353941781CDDF47F0044FD7C /* CPImageViewerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 353941771CDDF47F0044FD7C /* CPImageViewerTests.swift */; }; 13 | 3539417C1CDDF47F0044FD7C /* CPImageViewer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 353941671CDDF47E0044FD7C /* CPImageViewer.framework */; }; 14 | 3539417D1CDDF47F0044FD7C /* CPImageViewer.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 353941671CDDF47E0044FD7C /* CPImageViewer.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 15 | 353941851CDDF57A0044FD7C /* CPImageViewerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3553DFA41C8EFE4000BCB077 /* CPImageViewerViewController.swift */; }; 16 | 353941861CDDF57B0044FD7C /* CPImageViewerAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3553DFA21C8EFE4000BCB077 /* CPImageViewerAnimator.swift */; }; 17 | 353941871CDDF57B0044FD7C /* CPImageViewerAnimationTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3553DFA11C8EFE4000BCB077 /* CPImageViewerAnimationTransition.swift */; }; 18 | 353941881CDDF57B0044FD7C /* CPImageViewerInteractiveTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3553DFA31C8EFE4000BCB077 /* CPImageViewerInteractiveTransition.swift */; }; 19 | 35B8E52F1CDDF81900940716 /* CPImageViewer.h in Headers */ = {isa = PBXBuildFile; fileRef = 35B8E52A1CDDF78E00940716 /* CPImageViewer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 20 | 35DEA4151C8BAC3000869EDC /* CollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DEA4141C8BAC3000869EDC /* CollectionViewCell.swift */; }; 21 | 9501F8F61C81467C004A8814 /* CollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9501F8F51C81467C004A8814 /* CollectionViewController.swift */; }; 22 | 95C55F781C81304900BD0E89 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95C55F761C81304900BD0E89 /* ViewController.swift */; }; 23 | 95C55F791C81304900BD0E89 /* GeneralViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95C55F771C81304900BD0E89 /* GeneralViewController.swift */; }; 24 | 95C55F7F1C81313A00BD0E89 /* TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95C55F7E1C81313A00BD0E89 /* TableViewController.swift */; }; 25 | 95C55F841C81394800BD0E89 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 95C55F821C81394800BD0E89 /* Main.storyboard */; }; 26 | 95D3A3131C71E26F003A750C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95D3A3121C71E26F003A750C /* AppDelegate.swift */; }; 27 | 95D3A31A1C71E270003A750C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 95D3A3191C71E270003A750C /* Assets.xcassets */; }; 28 | 95D3A31D1C71E270003A750C /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 95D3A31B1C71E270003A750C /* LaunchScreen.storyboard */; }; 29 | /* End PBXBuildFile section */ 30 | 31 | /* Begin PBXContainerItemProxy section */ 32 | 353941721CDDF47F0044FD7C /* PBXContainerItemProxy */ = { 33 | isa = PBXContainerItemProxy; 34 | containerPortal = 95D3A3071C71E26E003A750C /* Project object */; 35 | proxyType = 1; 36 | remoteGlobalIDString = 353941661CDDF47E0044FD7C; 37 | remoteInfo = CPImageViewer; 38 | }; 39 | 353941741CDDF47F0044FD7C /* PBXContainerItemProxy */ = { 40 | isa = PBXContainerItemProxy; 41 | containerPortal = 95D3A3071C71E26E003A750C /* Project object */; 42 | proxyType = 1; 43 | remoteGlobalIDString = 95D3A30E1C71E26F003A750C; 44 | remoteInfo = CPImageViewerExample; 45 | }; 46 | 3539417A1CDDF47F0044FD7C /* PBXContainerItemProxy */ = { 47 | isa = PBXContainerItemProxy; 48 | containerPortal = 95D3A3071C71E26E003A750C /* Project object */; 49 | proxyType = 1; 50 | remoteGlobalIDString = 353941661CDDF47E0044FD7C; 51 | remoteInfo = CPImageViewer; 52 | }; 53 | /* End PBXContainerItemProxy section */ 54 | 55 | /* Begin PBXCopyFilesBuildPhase section */ 56 | 353941811CDDF47F0044FD7C /* Embed Frameworks */ = { 57 | isa = PBXCopyFilesBuildPhase; 58 | buildActionMask = 8; 59 | dstPath = ""; 60 | dstSubfolderSpec = 10; 61 | files = ( 62 | 3539417D1CDDF47F0044FD7C /* CPImageViewer.framework in Embed Frameworks */, 63 | ); 64 | name = "Embed Frameworks"; 65 | runOnlyForDeploymentPostprocessing = 1; 66 | }; 67 | /* End PBXCopyFilesBuildPhase section */ 68 | 69 | /* Begin PBXFileReference section */ 70 | 3518AE991CE4C7BB00F86184 /* CPImageControllerProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CPImageControllerProtocol.swift; sourceTree = ""; }; 71 | 353941671CDDF47E0044FD7C /* CPImageViewer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CPImageViewer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 72 | 353941701CDDF47F0044FD7C /* CPImageViewerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CPImageViewerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 73 | 353941771CDDF47F0044FD7C /* CPImageViewerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CPImageViewerTests.swift; sourceTree = ""; }; 74 | 353941791CDDF47F0044FD7C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 75 | 3553DFA11C8EFE4000BCB077 /* CPImageViewerAnimationTransition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CPImageViewerAnimationTransition.swift; sourceTree = ""; }; 76 | 3553DFA21C8EFE4000BCB077 /* CPImageViewerAnimator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CPImageViewerAnimator.swift; sourceTree = ""; }; 77 | 3553DFA31C8EFE4000BCB077 /* CPImageViewerInteractiveTransition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CPImageViewerInteractiveTransition.swift; sourceTree = ""; }; 78 | 3553DFA41C8EFE4000BCB077 /* CPImageViewerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CPImageViewerViewController.swift; sourceTree = ""; }; 79 | 35B8E52A1CDDF78E00940716 /* CPImageViewer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CPImageViewer.h; path = Classes/CPImageViewer.h; sourceTree = SOURCE_ROOT; }; 80 | 35B8E5311CDDF94900940716 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 81 | 35B8E5351CDE244700940716 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Classes/Info.plist; sourceTree = SOURCE_ROOT; }; 82 | 35DEA4141C8BAC3000869EDC /* CollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionViewCell.swift; sourceTree = ""; }; 83 | 9501F8F51C81467C004A8814 /* CollectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionViewController.swift; sourceTree = ""; }; 84 | 95C55F761C81304900BD0E89 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 85 | 95C55F771C81304900BD0E89 /* GeneralViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneralViewController.swift; sourceTree = ""; }; 86 | 95C55F7E1C81313A00BD0E89 /* TableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewController.swift; sourceTree = ""; }; 87 | 95C55F831C81394800BD0E89 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = CPImageViewer/Base.lproj/Main.storyboard; sourceTree = ""; }; 88 | 95D3A30F1C71E26F003A750C /* CPImageViewerExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CPImageViewerExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 89 | 95D3A3121C71E26F003A750C /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 90 | 95D3A3191C71E270003A750C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 91 | 95D3A31C1C71E270003A750C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 92 | /* End PBXFileReference section */ 93 | 94 | /* Begin PBXFrameworksBuildPhase section */ 95 | 353941631CDDF47E0044FD7C /* Frameworks */ = { 96 | isa = PBXFrameworksBuildPhase; 97 | buildActionMask = 2147483647; 98 | files = ( 99 | ); 100 | runOnlyForDeploymentPostprocessing = 0; 101 | }; 102 | 3539416D1CDDF47F0044FD7C /* Frameworks */ = { 103 | isa = PBXFrameworksBuildPhase; 104 | buildActionMask = 2147483647; 105 | files = ( 106 | 353941711CDDF47F0044FD7C /* CPImageViewer.framework in Frameworks */, 107 | ); 108 | runOnlyForDeploymentPostprocessing = 0; 109 | }; 110 | 95D3A30C1C71E26F003A750C /* Frameworks */ = { 111 | isa = PBXFrameworksBuildPhase; 112 | buildActionMask = 2147483647; 113 | files = ( 114 | 3539417C1CDDF47F0044FD7C /* CPImageViewer.framework in Frameworks */, 115 | ); 116 | runOnlyForDeploymentPostprocessing = 0; 117 | }; 118 | /* End PBXFrameworksBuildPhase section */ 119 | 120 | /* Begin PBXGroup section */ 121 | 353941681CDDF47F0044FD7C /* CPImageViewer */ = { 122 | isa = PBXGroup; 123 | children = ( 124 | 35B8E5351CDE244700940716 /* Info.plist */, 125 | 35B8E52A1CDDF78E00940716 /* CPImageViewer.h */, 126 | 3553DFA01C8EFE4000BCB077 /* Classes */, 127 | ); 128 | path = CPImageViewer; 129 | sourceTree = ""; 130 | }; 131 | 353941761CDDF47F0044FD7C /* CPImageViewerTests */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | 353941771CDDF47F0044FD7C /* CPImageViewerTests.swift */, 135 | 353941791CDDF47F0044FD7C /* Info.plist */, 136 | ); 137 | path = CPImageViewerTests; 138 | sourceTree = ""; 139 | }; 140 | 3553DFA01C8EFE4000BCB077 /* Classes */ = { 141 | isa = PBXGroup; 142 | children = ( 143 | 3553DFA41C8EFE4000BCB077 /* CPImageViewerViewController.swift */, 144 | 3553DFA21C8EFE4000BCB077 /* CPImageViewerAnimator.swift */, 145 | 3553DFA11C8EFE4000BCB077 /* CPImageViewerAnimationTransition.swift */, 146 | 3553DFA31C8EFE4000BCB077 /* CPImageViewerInteractiveTransition.swift */, 147 | 3518AE991CE4C7BB00F86184 /* CPImageControllerProtocol.swift */, 148 | ); 149 | name = Classes; 150 | path = ../Classes; 151 | sourceTree = ""; 152 | }; 153 | 95D3A3061C71E26E003A750C = { 154 | isa = PBXGroup; 155 | children = ( 156 | 95D3A3111C71E26F003A750C /* CPImageViewerExample */, 157 | 353941681CDDF47F0044FD7C /* CPImageViewer */, 158 | 353941761CDDF47F0044FD7C /* CPImageViewerTests */, 159 | 95D3A3101C71E26F003A750C /* Products */, 160 | ); 161 | sourceTree = ""; 162 | }; 163 | 95D3A3101C71E26F003A750C /* Products */ = { 164 | isa = PBXGroup; 165 | children = ( 166 | 95D3A30F1C71E26F003A750C /* CPImageViewerExample.app */, 167 | 353941671CDDF47E0044FD7C /* CPImageViewer.framework */, 168 | 353941701CDDF47F0044FD7C /* CPImageViewerTests.xctest */, 169 | ); 170 | name = Products; 171 | sourceTree = ""; 172 | }; 173 | 95D3A3111C71E26F003A750C /* CPImageViewerExample */ = { 174 | isa = PBXGroup; 175 | children = ( 176 | 95D3A3121C71E26F003A750C /* AppDelegate.swift */, 177 | 95C55F761C81304900BD0E89 /* ViewController.swift */, 178 | 95C55F771C81304900BD0E89 /* GeneralViewController.swift */, 179 | 95C55F7E1C81313A00BD0E89 /* TableViewController.swift */, 180 | 9501F8F51C81467C004A8814 /* CollectionViewController.swift */, 181 | 35DEA4141C8BAC3000869EDC /* CollectionViewCell.swift */, 182 | 95D3A3191C71E270003A750C /* Assets.xcassets */, 183 | 95D3A31B1C71E270003A750C /* LaunchScreen.storyboard */, 184 | 95C55F821C81394800BD0E89 /* Main.storyboard */, 185 | 35B8E5311CDDF94900940716 /* Info.plist */, 186 | ); 187 | name = CPImageViewerExample; 188 | path = CPImageViewer; 189 | sourceTree = ""; 190 | }; 191 | /* End PBXGroup section */ 192 | 193 | /* Begin PBXHeadersBuildPhase section */ 194 | 353941641CDDF47E0044FD7C /* Headers */ = { 195 | isa = PBXHeadersBuildPhase; 196 | buildActionMask = 2147483647; 197 | files = ( 198 | 35B8E52F1CDDF81900940716 /* CPImageViewer.h in Headers */, 199 | ); 200 | runOnlyForDeploymentPostprocessing = 0; 201 | }; 202 | /* End PBXHeadersBuildPhase section */ 203 | 204 | /* Begin PBXNativeTarget section */ 205 | 353941661CDDF47E0044FD7C /* CPImageViewer */ = { 206 | isa = PBXNativeTarget; 207 | buildConfigurationList = 3539417E1CDDF47F0044FD7C /* Build configuration list for PBXNativeTarget "CPImageViewer" */; 208 | buildPhases = ( 209 | 353941621CDDF47E0044FD7C /* Sources */, 210 | 353941631CDDF47E0044FD7C /* Frameworks */, 211 | 353941641CDDF47E0044FD7C /* Headers */, 212 | 35B8E5361CDE245700940716 /* Resources */, 213 | ); 214 | buildRules = ( 215 | ); 216 | dependencies = ( 217 | ); 218 | name = CPImageViewer; 219 | productName = CPImageViewer; 220 | productReference = 353941671CDDF47E0044FD7C /* CPImageViewer.framework */; 221 | productType = "com.apple.product-type.framework"; 222 | }; 223 | 3539416F1CDDF47F0044FD7C /* CPImageViewerTests */ = { 224 | isa = PBXNativeTarget; 225 | buildConfigurationList = 353941821CDDF47F0044FD7C /* Build configuration list for PBXNativeTarget "CPImageViewerTests" */; 226 | buildPhases = ( 227 | 3539416C1CDDF47F0044FD7C /* Sources */, 228 | 3539416D1CDDF47F0044FD7C /* Frameworks */, 229 | 3539416E1CDDF47F0044FD7C /* Resources */, 230 | ); 231 | buildRules = ( 232 | ); 233 | dependencies = ( 234 | 353941731CDDF47F0044FD7C /* PBXTargetDependency */, 235 | 353941751CDDF47F0044FD7C /* PBXTargetDependency */, 236 | ); 237 | name = CPImageViewerTests; 238 | productName = CPImageViewerTests; 239 | productReference = 353941701CDDF47F0044FD7C /* CPImageViewerTests.xctest */; 240 | productType = "com.apple.product-type.bundle.unit-test"; 241 | }; 242 | 95D3A30E1C71E26F003A750C /* CPImageViewerExample */ = { 243 | isa = PBXNativeTarget; 244 | buildConfigurationList = 95D3A3211C71E270003A750C /* Build configuration list for PBXNativeTarget "CPImageViewerExample" */; 245 | buildPhases = ( 246 | 95D3A30B1C71E26F003A750C /* Sources */, 247 | 95D3A30C1C71E26F003A750C /* Frameworks */, 248 | 95D3A30D1C71E26F003A750C /* Resources */, 249 | 353941811CDDF47F0044FD7C /* Embed Frameworks */, 250 | ); 251 | buildRules = ( 252 | ); 253 | dependencies = ( 254 | 3539417B1CDDF47F0044FD7C /* PBXTargetDependency */, 255 | ); 256 | name = CPImageViewerExample; 257 | productName = CPImageViewer; 258 | productReference = 95D3A30F1C71E26F003A750C /* CPImageViewerExample.app */; 259 | productType = "com.apple.product-type.application"; 260 | }; 261 | /* End PBXNativeTarget section */ 262 | 263 | /* Begin PBXProject section */ 264 | 95D3A3071C71E26E003A750C /* Project object */ = { 265 | isa = PBXProject; 266 | attributes = { 267 | LastSwiftUpdateCheck = 0730; 268 | LastUpgradeCheck = 0730; 269 | ORGANIZATIONNAME = cp3hnu; 270 | TargetAttributes = { 271 | 353941661CDDF47E0044FD7C = { 272 | CreatedOnToolsVersion = 7.3; 273 | }; 274 | 3539416F1CDDF47F0044FD7C = { 275 | CreatedOnToolsVersion = 7.3; 276 | TestTargetID = 95D3A30E1C71E26F003A750C; 277 | }; 278 | 95D3A30E1C71E26F003A750C = { 279 | CreatedOnToolsVersion = 7.1.1; 280 | }; 281 | }; 282 | }; 283 | buildConfigurationList = 95D3A30A1C71E26E003A750C /* Build configuration list for PBXProject "CPImageViewer" */; 284 | compatibilityVersion = "Xcode 3.2"; 285 | developmentRegion = English; 286 | hasScannedForEncodings = 0; 287 | knownRegions = ( 288 | en, 289 | Base, 290 | ); 291 | mainGroup = 95D3A3061C71E26E003A750C; 292 | productRefGroup = 95D3A3101C71E26F003A750C /* Products */; 293 | projectDirPath = ""; 294 | projectRoot = ""; 295 | targets = ( 296 | 95D3A30E1C71E26F003A750C /* CPImageViewerExample */, 297 | 353941661CDDF47E0044FD7C /* CPImageViewer */, 298 | 3539416F1CDDF47F0044FD7C /* CPImageViewerTests */, 299 | ); 300 | }; 301 | /* End PBXProject section */ 302 | 303 | /* Begin PBXResourcesBuildPhase section */ 304 | 3539416E1CDDF47F0044FD7C /* Resources */ = { 305 | isa = PBXResourcesBuildPhase; 306 | buildActionMask = 2147483647; 307 | files = ( 308 | ); 309 | runOnlyForDeploymentPostprocessing = 0; 310 | }; 311 | 35B8E5361CDE245700940716 /* Resources */ = { 312 | isa = PBXResourcesBuildPhase; 313 | buildActionMask = 2147483647; 314 | files = ( 315 | ); 316 | runOnlyForDeploymentPostprocessing = 0; 317 | }; 318 | 95D3A30D1C71E26F003A750C /* Resources */ = { 319 | isa = PBXResourcesBuildPhase; 320 | buildActionMask = 2147483647; 321 | files = ( 322 | 95C55F841C81394800BD0E89 /* Main.storyboard in Resources */, 323 | 95D3A31D1C71E270003A750C /* LaunchScreen.storyboard in Resources */, 324 | 95D3A31A1C71E270003A750C /* Assets.xcassets in Resources */, 325 | ); 326 | runOnlyForDeploymentPostprocessing = 0; 327 | }; 328 | /* End PBXResourcesBuildPhase section */ 329 | 330 | /* Begin PBXSourcesBuildPhase section */ 331 | 353941621CDDF47E0044FD7C /* Sources */ = { 332 | isa = PBXSourcesBuildPhase; 333 | buildActionMask = 2147483647; 334 | files = ( 335 | 353941881CDDF57B0044FD7C /* CPImageViewerInteractiveTransition.swift in Sources */, 336 | 353941871CDDF57B0044FD7C /* CPImageViewerAnimationTransition.swift in Sources */, 337 | 3518AE9A1CE4C7BB00F86184 /* CPImageControllerProtocol.swift in Sources */, 338 | 353941851CDDF57A0044FD7C /* CPImageViewerViewController.swift in Sources */, 339 | 353941861CDDF57B0044FD7C /* CPImageViewerAnimator.swift in Sources */, 340 | ); 341 | runOnlyForDeploymentPostprocessing = 0; 342 | }; 343 | 3539416C1CDDF47F0044FD7C /* Sources */ = { 344 | isa = PBXSourcesBuildPhase; 345 | buildActionMask = 2147483647; 346 | files = ( 347 | 353941781CDDF47F0044FD7C /* CPImageViewerTests.swift in Sources */, 348 | ); 349 | runOnlyForDeploymentPostprocessing = 0; 350 | }; 351 | 95D3A30B1C71E26F003A750C /* Sources */ = { 352 | isa = PBXSourcesBuildPhase; 353 | buildActionMask = 2147483647; 354 | files = ( 355 | 9501F8F61C81467C004A8814 /* CollectionViewController.swift in Sources */, 356 | 95C55F7F1C81313A00BD0E89 /* TableViewController.swift in Sources */, 357 | 95C55F781C81304900BD0E89 /* ViewController.swift in Sources */, 358 | 95C55F791C81304900BD0E89 /* GeneralViewController.swift in Sources */, 359 | 95D3A3131C71E26F003A750C /* AppDelegate.swift in Sources */, 360 | 35DEA4151C8BAC3000869EDC /* CollectionViewCell.swift in Sources */, 361 | ); 362 | runOnlyForDeploymentPostprocessing = 0; 363 | }; 364 | /* End PBXSourcesBuildPhase section */ 365 | 366 | /* Begin PBXTargetDependency section */ 367 | 353941731CDDF47F0044FD7C /* PBXTargetDependency */ = { 368 | isa = PBXTargetDependency; 369 | target = 353941661CDDF47E0044FD7C /* CPImageViewer */; 370 | targetProxy = 353941721CDDF47F0044FD7C /* PBXContainerItemProxy */; 371 | }; 372 | 353941751CDDF47F0044FD7C /* PBXTargetDependency */ = { 373 | isa = PBXTargetDependency; 374 | target = 95D3A30E1C71E26F003A750C /* CPImageViewerExample */; 375 | targetProxy = 353941741CDDF47F0044FD7C /* PBXContainerItemProxy */; 376 | }; 377 | 3539417B1CDDF47F0044FD7C /* PBXTargetDependency */ = { 378 | isa = PBXTargetDependency; 379 | target = 353941661CDDF47E0044FD7C /* CPImageViewer */; 380 | targetProxy = 3539417A1CDDF47F0044FD7C /* PBXContainerItemProxy */; 381 | }; 382 | /* End PBXTargetDependency section */ 383 | 384 | /* Begin PBXVariantGroup section */ 385 | 95C55F821C81394800BD0E89 /* Main.storyboard */ = { 386 | isa = PBXVariantGroup; 387 | children = ( 388 | 95C55F831C81394800BD0E89 /* Base */, 389 | ); 390 | name = Main.storyboard; 391 | path = ..; 392 | sourceTree = ""; 393 | }; 394 | 95D3A31B1C71E270003A750C /* LaunchScreen.storyboard */ = { 395 | isa = PBXVariantGroup; 396 | children = ( 397 | 95D3A31C1C71E270003A750C /* Base */, 398 | ); 399 | name = LaunchScreen.storyboard; 400 | sourceTree = ""; 401 | }; 402 | /* End PBXVariantGroup section */ 403 | 404 | /* Begin XCBuildConfiguration section */ 405 | 3539417F1CDDF47F0044FD7C /* Debug */ = { 406 | isa = XCBuildConfiguration; 407 | buildSettings = { 408 | APPLICATION_EXTENSION_API_ONLY = YES; 409 | CLANG_ANALYZER_NONNULL = YES; 410 | CODE_SIGN_IDENTITY = "iPhone Developer"; 411 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 412 | CURRENT_PROJECT_VERSION = 1; 413 | DEFINES_MODULE = YES; 414 | DYLIB_COMPATIBILITY_VERSION = 1; 415 | DYLIB_CURRENT_VERSION = 1; 416 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 417 | INFOPLIST_FILE = Classes/Info.plist; 418 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 419 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 420 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 421 | PRODUCT_BUNDLE_IDENTIFIER = com.zte.CPImageViewer; 422 | PRODUCT_NAME = "$(TARGET_NAME)"; 423 | SKIP_INSTALL = YES; 424 | TARGETED_DEVICE_FAMILY = "1,2"; 425 | VERSION_INFO_PREFIX = ""; 426 | }; 427 | name = Debug; 428 | }; 429 | 353941801CDDF47F0044FD7C /* Release */ = { 430 | isa = XCBuildConfiguration; 431 | buildSettings = { 432 | APPLICATION_EXTENSION_API_ONLY = YES; 433 | CLANG_ANALYZER_NONNULL = YES; 434 | CODE_SIGN_IDENTITY = "iPhone Developer"; 435 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 436 | CURRENT_PROJECT_VERSION = 1; 437 | DEFINES_MODULE = YES; 438 | DYLIB_COMPATIBILITY_VERSION = 1; 439 | DYLIB_CURRENT_VERSION = 1; 440 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 441 | INFOPLIST_FILE = Classes/Info.plist; 442 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 443 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 444 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 445 | PRODUCT_BUNDLE_IDENTIFIER = com.zte.CPImageViewer; 446 | PRODUCT_NAME = "$(TARGET_NAME)"; 447 | SKIP_INSTALL = YES; 448 | TARGETED_DEVICE_FAMILY = "1,2"; 449 | VERSION_INFO_PREFIX = ""; 450 | }; 451 | name = Release; 452 | }; 453 | 353941831CDDF47F0044FD7C /* Debug */ = { 454 | isa = XCBuildConfiguration; 455 | buildSettings = { 456 | CLANG_ANALYZER_NONNULL = YES; 457 | INFOPLIST_FILE = CPImageViewerTests/Info.plist; 458 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 459 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 460 | PRODUCT_BUNDLE_IDENTIFIER = com.zte.CPImageViewerTests; 461 | PRODUCT_NAME = "$(TARGET_NAME)"; 462 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CPImageViewerExample.app/CPImageViewerExample"; 463 | }; 464 | name = Debug; 465 | }; 466 | 353941841CDDF47F0044FD7C /* Release */ = { 467 | isa = XCBuildConfiguration; 468 | buildSettings = { 469 | CLANG_ANALYZER_NONNULL = YES; 470 | INFOPLIST_FILE = CPImageViewerTests/Info.plist; 471 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 472 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 473 | PRODUCT_BUNDLE_IDENTIFIER = com.zte.CPImageViewerTests; 474 | PRODUCT_NAME = "$(TARGET_NAME)"; 475 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CPImageViewerExample.app/CPImageViewerExample"; 476 | }; 477 | name = Release; 478 | }; 479 | 95D3A31F1C71E270003A750C /* Debug */ = { 480 | isa = XCBuildConfiguration; 481 | buildSettings = { 482 | ALWAYS_SEARCH_USER_PATHS = NO; 483 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 484 | CLANG_CXX_LIBRARY = "libc++"; 485 | CLANG_ENABLE_MODULES = YES; 486 | CLANG_ENABLE_OBJC_ARC = YES; 487 | CLANG_WARN_BOOL_CONVERSION = YES; 488 | CLANG_WARN_CONSTANT_CONVERSION = YES; 489 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 490 | CLANG_WARN_EMPTY_BODY = YES; 491 | CLANG_WARN_ENUM_CONVERSION = YES; 492 | CLANG_WARN_INT_CONVERSION = YES; 493 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 494 | CLANG_WARN_UNREACHABLE_CODE = YES; 495 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 496 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 497 | COPY_PHASE_STRIP = NO; 498 | CURRENT_PROJECT_VERSION = 167; 499 | DEBUG_INFORMATION_FORMAT = dwarf; 500 | ENABLE_STRICT_OBJC_MSGSEND = YES; 501 | ENABLE_TESTABILITY = YES; 502 | GCC_C_LANGUAGE_STANDARD = gnu99; 503 | GCC_DYNAMIC_NO_PIC = NO; 504 | GCC_NO_COMMON_BLOCKS = YES; 505 | GCC_OPTIMIZATION_LEVEL = 0; 506 | GCC_PREPROCESSOR_DEFINITIONS = ( 507 | "DEBUG=1", 508 | "$(inherited)", 509 | ); 510 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 511 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 512 | GCC_WARN_UNDECLARED_SELECTOR = YES; 513 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 514 | GCC_WARN_UNUSED_FUNCTION = YES; 515 | GCC_WARN_UNUSED_VARIABLE = YES; 516 | IPHONEOS_DEPLOYMENT_TARGET = 9.1; 517 | MTL_ENABLE_DEBUG_INFO = YES; 518 | ONLY_ACTIVE_ARCH = YES; 519 | SDKROOT = iphoneos; 520 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 521 | VERSIONING_SYSTEM = "apple-generic"; 522 | }; 523 | name = Debug; 524 | }; 525 | 95D3A3201C71E270003A750C /* Release */ = { 526 | isa = XCBuildConfiguration; 527 | buildSettings = { 528 | ALWAYS_SEARCH_USER_PATHS = NO; 529 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 530 | CLANG_CXX_LIBRARY = "libc++"; 531 | CLANG_ENABLE_MODULES = YES; 532 | CLANG_ENABLE_OBJC_ARC = YES; 533 | CLANG_WARN_BOOL_CONVERSION = YES; 534 | CLANG_WARN_CONSTANT_CONVERSION = YES; 535 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 536 | CLANG_WARN_EMPTY_BODY = YES; 537 | CLANG_WARN_ENUM_CONVERSION = YES; 538 | CLANG_WARN_INT_CONVERSION = YES; 539 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 540 | CLANG_WARN_UNREACHABLE_CODE = YES; 541 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 542 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 543 | COPY_PHASE_STRIP = NO; 544 | CURRENT_PROJECT_VERSION = 167; 545 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 546 | ENABLE_NS_ASSERTIONS = NO; 547 | ENABLE_STRICT_OBJC_MSGSEND = YES; 548 | GCC_C_LANGUAGE_STANDARD = gnu99; 549 | GCC_NO_COMMON_BLOCKS = YES; 550 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 551 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 552 | GCC_WARN_UNDECLARED_SELECTOR = YES; 553 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 554 | GCC_WARN_UNUSED_FUNCTION = YES; 555 | GCC_WARN_UNUSED_VARIABLE = YES; 556 | IPHONEOS_DEPLOYMENT_TARGET = 9.1; 557 | MTL_ENABLE_DEBUG_INFO = NO; 558 | SDKROOT = iphoneos; 559 | VALIDATE_PRODUCT = YES; 560 | VERSIONING_SYSTEM = "apple-generic"; 561 | }; 562 | name = Release; 563 | }; 564 | 95D3A3221C71E270003A750C /* Debug */ = { 565 | isa = XCBuildConfiguration; 566 | buildSettings = { 567 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 568 | CODE_SIGN_IDENTITY = "iPhone Developer"; 569 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 570 | CODE_SIGN_RESOURCE_RULES_PATH = ""; 571 | CURRENT_PROJECT_VERSION = 167; 572 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; 573 | INFOPLIST_FILE = CPImageViewer/Info.plist; 574 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 575 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 576 | PRODUCT_BUNDLE_IDENTIFIER = com.zte.CPImageViewer; 577 | PRODUCT_NAME = "$(TARGET_NAME)"; 578 | PROVISIONING_PROFILE = ""; 579 | }; 580 | name = Debug; 581 | }; 582 | 95D3A3231C71E270003A750C /* Release */ = { 583 | isa = XCBuildConfiguration; 584 | buildSettings = { 585 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 586 | CODE_SIGN_IDENTITY = "iPhone Developer"; 587 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 588 | CODE_SIGN_RESOURCE_RULES_PATH = ""; 589 | CURRENT_PROJECT_VERSION = 167; 590 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; 591 | INFOPLIST_FILE = CPImageViewer/Info.plist; 592 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 593 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 594 | PRODUCT_BUNDLE_IDENTIFIER = com.zte.CPImageViewer; 595 | PRODUCT_NAME = "$(TARGET_NAME)"; 596 | PROVISIONING_PROFILE = ""; 597 | }; 598 | name = Release; 599 | }; 600 | /* End XCBuildConfiguration section */ 601 | 602 | /* Begin XCConfigurationList section */ 603 | 3539417E1CDDF47F0044FD7C /* Build configuration list for PBXNativeTarget "CPImageViewer" */ = { 604 | isa = XCConfigurationList; 605 | buildConfigurations = ( 606 | 3539417F1CDDF47F0044FD7C /* Debug */, 607 | 353941801CDDF47F0044FD7C /* Release */, 608 | ); 609 | defaultConfigurationIsVisible = 0; 610 | defaultConfigurationName = Release; 611 | }; 612 | 353941821CDDF47F0044FD7C /* Build configuration list for PBXNativeTarget "CPImageViewerTests" */ = { 613 | isa = XCConfigurationList; 614 | buildConfigurations = ( 615 | 353941831CDDF47F0044FD7C /* Debug */, 616 | 353941841CDDF47F0044FD7C /* Release */, 617 | ); 618 | defaultConfigurationIsVisible = 0; 619 | defaultConfigurationName = Release; 620 | }; 621 | 95D3A30A1C71E26E003A750C /* Build configuration list for PBXProject "CPImageViewer" */ = { 622 | isa = XCConfigurationList; 623 | buildConfigurations = ( 624 | 95D3A31F1C71E270003A750C /* Debug */, 625 | 95D3A3201C71E270003A750C /* Release */, 626 | ); 627 | defaultConfigurationIsVisible = 0; 628 | defaultConfigurationName = Release; 629 | }; 630 | 95D3A3211C71E270003A750C /* Build configuration list for PBXNativeTarget "CPImageViewerExample" */ = { 631 | isa = XCConfigurationList; 632 | buildConfigurations = ( 633 | 95D3A3221C71E270003A750C /* Debug */, 634 | 95D3A3231C71E270003A750C /* Release */, 635 | ); 636 | defaultConfigurationIsVisible = 0; 637 | defaultConfigurationName = Release; 638 | }; 639 | /* End XCConfigurationList section */ 640 | }; 641 | rootObject = 95D3A3071C71E26E003A750C /* Project object */; 642 | } 643 | --------------------------------------------------------------------------------