├── 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 | 
10 |
11 |
12 |
13 | #####Push & Pop
14 |
15 | 
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 |
--------------------------------------------------------------------------------