From 3b1484a6e8c9fd0cff08aab73a472998caa88f33 Mon Sep 17 00:00:00 2001 From: Wallace Wu Date: Thu, 24 Aug 2017 17:17:01 -0400 Subject: [PATCH 01/24] Update camera viewcontroller to use CoreMotion --- .../project.pbxproj | 21 ++- .../ALCameraViewController-Bridging-Header.h | 6 + .../Utilities/CGAffineTransformHelper.h | 12 ++ .../Utilities/CGAffineTransformHelper.m | 97 +++++++++++++ .../Utilities/Utilities.swift | 5 +- .../ViewController/CameraViewController.swift | 135 ++++++++++++------ ALCameraViewController/Views/CameraView.swift | 8 +- 7 files changed, 234 insertions(+), 50 deletions(-) create mode 100644 ALCameraViewController/Utilities/ALCameraViewController-Bridging-Header.h create mode 100644 ALCameraViewController/Utilities/CGAffineTransformHelper.h create mode 100644 ALCameraViewController/Utilities/CGAffineTransformHelper.m diff --git a/ALCameraViewController.xcodeproj/project.pbxproj b/ALCameraViewController.xcodeproj/project.pbxproj index 947182ed..64944d8c 100644 --- a/ALCameraViewController.xcodeproj/project.pbxproj +++ b/ALCameraViewController.xcodeproj/project.pbxproj @@ -36,6 +36,7 @@ C484580C1D0AA44400ECDB15 /* CameraViewControllerConstraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBF7829B1CB2C04300DE3E63 /* CameraViewControllerConstraint.swift */; }; C4D9BA451CA7224B004F70F7 /* PhotoLibraryAuthorizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D9BA441CA7224B004F70F7 /* PhotoLibraryAuthorizer.swift */; }; C4D9BA471CA73163004F70F7 /* UIButtonExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D9BA461CA73163004F70F7 /* UIButtonExtensions.swift */; }; + E35A23FB1F4F5329001047FD /* CGAffineTransformHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E35A23FA1F4F5329001047FD /* CGAffineTransformHelper.m */; }; EBF7829C1CB2C04300DE3E63 /* CameraViewControllerConstraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBF7829B1CB2C04300DE3E63 /* CameraViewControllerConstraint.swift */; }; EBFE097D1CAF1D1A00A8C637 /* UIViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBFE097C1CAF1D1A00A8C637 /* UIViewExtensions.swift */; }; FA52EE0B1B44129B00E16B6F /* ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = FA52EE0A1B44129B00E16B6F /* ViewController.xib */; }; @@ -68,6 +69,9 @@ C4829FFF1CAEB16C00541D08 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; C4D9BA441CA7224B004F70F7 /* PhotoLibraryAuthorizer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhotoLibraryAuthorizer.swift; sourceTree = ""; }; C4D9BA461CA73163004F70F7 /* UIButtonExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIButtonExtensions.swift; sourceTree = ""; }; + E35A23F81F4F5328001047FD /* ALCameraViewController-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ALCameraViewController-Bridging-Header.h"; sourceTree = ""; }; + E35A23F91F4F5329001047FD /* CGAffineTransformHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CGAffineTransformHelper.h; sourceTree = ""; }; + E35A23FA1F4F5329001047FD /* CGAffineTransformHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CGAffineTransformHelper.m; sourceTree = ""; }; EBF7829B1CB2C04300DE3E63 /* CameraViewControllerConstraint.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = CameraViewControllerConstraint.swift; sourceTree = ""; tabWidth = 4; }; EBFE097C1CAF1D1A00A8C637 /* UIViewExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIViewExtensions.swift; sourceTree = ""; }; FA52EE0A1B44129B00E16B6F /* ViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ViewController.xib; sourceTree = ""; }; @@ -154,6 +158,9 @@ C4D9BA441CA7224B004F70F7 /* PhotoLibraryAuthorizer.swift */, C4D9BA461CA73163004F70F7 /* UIButtonExtensions.swift */, EBFE097C1CAF1D1A00A8C637 /* UIViewExtensions.swift */, + E35A23F91F4F5329001047FD /* CGAffineTransformHelper.h */, + E35A23FA1F4F5329001047FD /* CGAffineTransformHelper.m */, + E35A23F81F4F5328001047FD /* ALCameraViewController-Bridging-Header.h */, ); path = Utilities; sourceTree = ""; @@ -276,8 +283,8 @@ }; FAF0583E1B31618D008E5592 = { CreatedOnToolsVersion = 6.3.2; - DevelopmentTeam = GAPQH4AM76; - LastSwiftMigration = 0800; + DevelopmentTeam = 3TYX9FV267; + LastSwiftMigration = 0830; ProvisioningStyle = Automatic; }; }; @@ -358,6 +365,7 @@ buildActionMask = 2147483647; files = ( C44543211CA68DDE00644380 /* VolumeControl.swift in Sources */, + E35A23FB1F4F5329001047FD /* CGAffineTransformHelper.m in Sources */, FA7E6B9B1B429012000E1B14 /* ConfirmViewController.swift in Sources */, FA5FA3431B3AFA2B00497C62 /* PermissionsView.swift in Sources */, FAB50BFC1B413E8C009905B9 /* ImageFetcher.swift in Sources */, @@ -524,13 +532,16 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = GAPQH4AM76; + DEVELOPMENT_TEAM = 3TYX9FV267; INFOPLIST_FILE = "Example/Supporting Files/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.zero.CameraViewController; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "ALCameraViewController/Utilities/ALCameraViewController-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 3.0; }; name = Debug; @@ -540,13 +551,15 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = GAPQH4AM76; + DEVELOPMENT_TEAM = 3TYX9FV267; INFOPLIST_FILE = "Example/Supporting Files/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.zero.CameraViewController; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "ALCameraViewController/Utilities/ALCameraViewController-Bridging-Header.h"; SWIFT_VERSION = 3.0; }; name = Release; diff --git a/ALCameraViewController/Utilities/ALCameraViewController-Bridging-Header.h b/ALCameraViewController/Utilities/ALCameraViewController-Bridging-Header.h new file mode 100644 index 00000000..7dc26f2e --- /dev/null +++ b/ALCameraViewController/Utilities/ALCameraViewController-Bridging-Header.h @@ -0,0 +1,6 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + + +#import "CGAffineTransformHelper.h" diff --git a/ALCameraViewController/Utilities/CGAffineTransformHelper.h b/ALCameraViewController/Utilities/CGAffineTransformHelper.h new file mode 100644 index 00000000..1e7af7fd --- /dev/null +++ b/ALCameraViewController/Utilities/CGAffineTransformHelper.h @@ -0,0 +1,12 @@ +// +// CGAffineTransform+CGAffineTransformHelper.h +// ALCameraViewController +// +// Created by Zhu Wu on 8/24/17. +// Copyright © 2017 zero. All rights reserved. +// + +@import Foundation; +@import UIKit; + +NSString *affineTransformDescription(CGAffineTransform transform); diff --git a/ALCameraViewController/Utilities/CGAffineTransformHelper.m b/ALCameraViewController/Utilities/CGAffineTransformHelper.m new file mode 100644 index 00000000..a833d31e --- /dev/null +++ b/ALCameraViewController/Utilities/CGAffineTransformHelper.m @@ -0,0 +1,97 @@ +// +// CGAffineTransform+CGAffineTransformHelper.m +// ALCameraViewController +// +// Created by Zhu Wu on 8/24/17. +// Copyright © 2017 zero. All rights reserved. +// + +#import "CGAffineTransformHelper.h" + + +NSString *affineTransformDescription(CGAffineTransform transform) +{ + // check if it's simply the identity matrix + if (CGAffineTransformIsIdentity(transform)) { + return @"Is the identity transform"; + } + // the above does't catch things like a 720° rotation so also check it manually + if (fabs(transform.a - 1.0) < FLT_EPSILON && + fabs(transform.b - 0.0) < FLT_EPSILON && + fabs(transform.c - 0.0) < FLT_EPSILON && + fabs(transform.d - 1.0) < FLT_EPSILON && + fabs(transform.tx - 0.0) < FLT_EPSILON && + fabs(transform.ty - 0.0) < FLT_EPSILON) { + return @"Is the identity transform"; + } + + // The affine transforms is built up like this: + + // a b tx + // c d ty + // 0 0 1 + + // An array to hold all the different descirptions, charasteristics of the transform. + NSMutableArray *descriptions = [NSMutableArray array]; + + // Checking for a translation + if (fabs(transform.tx) > FLT_EPSILON) { // translation along X + [descriptions addObject:[NSString stringWithFormat:@"Will move %.2f along the X axis", + transform.tx]]; + } + if (fabs(transform.ty) > FLT_EPSILON) { // translation along Y + [descriptions addObject:[NSString stringWithFormat:@"Will move %.2f along the Y axis", + transform.ty]]; + } + + + // Checking for a rotation + CGFloat angle = atan2(transform.b, transform.a); // get the angle of the rotation. Note this assumes no shearing! + if (fabs(angle) < FLT_EPSILON || fabs(angle - M_PI) < FLT_EPSILON) { + // there is a change that there is a 180° rotation, in that case, A and D will and be negative. + BOOL bothAreNegative = transform.a < 0.0 && transform.d < 0.0; + + if (bothAreNegative) { + angle = M_PI; + } else { + angle = 0.0; // this is not considered a rotation, but a negative scale along one axis. + } + } + + // add the rotation description if there was an angle + if (fabs(angle) > FLT_EPSILON) { + [descriptions addObject:[NSString stringWithFormat:@"Will rotate %.1f° degrees", + angle*180.0/M_PI]]; + } + + + // Checking for a scale (and account for the possible rotation as well) + CGFloat scaleX = transform.a/cos(angle); + CGFloat scaleY = transform.d/cos(angle); + + + if (fabs(scaleX - scaleY) < FLT_EPSILON && fabs(scaleX - 1.0) > FLT_EPSILON) { + // if both are the same then we can format things a little bit nicer + [descriptions addObject:[NSString stringWithFormat:@"Will scale by %.2f along both X and Y", + scaleX]]; + } else { + // otherwise we look at X and Y scale separately + if (fabs(scaleX - 1.0) > FLT_EPSILON) { // scale along X + [descriptions addObject:[NSString stringWithFormat:@"Will scale by %.2f along the X axis", + scaleX]]; + } + + if (fabs(scaleY - 1.0) > FLT_EPSILON) { // scale along Y + [descriptions addObject:[NSString stringWithFormat:@"Will scale by %.2f along the Y axis", + scaleY]]; + } + } + + // Return something else when there is nothing to say about the transform matrix + if (descriptions.count == 0) { + return @"Can't easilly be described."; + } + + // join all the descriptions on their own line + return [descriptions componentsJoinedByString:@",\n"]; +} diff --git a/ALCameraViewController/Utilities/Utilities.swift b/ALCameraViewController/Utilities/Utilities.swift index 45e19e85..f596d5bd 100644 --- a/ALCameraViewController/Utilities/Utilities.swift +++ b/ALCameraViewController/Utilities/Utilities.swift @@ -28,8 +28,8 @@ internal func currentRotation(_ oldOrientation: UIInterfaceOrientation, newOrien switch oldOrientation { case .portrait: switch newOrientation { - case .landscapeLeft: return 90 - case .landscapeRight: return -90 + case .landscapeLeft: return -90 + case .landscapeRight: return 90 case .portraitUpsideDown: return 180 default: return 0 } @@ -54,6 +54,7 @@ internal func currentRotation(_ oldOrientation: UIInterfaceOrientation, newOrien } } + internal func largestPhotoSize() -> CGSize { let scale = UIScreen.main.scale let screenSize = UIScreen.main.bounds.size diff --git a/ALCameraViewController/ViewController/CameraViewController.swift b/ALCameraViewController/ViewController/CameraViewController.swift index 42d5cdcb..23cafb60 100644 --- a/ALCameraViewController/ViewController/CameraViewController.swift +++ b/ALCameraViewController/ViewController/CameraViewController.swift @@ -9,6 +9,7 @@ import UIKit import AVFoundation import Photos +import CoreMotion public typealias CameraViewCompletion = (UIImage?, PHAsset?) -> Void @@ -83,6 +84,12 @@ open class CameraViewController: UIViewController { var cameraOverlayWidthConstraint: NSLayoutConstraint? var cameraOverlayCenterConstraint: NSLayoutConstraint? + let motionManager : CMMotionManager = { + let motionManager = CMMotionManager() + motionManager.deviceMotionUpdateInterval = 0.2 + return motionManager + }() + let cameraView : CameraView = { let cameraView = CameraView() cameraView.translatesAutoresizingMaskIntoConstraints = false @@ -182,6 +189,10 @@ open class CameraViewController: UIViewController { return UIStatusBarAnimation.slide } + open override var supportedInterfaceOrientations: UIInterfaceOrientationMask { + return .portrait + } + /** * Configure the background of the superview to black * and add the views on this superview. Then, request @@ -247,7 +258,7 @@ open class CameraViewController: UIViewController { configCameraOverlayWidthConstraint(portrait) configCameraOverlayCenterConstraint(portrait) - rotate(actualInterfaceOrientation: statusBarOrientation) +// rotate(actualInterfaceOrientation: statusBarOrientation) super.updateViewConstraints() } @@ -334,11 +345,50 @@ open class CameraViewController: UIViewController { * orientation of CameraView. */ private func addRotateObserver() { - NotificationCenter.default.addObserver( - self, - selector: #selector(rotateCameraView), - name: NSNotification.Name.UIDeviceOrientationDidChange, - object: nil) + if motionManager.isDeviceMotionAvailable { + let queue = OperationQueue() + motionManager.startDeviceMotionUpdates(to: queue) { + [weak self] (data: CMDeviceMotion?, error: Error?) in + if let gravity = data?.gravity { + if let orientation = self?.calcOrientation(gravity) { + OperationQueue.main.addOperation { + // update UI here +// self?.rotateCameraView(orientation) + self?.rotate(actualInterfaceOrientation: orientation) + } + } + } + } + } + + } + + func calcOrientation(_ acceleration: CMAcceleration) -> UIInterfaceOrientation? { + var orientationNew:UIInterfaceOrientation?; + + if (acceleration.x >= 0.75) { + orientationNew = .landscapeLeft + } + else if (acceleration.x <= -0.75) { + orientationNew = .landscapeRight + } + else if (acceleration.y <= -0.75) { + orientationNew = .portrait; + } + else if (acceleration.y >= 0.75) { + orientationNew = .portraitUpsideDown; + } + + guard let _ = orientationNew else { + return nil + } + + if (orientationNew == lastInterfaceOrientation) { + return nil + } + + lastInterfaceOrientation = orientationNew + return orientationNew } internal func notifyCameraReady() { @@ -380,8 +430,8 @@ open class CameraViewController: UIViewController { libraryButton].forEach({ $0.isEnabled = enabled }) } - func rotateCameraView() { - cameraView.rotatePreview() + func rotateCameraView(_ orientation:UIInterfaceOrientation) { + cameraView.rotatePreview(orientation) } /** @@ -389,16 +439,20 @@ open class CameraViewController: UIViewController { * the last and actual orientation of the device. */ internal func rotate(actualInterfaceOrientation: UIInterfaceOrientation) { - - if lastInterfaceOrientation != nil { - let lastTransform = CGAffineTransform(rotationAngle: radians(currentRotation( - lastInterfaceOrientation!, newOrientation: actualInterfaceOrientation))) - setTransform(transform: lastTransform) - } +// +// if lastInterfaceOrientation != nil { +// let lastTransform = CGAffineTransform(rotationAngle: radians(currentRotation( +// lastInterfaceOrientation!, newOrientation: actualInterfaceOrientation))) +// setTransform(transform: lastTransform) +// } - let transform = CGAffineTransform(rotationAngle: 0) +// let transform = CGAffineTransform(rotationAngle: 0) + let transform = CGAffineTransform(rotationAngle: radians(currentRotation( + .portrait, newOrientation: actualInterfaceOrientation))) animationRunning = true + print(affineTransformDescription(transform)) + /** * Dispatch delay to avoid any conflict between the CATransaction of rotation of the screen * and CATransaction of animation of buttons. @@ -408,30 +462,31 @@ open class CameraViewController: UIViewController { let spring = animationSpring let options = rotateAnimation - let time: DispatchTime = DispatchTime.now() + Double(1 * UInt64(NSEC_PER_SEC)/10) - DispatchQueue.main.asyncAfter(deadline: time) { [weak self] in - - guard let _ = self else { - return - } - - CATransaction.begin() - CATransaction.setDisableActions(false) - CATransaction.commit() - - UIView.animate( - withDuration: duration, - delay: 0.1, - usingSpringWithDamping: spring, - initialSpringVelocity: 0, - options: options, - animations: { [weak self] in + CATransaction.begin() + CATransaction.setDisableActions(false) + CATransaction.commit() + + UIView.animate( + withDuration: duration, + delay: 0.1, + usingSpringWithDamping: spring, + initialSpringVelocity: 0, + options: options, + animations: { [weak self] in self?.setTransform(transform: transform) - }, completion: { [weak self] _ in - self?.animationRunning = false - }) - - } + }, completion: { [weak self] _ in + self?.animationRunning = false + }) +// +// let time: DispatchTime = DispatchTime.now() + Double(1 * UInt64(NSEC_PER_SEC)/10) +// DispatchQueue.main.asyncAfter(deadline: time) { [weak self] in +// +// guard let _ = self else { +// return +// } +// +// +// } } func setTransform(transform: CGAffineTransform) { @@ -493,13 +548,13 @@ open class CameraViewController: UIViewController { if connection.isEnabled { toggleButtons(enabled: false) - cameraView.capturePhoto { [weak self] image in + cameraView.capturePhoto(lastInterfaceOrientation!, { [weak self] (image) in guard let image = image else { self?.toggleButtons(enabled: true) return } self?.saveImage(image: image) - } + }) } } diff --git a/ALCameraViewController/Views/CameraView.swift b/ALCameraViewController/Views/CameraView.swift index 67a30f4c..1617553d 100644 --- a/ALCameraViewController/Views/CameraView.swift +++ b/ALCameraViewController/Views/CameraView.swift @@ -151,10 +151,10 @@ public class CameraView: UIView { return devices.filter { $0.position == position }.first } - public func capturePhoto(completion: @escaping CameraShotCompletion) { + public func capturePhoto(_ orientation: UIInterfaceOrientation = UIApplication.shared.statusBarOrientation, _ completion: @escaping CameraShotCompletion) { isUserInteractionEnabled = false - guard let output = imageOutput, let orientation = AVCaptureVideoOrientation(rawValue: UIDevice.current.orientation.rawValue) else { + guard let output = imageOutput, let orientation = AVCaptureVideoOrientation(rawValue: orientation.rawValue) else { completion(nil) return } @@ -239,12 +239,12 @@ public class CameraView: UIView { session.commitConfiguration() } - public func rotatePreview() { + public func rotatePreview(_ orientation: UIInterfaceOrientation = UIApplication.shared.statusBarOrientation) { guard preview != nil else { return } - switch UIApplication.shared.statusBarOrientation { + switch orientation { case .portrait: preview?.connection.videoOrientation = AVCaptureVideoOrientation.portrait break From 30cd84031265bf398c362a178ad4588b4b1eccb4 Mon Sep 17 00:00:00 2001 From: Wallace Wu Date: Thu, 24 Aug 2017 17:25:17 -0400 Subject: [PATCH 02/24] Remove debugging log --- .../ViewController/CameraViewController.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/ALCameraViewController/ViewController/CameraViewController.swift b/ALCameraViewController/ViewController/CameraViewController.swift index 23cafb60..205a11eb 100644 --- a/ALCameraViewController/ViewController/CameraViewController.swift +++ b/ALCameraViewController/ViewController/CameraViewController.swift @@ -451,8 +451,6 @@ open class CameraViewController: UIViewController { .portrait, newOrientation: actualInterfaceOrientation))) animationRunning = true - print(affineTransformDescription(transform)) - /** * Dispatch delay to avoid any conflict between the CATransaction of rotation of the screen * and CATransaction of animation of buttons. From 7b41751f93c7433bcbcd0f34b5c7645abe1641b0 Mon Sep 17 00:00:00 2001 From: Wallace Wu Date: Fri, 25 Aug 2017 09:37:17 -0400 Subject: [PATCH 03/24] Use xib to load UI --- .../project.pbxproj | 12 +- .../ViewController/CameraViewController.swift | 249 +++------ .../ViewController/CameraViewController.xib | 103 ++++ .../CameraViewControllerConstraint.swift | 528 ------------------ .../ConfirmViewController.swift | 4 + .../ViewController/ConfirmViewController.xib | 59 +- .../AppIcon.appiconset/Contents.json | 14 +- 7 files changed, 241 insertions(+), 728 deletions(-) create mode 100644 ALCameraViewController/ViewController/CameraViewController.xib delete mode 100644 ALCameraViewController/ViewController/CameraViewControllerConstraint.swift diff --git a/ALCameraViewController.xcodeproj/project.pbxproj b/ALCameraViewController.xcodeproj/project.pbxproj index 64944d8c..0f476977 100644 --- a/ALCameraViewController.xcodeproj/project.pbxproj +++ b/ALCameraViewController.xcodeproj/project.pbxproj @@ -33,11 +33,11 @@ C482A0141CAEB1B100541D08 /* CameraView.strings in Resources */ = {isa = PBXBuildFile; fileRef = FA8231371B3BF8F700A837BE /* CameraView.strings */; }; C482A0151CAEB1B100541D08 /* CameraViewAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FA5FA3441B3AFEB300497C62 /* CameraViewAssets.xcassets */; }; C484580B1D0AA44400ECDB15 /* UIViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBFE097C1CAF1D1A00A8C637 /* UIViewExtensions.swift */; }; - C484580C1D0AA44400ECDB15 /* CameraViewControllerConstraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBF7829B1CB2C04300DE3E63 /* CameraViewControllerConstraint.swift */; }; C4D9BA451CA7224B004F70F7 /* PhotoLibraryAuthorizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D9BA441CA7224B004F70F7 /* PhotoLibraryAuthorizer.swift */; }; C4D9BA471CA73163004F70F7 /* UIButtonExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D9BA461CA73163004F70F7 /* UIButtonExtensions.swift */; }; E35A23FB1F4F5329001047FD /* CGAffineTransformHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E35A23FA1F4F5329001047FD /* CGAffineTransformHelper.m */; }; - EBF7829C1CB2C04300DE3E63 /* CameraViewControllerConstraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBF7829B1CB2C04300DE3E63 /* CameraViewControllerConstraint.swift */; }; + E35A24031F4FE3AD001047FD /* CameraViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35A24011F4FE3A8001047FD /* CameraViewController.xib */; }; + E35A24041F4FEB0B001047FD /* CameraViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35A24011F4FE3A8001047FD /* CameraViewController.xib */; }; EBFE097D1CAF1D1A00A8C637 /* UIViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBFE097C1CAF1D1A00A8C637 /* UIViewExtensions.swift */; }; FA52EE0B1B44129B00E16B6F /* ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = FA52EE0A1B44129B00E16B6F /* ViewController.xib */; }; FA5FA3431B3AFA2B00497C62 /* PermissionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA5FA3421B3AFA2B00497C62 /* PermissionsView.swift */; }; @@ -72,7 +72,7 @@ E35A23F81F4F5328001047FD /* ALCameraViewController-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ALCameraViewController-Bridging-Header.h"; sourceTree = ""; }; E35A23F91F4F5329001047FD /* CGAffineTransformHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CGAffineTransformHelper.h; sourceTree = ""; }; E35A23FA1F4F5329001047FD /* CGAffineTransformHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CGAffineTransformHelper.m; sourceTree = ""; }; - EBF7829B1CB2C04300DE3E63 /* CameraViewControllerConstraint.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = CameraViewControllerConstraint.swift; sourceTree = ""; tabWidth = 4; }; + E35A24011F4FE3A8001047FD /* CameraViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CameraViewController.xib; sourceTree = ""; }; EBFE097C1CAF1D1A00A8C637 /* UIViewExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIViewExtensions.swift; sourceTree = ""; }; FA52EE0A1B44129B00E16B6F /* ViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ViewController.xib; sourceTree = ""; }; FA5FA3421B3AFA2B00497C62 /* PermissionsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PermissionsView.swift; sourceTree = ""; }; @@ -127,9 +127,9 @@ children = ( FAB50BF91B413E8C009905B9 /* PhotoLibraryViewController.swift */, FAF058651B316695008E5592 /* CameraViewController.swift */, + E35A24011F4FE3A8001047FD /* CameraViewController.xib */, FA7E6B9A1B429012000E1B14 /* ConfirmViewController.swift */, C4768BFF1CAF2EA100A084F8 /* ConfirmViewController.xib */, - EBF7829B1CB2C04300DE3E63 /* CameraViewControllerConstraint.swift */, ); path = ViewController; sourceTree = ""; @@ -314,6 +314,7 @@ buildActionMask = 2147483647; files = ( C482A0141CAEB1B100541D08 /* CameraView.strings in Resources */, + E35A24031F4FE3AD001047FD /* CameraViewController.xib in Resources */, C482A0151CAEB1B100541D08 /* CameraViewAssets.xcassets in Resources */, C4768C011CAF2EAA00A084F8 /* ConfirmViewController.xib in Resources */, ); @@ -323,6 +324,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + E35A24041F4FEB0B001047FD /* CameraViewController.xib in Resources */, FA52EE0B1B44129B00E16B6F /* ViewController.xib in Resources */, FA8231381B3BF8F700A837BE /* CameraView.strings in Resources */, FA5FA3451B3AFEB300497C62 /* CameraViewAssets.xcassets in Resources */, @@ -340,7 +342,6 @@ buildActionMask = 2147483647; files = ( C484580B1D0AA44400ECDB15 /* UIViewExtensions.swift in Sources */, - C484580C1D0AA44400ECDB15 /* CameraViewControllerConstraint.swift in Sources */, C482A0031CAEB18D00541D08 /* ImageFetcher.swift in Sources */, C482A0041CAEB18D00541D08 /* SingleImageSaver.swift in Sources */, C482A0051CAEB18D00541D08 /* SingleImageFetcher.swift in Sources */, @@ -369,7 +370,6 @@ FA7E6B9B1B429012000E1B14 /* ConfirmViewController.swift in Sources */, FA5FA3431B3AFA2B00497C62 /* PermissionsView.swift in Sources */, FAB50BFC1B413E8C009905B9 /* ImageFetcher.swift in Sources */, - EBF7829C1CB2C04300DE3E63 /* CameraViewControllerConstraint.swift in Sources */, FA82313A1B3C296C00A837BE /* Utilities.swift in Sources */, FAB50C001B413E8C009905B9 /* PhotoLibraryViewController.swift in Sources */, FAF0586A1B317894008E5592 /* CameraShot.swift in Sources */, diff --git a/ALCameraViewController/ViewController/CameraViewController.swift b/ALCameraViewController/ViewController/CameraViewController.swift index 205a11eb..fde2bcd7 100644 --- a/ALCameraViewController/ViewController/CameraViewController.swift +++ b/ALCameraViewController/ViewController/CameraViewController.swift @@ -90,95 +90,102 @@ open class CameraViewController: UIViewController { return motionManager }() - let cameraView : CameraView = { - let cameraView = CameraView() - cameraView.translatesAutoresizingMaskIntoConstraints = false - return cameraView - }() - + @IBOutlet weak var cameraView: CameraView! + +// let cameraView : CameraView = { +// let cameraView = CameraView() +// cameraView.translatesAutoresizingMaskIntoConstraints = false +// return cameraView +// }() + let cameraOverlay : CropOverlay = { let cameraOverlay = CropOverlay() cameraOverlay.translatesAutoresizingMaskIntoConstraints = false return cameraOverlay }() + + @IBOutlet weak var cameraButton: UIButton! + - let cameraButton : UIButton = { - let button = UIButton(frame: CGRect(x: 0, y: 0, width: 64, height: 64)) - button.translatesAutoresizingMaskIntoConstraints = false - button.isEnabled = false - button.setImage(UIImage(named: "cameraButton", - in: CameraGlobals.shared.bundle, - compatibleWith: nil), - for: .normal) - button.setImage(UIImage(named: "cameraButtonHighlighted", - in: CameraGlobals.shared.bundle, - compatibleWith: nil), - for: .highlighted) - return button - }() - - let closeButton : UIButton = { - let button = UIButton() - button.translatesAutoresizingMaskIntoConstraints = false - button.setImage(UIImage(named: "closeButton", - in: CameraGlobals.shared.bundle, - compatibleWith: nil), - for: .normal) - return button - }() - - let swapButton : UIButton = { - let button = UIButton() - button.translatesAutoresizingMaskIntoConstraints = false - button.setImage(UIImage(named: "swapButton", - in: CameraGlobals.shared.bundle, - compatibleWith: nil), - for: .normal) - return button - }() - - let libraryButton : UIButton = { - let button = UIButton() - button.translatesAutoresizingMaskIntoConstraints = false - button.setImage(UIImage(named: "libraryButton", - in: CameraGlobals.shared.bundle, - compatibleWith: nil), - for: .normal) - return button - }() - - let flashButton : UIButton = { - let button = UIButton(frame: CGRect(x: 0, y: 0, width: 44, height: 44)) - button.translatesAutoresizingMaskIntoConstraints = false - button.setImage(UIImage(named: "flashAutoIcon", - in: CameraGlobals.shared.bundle, - compatibleWith: nil), - for: .normal) - return button - }() - - let containerSwapLibraryButton : UIView = { - let view = UIView() - view.translatesAutoresizingMaskIntoConstraints = false - return view - }() +// let cameraButton : UIButton = { +// let button = UIButton(frame: CGRect(x: 0, y: 0, width: 64, height: 64)) +// button.translatesAutoresizingMaskIntoConstraints = false +// button.isEnabled = false +// button.setImage(UIImage(named: "cameraButton", +// in: CameraGlobals.shared.bundle, +// compatibleWith: nil), +// for: .normal) +// button.setImage(UIImage(named: "cameraButtonHighlighted", +// in: CameraGlobals.shared.bundle, +// compatibleWith: nil), +// for: .highlighted) +// return button +// }() + + @IBOutlet weak var closeButton: UIButton! +// let closeButton : UIButton = { +// let button = UIButton() +// button.translatesAutoresizingMaskIntoConstraints = false +// button.setImage(UIImage(named: "closeButton", +// in: CameraGlobals.shared.bundle, +// compatibleWith: nil), +// for: .normal) +// return button +// }() + + @IBOutlet weak var swapButton: UIButton! +// let swapButton : UIButton = { +// let button = UIButton() +// button.translatesAutoresizingMaskIntoConstraints = false +// button.setImage(UIImage(named: "swapButton", +// in: CameraGlobals.shared.bundle, +// compatibleWith: nil), +// for: .normal) +// return button +// }() + + @IBOutlet weak var libraryButton: UIButton! +// let libraryButton : UIButton = { +// let button = UIButton() +// button.translatesAutoresizingMaskIntoConstraints = false +// button.setImage(UIImage(named: "libraryButton", +// in: CameraGlobals.shared.bundle, +// compatibleWith: nil), +// for: .normal) +// return button +// }() + + @IBOutlet weak var flashButton: UIButton! +// let flashButton : UIButton = { +// let button = UIButton(frame: CGRect(x: 0, y: 0, width: 44, height: 44)) +// button.translatesAutoresizingMaskIntoConstraints = false +// button.setImage(UIImage(named: "flashAutoIcon", +// in: CameraGlobals.shared.bundle, +// compatibleWith: nil), +// for: .normal) +// return button +// }() +// +// let containerSwapLibraryButton : UIView = { +// let view = UIView() +// view.translatesAutoresizingMaskIntoConstraints = false +// return view +// }() private let allowsLibraryAccess: Bool + private var allowsSwapCamera: Bool = true public init(croppingEnabled: Bool, allowsLibraryAccess: Bool = true, allowsSwapCameraOrientation: Bool = true, completion: @escaping CameraViewCompletion) { self.allowsLibraryAccess = allowsLibraryAccess - super.init(nibName: nil, bundle: nil) + super.init(nibName: "CameraViewController", bundle: CameraGlobals.shared.bundle) onCompletion = completion allowCropping = croppingEnabled - cameraOverlay.isHidden = !allowCropping - libraryButton.isEnabled = allowsLibraryAccess - libraryButton.isHidden = !allowsLibraryAccess - swapButton.isEnabled = allowsSwapCameraOrientation - swapButton.isHidden = !allowsSwapCameraOrientation + allowsSwapCamera = allowsSwapCameraOrientation } required public init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") + allowsLibraryAccess = true + super.init(coder: aDecoder) } open override var prefersStatusBarHidden: Bool { @@ -193,76 +200,6 @@ open class CameraViewController: UIViewController { return .portrait } - /** - * Configure the background of the superview to black - * and add the views on this superview. Then, request - * the update of constraints for this superview. - */ - open override func loadView() { - super.loadView() - view.backgroundColor = UIColor.black - [cameraView, - cameraOverlay, - cameraButton, - closeButton, - flashButton, - containerSwapLibraryButton].forEach({ view.addSubview($0) }) - [swapButton, libraryButton].forEach({ containerSwapLibraryButton.addSubview($0) }) - view.setNeedsUpdateConstraints() - } - - /** - * Setup the constraints when the app is starting or rotating - * the screen. - * To avoid the override/conflict of stable constraint, these - * stable constraint are one time configurable. - * Any other dynamic constraint are configurable when the - * device is rotating, based on the device orientation. - */ - override open func updateViewConstraints() { - - if !didUpdateViews { - configCameraViewConstraints() - didUpdateViews = true - } - - let statusBarOrientation = UIApplication.shared.statusBarOrientation - let portrait = statusBarOrientation.isPortrait - - configCameraButtonEdgeConstraint(statusBarOrientation) - configCameraButtonGravityConstraint(portrait) - - removeCloseButtonConstraints() - configCloseButtonEdgeConstraint(statusBarOrientation) - configCloseButtonGravityConstraint(statusBarOrientation) - - removeContainerConstraints() - configContainerEdgeConstraint(statusBarOrientation) - configContainerGravityConstraint(statusBarOrientation) - - removeSwapButtonConstraints() - configSwapButtonEdgeConstraint(statusBarOrientation) - configSwapButtonGravityConstraint(portrait) - - removeLibraryButtonConstraints() - configLibraryEdgeButtonConstraint(statusBarOrientation) - configLibraryGravityButtonConstraint(portrait) - - configFlashEdgeButtonConstraint(statusBarOrientation) - configFlashGravityButtonConstraint(statusBarOrientation) - - let padding : CGFloat = portrait ? 16.0 : -16.0 - removeCameraOverlayEdgesConstraints() - configCameraOverlayEdgeOneContraint(portrait, padding: padding) - configCameraOverlayEdgeTwoConstraint(portrait, padding: padding) - configCameraOverlayWidthConstraint(portrait) - configCameraOverlayCenterConstraint(portrait) - -// rotate(actualInterfaceOrientation: statusBarOrientation) - - super.updateViewConstraints() - } - /** * Add observer to check when the camera has started, * enable the volume buttons to take the picture, @@ -274,6 +211,13 @@ open class CameraViewController: UIViewController { */ open override func viewDidLoad() { super.viewDidLoad() + + cameraOverlay.isHidden = !allowCropping + libraryButton.isEnabled = allowsLibraryAccess + libraryButton.isHidden = !allowsLibraryAccess + swapButton.isEnabled = allowsSwapCamera + swapButton.isHidden = !allowsSwapCamera + setupActions() checkPermissions() cameraView.configureFocus() @@ -353,7 +297,6 @@ open class CameraViewController: UIViewController { if let orientation = self?.calcOrientation(gravity) { OperationQueue.main.addOperation { // update UI here -// self?.rotateCameraView(orientation) self?.rotate(actualInterfaceOrientation: orientation) } } @@ -439,14 +382,6 @@ open class CameraViewController: UIViewController { * the last and actual orientation of the device. */ internal func rotate(actualInterfaceOrientation: UIInterfaceOrientation) { -// -// if lastInterfaceOrientation != nil { -// let lastTransform = CGAffineTransform(rotationAngle: radians(currentRotation( -// lastInterfaceOrientation!, newOrientation: actualInterfaceOrientation))) -// setTransform(transform: lastTransform) -// } - -// let transform = CGAffineTransform(rotationAngle: 0) let transform = CGAffineTransform(rotationAngle: radians(currentRotation( .portrait, newOrientation: actualInterfaceOrientation))) animationRunning = true @@ -475,16 +410,6 @@ open class CameraViewController: UIViewController { }, completion: { [weak self] _ in self?.animationRunning = false }) -// -// let time: DispatchTime = DispatchTime.now() + Double(1 * UInt64(NSEC_PER_SEC)/10) -// DispatchQueue.main.asyncAfter(deadline: time) { [weak self] in -// -// guard let _ = self else { -// return -// } -// -// -// } } func setTransform(transform: CGAffineTransform) { diff --git a/ALCameraViewController/ViewController/CameraViewController.xib b/ALCameraViewController/ViewController/CameraViewController.xib new file mode 100644 index 00000000..f675b830 --- /dev/null +++ b/ALCameraViewController/ViewController/CameraViewController.xib @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ALCameraViewController/ViewController/CameraViewControllerConstraint.swift b/ALCameraViewController/ViewController/CameraViewControllerConstraint.swift deleted file mode 100644 index 4b485532..00000000 --- a/ALCameraViewController/ViewController/CameraViewControllerConstraint.swift +++ /dev/null @@ -1,528 +0,0 @@ -// -// CameraViewControllerConstraint.swift -// CameraViewControllerConstraint -// -// Created by Pedro Paulo de Amorim. -// Copyright (c) 2016 zero. All rights reserved. -// - -import UIKit -import AVFoundation - -/** - * This extension provides the configuration of - * constraints for CameraViewController. - */ -extension CameraViewController { - - /** - * To attach the view to the edges of the superview, it needs - to be pinned on the sides of the self.view, based on the - edges of this superview. - * This configure the cameraView to show, in real time, the - * camera. - */ - func configCameraViewConstraints() { - [.left, .right, .top, .bottom].forEach({ - view.addConstraint(NSLayoutConstraint( - item: cameraView, - attribute: $0, - relatedBy: .equal, - toItem: view, - attribute: $0, - multiplier: 1.0, - constant: 0)) - }) - } - - /** - * Add the constraints based on the device orientation, - * this pin the button on the bottom part of the screen - * when the device is portrait, when landscape, pin - * the button on the right part of the screen. - */ - func configCameraButtonEdgeConstraint(_ statusBarOrientation: UIInterfaceOrientation) { - view.autoRemoveConstraint(cameraButtonEdgeConstraint) - - let attribute : NSLayoutAttribute = { - switch statusBarOrientation { - case .portrait: return .bottom - case .landscapeRight: return .right - case .landscapeLeft: return .left - default: return .top - } - }() - - cameraButtonEdgeConstraint = NSLayoutConstraint( - item: cameraButton, - attribute: attribute, - relatedBy: .equal, - toItem: view, - attribute: attribute, - multiplier: 1.0, - constant: attribute == .right || attribute == .bottom ? -8 : 8) - view.addConstraint(cameraButtonEdgeConstraint!) - } - - /** - * Add the constraints based on the device orientation, - * centerX the button based on the width of screen. - * When the device is landscape orientation, centerY - * the button based on the height of screen. - */ - func configCameraButtonGravityConstraint(_ portrait: Bool) { - view.autoRemoveConstraint(cameraButtonGravityConstraint) - let attribute : NSLayoutAttribute = portrait ? .centerX : .centerY - cameraButtonGravityConstraint = NSLayoutConstraint( - item: cameraButton, - attribute: attribute, - relatedBy: .equal, - toItem: view, - attribute: attribute, - multiplier: 1.0, - constant: 0) - view.addConstraint(cameraButtonGravityConstraint!) - } - - /** - * Remove the constraints of container. - */ - func removeContainerConstraints() { - view.autoRemoveConstraint(containerButtonsEdgeOneConstraint) - view.autoRemoveConstraint(containerButtonsEdgeTwoConstraint) - view.autoRemoveConstraint(containerButtonsGravityConstraint) - } - - /** - * Configure the edges constraints of container that - * handle the center position of SwapButton and - * LibraryButton. - */ - func configContainerEdgeConstraint(_ statusBarOrientation : UIInterfaceOrientation) { - - let attributeOne : NSLayoutAttribute - let attributeTwo : NSLayoutAttribute - - switch statusBarOrientation { - case .portrait: - attributeOne = .left - attributeTwo = .right - break - case .landscapeRight: - attributeOne = .bottom - attributeTwo = .top - break - case .landscapeLeft: - attributeOne = .top - attributeTwo = .bottom - break - default: - attributeOne = .right - attributeTwo = .left - break - } - - containerButtonsEdgeOneConstraint = NSLayoutConstraint( - item: containerSwapLibraryButton, - attribute: attributeOne, - relatedBy: .equal, - toItem: cameraButton, - attribute: attributeTwo, - multiplier: 1.0, - constant: 0) - view.addConstraint(containerButtonsEdgeOneConstraint!) - - containerButtonsEdgeTwoConstraint = NSLayoutConstraint( - item: containerSwapLibraryButton, - attribute: attributeTwo, - relatedBy: .equal, - toItem: view, - attribute: attributeTwo, - multiplier: 1.0, - constant: 0) - view.addConstraint(containerButtonsEdgeTwoConstraint!) - - } - - /** - * Configure the gravity of container, based on the - * orientation of the device. - */ - func configContainerGravityConstraint(_ statusBarOrientation : UIInterfaceOrientation) { - let attributeCenter : NSLayoutAttribute = statusBarOrientation.isPortrait ? .centerY : .centerX - containerButtonsGravityConstraint = NSLayoutConstraint( - item: containerSwapLibraryButton, - attribute: attributeCenter, - relatedBy: .equal, - toItem: cameraButton, - attribute: attributeCenter, - multiplier: 1.0, - constant: 0) - view.addConstraint(containerButtonsGravityConstraint!) - } - - /** - * Remove the SwapButton constraints to be updated when - * the device was rotated. - */ - func removeSwapButtonConstraints() { - view.autoRemoveConstraint(swapButtonEdgeOneConstraint) - view.autoRemoveConstraint(swapButtonEdgeTwoConstraint) - view.autoRemoveConstraint(swapButtonGravityConstraint) - } - - /** - * If the device is portrait, pin the SwapButton on the - * right side of the CameraButton. - * If landscape, pin the SwapButton on the top of the - * CameraButton. - */ - func configSwapButtonEdgeConstraint(_ statusBarOrientation : UIInterfaceOrientation) { - - let attributeOne : NSLayoutAttribute - let attributeTwo : NSLayoutAttribute - - switch statusBarOrientation { - case .portrait: - attributeOne = .top - attributeTwo = .bottom - break - case .landscapeRight: - attributeOne = .left - attributeTwo = .right - break - case .landscapeLeft: - attributeOne = .right - attributeTwo = .left - break - default: - attributeOne = .bottom - attributeTwo = .top - break - } - - swapButtonEdgeOneConstraint = NSLayoutConstraint( - item: swapButton, - attribute: attributeOne, - relatedBy: .equal, - toItem: containerSwapLibraryButton, - attribute: attributeOne, - multiplier: 1.0, - constant: 0) - view.addConstraint(swapButtonEdgeOneConstraint!) - - swapButtonEdgeTwoConstraint = NSLayoutConstraint( - item: swapButton, - attribute: attributeTwo, - relatedBy: .equal, - toItem: containerSwapLibraryButton, - attribute: attributeTwo, - multiplier: 1.0, - constant: 0) - view.addConstraint(swapButtonEdgeTwoConstraint!) - - } - - /** - * Configure the center of SwapButton, based on the - * axis center of CameraButton. - */ - func configSwapButtonGravityConstraint(_ portrait: Bool) { - swapButtonGravityConstraint = NSLayoutConstraint( - item: swapButton, - attribute: portrait ? .right : .bottom, - relatedBy: .lessThanOrEqual, - toItem: containerSwapLibraryButton, - attribute: portrait ? .centerX : .centerY, - multiplier: 1.0, - constant: -4.0 * DeviceConfig.SCREEN_MULTIPLIER) - view.addConstraint(swapButtonGravityConstraint!) - } - - func removeCloseButtonConstraints() { - view.autoRemoveConstraint(closeButtonEdgeConstraint) - view.autoRemoveConstraint(closeButtonGravityConstraint) - } - - /** - * Pin the close button to the left of the superview. - */ - func configCloseButtonEdgeConstraint(_ statusBarOrientation : UIInterfaceOrientation) { - - let attribute : NSLayoutAttribute = { - switch statusBarOrientation { - case .portrait: return .left - case .landscapeRight, .landscapeLeft: return .centerX - default: return .right - } - }() - - closeButtonEdgeConstraint = NSLayoutConstraint( - item: closeButton, - attribute: attribute, - relatedBy: .equal, - toItem: attribute != .centerX ? view : cameraButton, - attribute: attribute, - multiplier: 1.0, - constant: attribute != .centerX ? 16 : 0) - view.addConstraint(closeButtonEdgeConstraint!) - } - - /** - * Add the constraint for the CloseButton, based on - * the device orientation. - * If portrait, it pin the CloseButton on the CenterY - * of the CameraButton. - * Else if landscape, pin this button on the Bottom - * of superview. - */ - func configCloseButtonGravityConstraint(_ statusBarOrientation : UIInterfaceOrientation) { - - let attribute : NSLayoutAttribute - let constant : CGFloat - - switch statusBarOrientation { - case .portrait: - attribute = .centerY - constant = 0.0 - break - case .landscapeRight: - attribute = .bottom - constant = -16.0 - break - case .landscapeLeft: - attribute = .top - constant = 16.0 - break - default: - attribute = .centerX - constant = 0.0 - break - } - - closeButtonGravityConstraint = NSLayoutConstraint( - item: closeButton, - attribute: attribute, - relatedBy: .equal, - toItem: attribute == .bottom || attribute == .top ? view : cameraButton, - attribute: attribute, - multiplier: 1.0, - constant: constant) - - view.addConstraint(closeButtonGravityConstraint!) - } - - /** - * Remove the LibraryButton constraints to be updated when - * the device was rotated. - */ - func removeLibraryButtonConstraints() { - view.autoRemoveConstraint(libraryButtonEdgeOneConstraint) - view.autoRemoveConstraint(libraryButtonEdgeTwoConstraint) - view.autoRemoveConstraint(libraryButtonGravityConstraint) - } - - /** - * Add the constraint of the LibraryButton, if the device - * orientation is portrait, pin the right side of SwapButton - * to the left side of LibraryButton. - * If landscape, pin the bottom side of CameraButton on the - * top side of LibraryButton. - */ - func configLibraryEdgeButtonConstraint(_ statusBarOrientation : UIInterfaceOrientation) { - - let attributeOne : NSLayoutAttribute - let attributeTwo : NSLayoutAttribute - - switch statusBarOrientation { - case .portrait: - attributeOne = .top - attributeTwo = .bottom - break - case .landscapeRight: - attributeOne = .left - attributeTwo = .right - break - case .landscapeLeft: - attributeOne = .right - attributeTwo = .left - break - default: - attributeOne = .bottom - attributeTwo = .top - break - } - - libraryButtonEdgeOneConstraint = NSLayoutConstraint( - item: libraryButton, - attribute: attributeOne, - relatedBy: .equal, - toItem: containerSwapLibraryButton, - attribute: attributeOne, - multiplier: 1.0, - constant: 0) - view.addConstraint(libraryButtonEdgeOneConstraint!) - - libraryButtonEdgeTwoConstraint = NSLayoutConstraint( - item: libraryButton, - attribute: attributeTwo, - relatedBy: .equal, - toItem: containerSwapLibraryButton, - attribute: attributeTwo, - multiplier: 1.0, - constant: 0) - view.addConstraint(libraryButtonEdgeTwoConstraint!) - - } - - /** - * Set the center gravity of the LibraryButton based - * on the position of CameraButton. - */ - func configLibraryGravityButtonConstraint(_ portrait: Bool) { - libraryButtonGravityConstraint = NSLayoutConstraint( - item: libraryButton, - attribute: portrait ? .left : .top, - relatedBy: .lessThanOrEqual, - toItem: containerSwapLibraryButton, - attribute: portrait ? .centerX : .centerY, - multiplier: 1.0, - constant: 4.0 * DeviceConfig.SCREEN_MULTIPLIER) - view.addConstraint(libraryButtonGravityConstraint!) - } - - /** - * If the device orientation is portrait, pin the top of - * FlashButton to the top side of superview. - * Else if, pin the FlashButton bottom side on the top side - * of SwapButton. - */ - func configFlashEdgeButtonConstraint(_ statusBarOrientation: UIInterfaceOrientation) { - view.autoRemoveConstraint(flashButtonEdgeConstraint) - - let constraintRight = statusBarOrientation == .portrait || statusBarOrientation == .landscapeRight - let attribute : NSLayoutAttribute = constraintRight ? .top : .bottom - - flashButtonEdgeConstraint = NSLayoutConstraint( - item: flashButton, - attribute: attribute, - relatedBy: .equal, - toItem: view, - attribute: attribute, - multiplier: 1.0, - constant: constraintRight ? 8 : -8) - view.addConstraint(flashButtonEdgeConstraint!) - } - - /** - * If the device orientation is portrait, pin the - right side of FlashButton to the right side of - * superview. - * Else if, centerX the FlashButton on the CenterX - * of CameraButton. - */ - func configFlashGravityButtonConstraint(_ statusBarOrientation: UIInterfaceOrientation) { - view.autoRemoveConstraint(flashButtonGravityConstraint) - - let constraintRight = statusBarOrientation == .portrait || statusBarOrientation == .landscapeLeft - let attribute : NSLayoutAttribute = constraintRight ? .right : .left - - flashButtonGravityConstraint = NSLayoutConstraint( - item: flashButton, - attribute: attribute, - relatedBy: .equal, - toItem: view, - attribute: attribute, - multiplier: 1.0, - constant: constraintRight ? -8 : 8) - view.addConstraint(flashButtonGravityConstraint!) - } - - /** - * Used to create a perfect square for CameraOverlay. - * This method will determinate the size of CameraOverlay, - * if portrait, it will use the width of superview to - * determinate the height of the view. Else if landscape, - * it uses the height of the superview to create the width - * of the CameraOverlay. - */ - func configCameraOverlayWidthConstraint(_ portrait: Bool) { - view.autoRemoveConstraint(cameraOverlayWidthConstraint) - cameraOverlayWidthConstraint = NSLayoutConstraint( - item: cameraOverlay, - attribute: portrait ? .height : .width, - relatedBy: .equal, - toItem: cameraOverlay, - attribute: portrait ? .width : .height, - multiplier: 1.0, - constant: 0) - view.addConstraint(cameraOverlayWidthConstraint!) - } - - /** - * This method will center the relative position of - * CameraOverlay, based on the biggest size of the - * superview. - */ - func configCameraOverlayCenterConstraint(_ portrait: Bool) { - view.autoRemoveConstraint(cameraOverlayCenterConstraint) - let attribute : NSLayoutAttribute = portrait ? .centerY : .centerX - cameraOverlayCenterConstraint = NSLayoutConstraint( - item: cameraOverlay, - attribute: attribute, - relatedBy: .equal, - toItem: view, - attribute: attribute, - multiplier: 1.0, - constant: 0) - view.addConstraint(cameraOverlayCenterConstraint!) - } - - /** - * Remove the CameraOverlay constraints to be updated when - * the device was rotated. - */ - func removeCameraOverlayEdgesConstraints() { - view.autoRemoveConstraint(cameraOverlayEdgeOneConstraint) - view.autoRemoveConstraint(cameraOverlayEdgeTwoConstraint) - } - - /** - * It needs to get a determined smallest size of the screen - to create the smallest size to be used on CameraOverlay. - It uses the orientation of the screen to determinate where - the view will be pinned. - */ - func configCameraOverlayEdgeOneContraint(_ portrait: Bool, padding: CGFloat) { - let attribute : NSLayoutAttribute = portrait ? .left : .bottom - cameraOverlayEdgeOneConstraint = NSLayoutConstraint( - item: cameraOverlay, - attribute: attribute, - relatedBy: .equal, - toItem: view, - attribute: attribute, - multiplier: 1.0, - constant: padding) - view.addConstraint(cameraOverlayEdgeOneConstraint!) - } - - /** - * It needs to get a determined smallest size of the screen - to create the smallest size to be used on CameraOverlay. - It uses the orientation of the screen to determinate where - the view will be pinned. - */ - func configCameraOverlayEdgeTwoConstraint(_ portrait: Bool, padding: CGFloat) { - let attributeTwo : NSLayoutAttribute = portrait ? .right : .top - cameraOverlayEdgeTwoConstraint = NSLayoutConstraint( - item: cameraOverlay, - attribute: attributeTwo, - relatedBy: .equal, - toItem: view, - attribute: attributeTwo, - multiplier: 1.0, - constant: -padding) - view.addConstraint(cameraOverlayEdgeTwoConstraint!) - } - -} diff --git a/ALCameraViewController/ViewController/ConfirmViewController.swift b/ALCameraViewController/ViewController/ConfirmViewController.swift index dba22b06..475656a4 100644 --- a/ALCameraViewController/ViewController/ConfirmViewController.swift +++ b/ALCameraViewController/ViewController/ConfirmViewController.swift @@ -54,6 +54,10 @@ public class ConfirmViewController: UIViewController, UIScrollViewDelegate { public override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { return UIStatusBarAnimation.slide } + + open override var supportedInterfaceOrientations: UIInterfaceOrientationMask { + return .portrait + } public override func viewDidLoad() { super.viewDidLoad() diff --git a/ALCameraViewController/ViewController/ConfirmViewController.xib b/ALCameraViewController/ViewController/ConfirmViewController.xib index fd8a355a..0fb99dd6 100644 --- a/ALCameraViewController/ViewController/ConfirmViewController.xib +++ b/ALCameraViewController/ViewController/ConfirmViewController.xib @@ -1,8 +1,13 @@ - - + + + + + - + + + @@ -17,47 +22,41 @@ - + - - - - - - - + - - - - + @@ -114,6 +113,10 @@ + + + + @@ -124,10 +127,6 @@ - - - - @@ -187,14 +186,14 @@ - - - - + + + + diff --git a/Example/Supporting Files/Images.xcassets/AppIcon.appiconset/Contents.json b/Example/Supporting Files/Images.xcassets/AppIcon.appiconset/Contents.json index 4be0545c..575f58e9 100644 --- a/Example/Supporting Files/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Example/Supporting Files/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,15 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "size" : "29x29", "idiom" : "iphone", @@ -25,8 +35,8 @@ "scale" : "3x" }, { - "idiom" : "iphone", "size" : "60x60", + "idiom" : "iphone", "filename" : "icon@120.png", "scale" : "2x" }, @@ -41,4 +51,4 @@ "version" : 1, "author" : "xcode" } -} +} \ No newline at end of file From f532d414aad091b7bbc3e5efb2a1879352bfcee3 Mon Sep 17 00:00:00 2001 From: Wallace Wu Date: Mon, 28 Aug 2017 10:26:01 -0400 Subject: [PATCH 04/24] Added crop UI Modified confirm page --- .../project.pbxproj | 73 ++- .../cameraButton.imageset/Contents.json | 13 +- .../cameraButton.imageset/cameraButton.pdf | Bin 0 -> 4003 bytes .../cameraButton.imageset/cameraButton.png | Bin 2279 -> 0 bytes .../cameraButton.imageset/cameraButton@2x.png | Bin 7299 -> 0 bytes .../cameraButton.imageset/cameraButton@3x.png | Bin 12022 -> 0 bytes .../closeButton.imageset/Contents.json | 13 +- .../closeButton.imageset/closeButton.pdf | Bin 0 -> 4071 bytes .../closeButton.imageset/closeButton.png | Bin 1282 -> 0 bytes .../closeButton.imageset/closeButton@2x.png | Bin 2617 -> 0 bytes .../closeButton.imageset/closeButton@3x.png | Bin 4273 -> 0 bytes .../flashOffIcon.imageset/Contents.json | 13 +- .../flashOffIcon.imageset/flashOffIcon.pdf | Bin 0 -> 5890 bytes .../flashOffIcon.imageset/flashOffIcon.png | Bin 1441 -> 0 bytes .../flashOffIcon.imageset/flashOffIcon@2x.png | Bin 3091 -> 0 bytes .../flashOffIcon.imageset/flashOffIcon@3x.png | Bin 4933 -> 0 bytes .../libraryButton.imageset/Contents.json | 13 +- .../libraryButton.imageset/libraryButton.pdf | Bin 0 -> 4480 bytes .../libraryButton.imageset/libraryButton.png | Bin 2314 -> 0 bytes .../libraryButton@2x.png | Bin 4841 -> 0 bytes .../libraryButton@3x.png | Bin 7924 -> 0 bytes .../separator.imageset/Contents.json | 12 + .../separator.imageset/separator.pdf | Bin 0 -> 3858 bytes .../ALCameraViewController-Bridging-Header.h | 1 + .../Utilities/CGPointExtensions.swift | 42 ++ .../Utilities/CGRectExtensions.swift | 34 ++ .../Utilities/CIImage+Utilities.h | 50 ++ .../Utilities/CIImage+Utilities.m | 271 ++++++++++ .../ViewController/CameraViewController.swift | 48 +- .../ViewController/CameraViewController.xib | 32 +- .../ConfirmViewController.swift | 486 +++++------------- .../ViewController/ConfirmViewController.xib | 241 +++------ .../ViewController/CropViewController.swift | 417 +++++++++++++++ .../ViewController/CropViewController.xib | 151 ++++++ ALCameraViewController/Views/CameraView.swift | 1 + .../Views/OverlayView.swift | 207 ++++++++ 36 files changed, 1487 insertions(+), 631 deletions(-) create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/cameraButton.imageset/cameraButton.pdf delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/cameraButton.imageset/cameraButton.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/cameraButton.imageset/cameraButton@2x.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/cameraButton.imageset/cameraButton@3x.png create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/closeButton.imageset/closeButton.pdf delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/closeButton.imageset/closeButton.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/closeButton.imageset/closeButton@2x.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/closeButton.imageset/closeButton@3x.png create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/flashOffIcon.imageset/flashOffIcon.pdf delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/flashOffIcon.imageset/flashOffIcon.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/flashOffIcon.imageset/flashOffIcon@2x.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/flashOffIcon.imageset/flashOffIcon@3x.png create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/libraryButton.imageset/libraryButton.pdf delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/libraryButton.imageset/libraryButton.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/libraryButton.imageset/libraryButton@2x.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/libraryButton.imageset/libraryButton@3x.png create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/separator.imageset/Contents.json create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/separator.imageset/separator.pdf create mode 100644 ALCameraViewController/Utilities/CGPointExtensions.swift create mode 100644 ALCameraViewController/Utilities/CGRectExtensions.swift create mode 100644 ALCameraViewController/Utilities/CIImage+Utilities.h create mode 100644 ALCameraViewController/Utilities/CIImage+Utilities.m create mode 100644 ALCameraViewController/ViewController/CropViewController.swift create mode 100644 ALCameraViewController/ViewController/CropViewController.xib create mode 100644 ALCameraViewController/Views/OverlayView.swift diff --git a/ALCameraViewController.xcodeproj/project.pbxproj b/ALCameraViewController.xcodeproj/project.pbxproj index 0f476977..482b970e 100644 --- a/ALCameraViewController.xcodeproj/project.pbxproj +++ b/ALCameraViewController.xcodeproj/project.pbxproj @@ -11,8 +11,8 @@ C40665461C73A94100EB9751 /* CameraGlobals.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40665451C73A94100EB9751 /* CameraGlobals.swift */; }; C40665481C73B72D00EB9751 /* SingleImageFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40665471C73B72D00EB9751 /* SingleImageFetcher.swift */; }; C44543211CA68DDE00644380 /* VolumeControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = C44543201CA68DDE00644380 /* VolumeControl.swift */; }; - C4768C001CAF2EA100A084F8 /* ConfirmViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C4768BFF1CAF2EA100A084F8 /* ConfirmViewController.xib */; }; - C4768C011CAF2EAA00A084F8 /* ConfirmViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C4768BFF1CAF2EA100A084F8 /* ConfirmViewController.xib */; }; + C4768C001CAF2EA100A084F8 /* CropViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C4768BFF1CAF2EA100A084F8 /* CropViewController.xib */; }; + C4768C011CAF2EAA00A084F8 /* CropViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C4768BFF1CAF2EA100A084F8 /* CropViewController.xib */; }; C4829FFE1CAEB16C00541D08 /* CameraViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = C4829FFD1CAEB16C00541D08 /* CameraViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; C482A0031CAEB18D00541D08 /* ImageFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAB50BF01B413E8C009905B9 /* ImageFetcher.swift */; }; C482A0041CAEB18D00541D08 /* SingleImageSaver.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40665431C73A47C00EB9751 /* SingleImageSaver.swift */; }; @@ -25,7 +25,7 @@ C482A00B1CAEB18D00541D08 /* UIButtonExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D9BA461CA73163004F70F7 /* UIButtonExtensions.swift */; }; C482A00C1CAEB18D00541D08 /* PhotoLibraryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAB50BF91B413E8C009905B9 /* PhotoLibraryViewController.swift */; }; C482A00D1CAEB18D00541D08 /* CameraViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAF058651B316695008E5592 /* CameraViewController.swift */; }; - C482A00E1CAEB18D00541D08 /* ConfirmViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA7E6B9A1B429012000E1B14 /* ConfirmViewController.swift */; }; + C482A00E1CAEB18D00541D08 /* CropViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA7E6B9A1B429012000E1B14 /* CropViewController.swift */; }; C482A00F1CAEB18D00541D08 /* ImageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAB50BEE1B413E8C009905B9 /* ImageCell.swift */; }; C482A0101CAEB18D00541D08 /* PermissionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA5FA3421B3AFA2B00497C62 /* PermissionsView.swift */; }; C482A0111CAEB18D00541D08 /* CameraView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAF058671B3175C5008E5592 /* CameraView.swift */; }; @@ -35,16 +35,29 @@ C484580B1D0AA44400ECDB15 /* UIViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBFE097C1CAF1D1A00A8C637 /* UIViewExtensions.swift */; }; C4D9BA451CA7224B004F70F7 /* PhotoLibraryAuthorizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D9BA441CA7224B004F70F7 /* PhotoLibraryAuthorizer.swift */; }; C4D9BA471CA73163004F70F7 /* UIButtonExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D9BA461CA73163004F70F7 /* UIButtonExtensions.swift */; }; + E33BE71D1F5134C1005842DC /* CIImage+Utilities.m in Sources */ = {isa = PBXBuildFile; fileRef = E33BE71B1F5134C1005842DC /* CIImage+Utilities.m */; }; + E33BE71E1F5134C1005842DC /* CIImage+Utilities.m in Sources */ = {isa = PBXBuildFile; fileRef = E33BE71B1F5134C1005842DC /* CIImage+Utilities.m */; }; + E33BE71F1F5134C1005842DC /* CIImage+Utilities.h in Headers */ = {isa = PBXBuildFile; fileRef = E33BE71C1F5134C1005842DC /* CIImage+Utilities.h */; }; E35A23FB1F4F5329001047FD /* CGAffineTransformHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E35A23FA1F4F5329001047FD /* CGAffineTransformHelper.m */; }; E35A24031F4FE3AD001047FD /* CameraViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35A24011F4FE3A8001047FD /* CameraViewController.xib */; }; E35A24041F4FEB0B001047FD /* CameraViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35A24011F4FE3A8001047FD /* CameraViewController.xib */; }; + E35A24061F509CDC001047FD /* OverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35A24051F509CDC001047FD /* OverlayView.swift */; }; + E35A24071F509CDC001047FD /* OverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35A24051F509CDC001047FD /* OverlayView.swift */; }; + E35A24091F509FBD001047FD /* CGRectExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35A24081F509FBD001047FD /* CGRectExtensions.swift */; }; + E35A240A1F509FBD001047FD /* CGRectExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35A24081F509FBD001047FD /* CGRectExtensions.swift */; }; + E35A240C1F509FFC001047FD /* CGPointExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35A240B1F509FFC001047FD /* CGPointExtensions.swift */; }; + E35A240D1F509FFC001047FD /* CGPointExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35A240B1F509FFC001047FD /* CGPointExtensions.swift */; }; + E35A240F1F50B49A001047FD /* ConfirmViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35A240E1F50B49A001047FD /* ConfirmViewController.swift */; }; + E35A24101F50B49A001047FD /* ConfirmViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35A240E1F50B49A001047FD /* ConfirmViewController.swift */; }; + E35A24121F50B4A7001047FD /* ConfirmViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35A24111F50B4A7001047FD /* ConfirmViewController.xib */; }; + E35A24131F50B4A7001047FD /* ConfirmViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35A24111F50B4A7001047FD /* ConfirmViewController.xib */; }; EBFE097D1CAF1D1A00A8C637 /* UIViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBFE097C1CAF1D1A00A8C637 /* UIViewExtensions.swift */; }; FA52EE0B1B44129B00E16B6F /* ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = FA52EE0A1B44129B00E16B6F /* ViewController.xib */; }; FA5FA3431B3AFA2B00497C62 /* PermissionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA5FA3421B3AFA2B00497C62 /* PermissionsView.swift */; }; FA5FA3451B3AFEB300497C62 /* CameraViewAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FA5FA3441B3AFEB300497C62 /* CameraViewAssets.xcassets */; }; FA778A411B8319D8005807E7 /* image.jpg in Resources */ = {isa = PBXBuildFile; fileRef = FA778A401B8319D8005807E7 /* image.jpg */; }; FA787F1C1B4326F100B6B86E /* CropOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA787F1B1B4326F100B6B86E /* CropOverlay.swift */; }; - FA7E6B9B1B429012000E1B14 /* ConfirmViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA7E6B9A1B429012000E1B14 /* ConfirmViewController.swift */; }; + FA7E6B9B1B429012000E1B14 /* CropViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA7E6B9A1B429012000E1B14 /* CropViewController.swift */; }; FA8231381B3BF8F700A837BE /* CameraView.strings in Resources */ = {isa = PBXBuildFile; fileRef = FA8231371B3BF8F700A837BE /* CameraView.strings */; }; FA82313A1B3C296C00A837BE /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA8231391B3C296C00A837BE /* Utilities.swift */; }; FAB50BFB1B413E8C009905B9 /* ImageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAB50BEE1B413E8C009905B9 /* ImageCell.swift */; }; @@ -63,23 +76,30 @@ C40665451C73A94100EB9751 /* CameraGlobals.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CameraGlobals.swift; sourceTree = ""; }; C40665471C73B72D00EB9751 /* SingleImageFetcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleImageFetcher.swift; sourceTree = ""; }; C44543201CA68DDE00644380 /* VolumeControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VolumeControl.swift; sourceTree = ""; }; - C4768BFF1CAF2EA100A084F8 /* ConfirmViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ConfirmViewController.xib; sourceTree = ""; }; + C4768BFF1CAF2EA100A084F8 /* CropViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CropViewController.xib; sourceTree = ""; }; C4829FFB1CAEB16C00541D08 /* CameraViewController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CameraViewController.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C4829FFD1CAEB16C00541D08 /* CameraViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CameraViewController.h; sourceTree = ""; }; C4829FFF1CAEB16C00541D08 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; C4D9BA441CA7224B004F70F7 /* PhotoLibraryAuthorizer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhotoLibraryAuthorizer.swift; sourceTree = ""; }; C4D9BA461CA73163004F70F7 /* UIButtonExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIButtonExtensions.swift; sourceTree = ""; }; + E33BE71B1F5134C1005842DC /* CIImage+Utilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CIImage+Utilities.m"; sourceTree = ""; }; + E33BE71C1F5134C1005842DC /* CIImage+Utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CIImage+Utilities.h"; sourceTree = ""; }; E35A23F81F4F5328001047FD /* ALCameraViewController-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ALCameraViewController-Bridging-Header.h"; sourceTree = ""; }; E35A23F91F4F5329001047FD /* CGAffineTransformHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CGAffineTransformHelper.h; sourceTree = ""; }; E35A23FA1F4F5329001047FD /* CGAffineTransformHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CGAffineTransformHelper.m; sourceTree = ""; }; E35A24011F4FE3A8001047FD /* CameraViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CameraViewController.xib; sourceTree = ""; }; + E35A24051F509CDC001047FD /* OverlayView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OverlayView.swift; sourceTree = ""; }; + E35A24081F509FBD001047FD /* CGRectExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CGRectExtensions.swift; sourceTree = ""; }; + E35A240B1F509FFC001047FD /* CGPointExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CGPointExtensions.swift; sourceTree = ""; }; + E35A240E1F50B49A001047FD /* ConfirmViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfirmViewController.swift; sourceTree = ""; }; + E35A24111F50B4A7001047FD /* ConfirmViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ConfirmViewController.xib; sourceTree = ""; }; EBFE097C1CAF1D1A00A8C637 /* UIViewExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIViewExtensions.swift; sourceTree = ""; }; FA52EE0A1B44129B00E16B6F /* ViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ViewController.xib; sourceTree = ""; }; FA5FA3421B3AFA2B00497C62 /* PermissionsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PermissionsView.swift; sourceTree = ""; }; FA5FA3441B3AFEB300497C62 /* CameraViewAssets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = CameraViewAssets.xcassets; sourceTree = ""; }; FA778A401B8319D8005807E7 /* image.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = image.jpg; sourceTree = ""; }; FA787F1B1B4326F100B6B86E /* CropOverlay.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CropOverlay.swift; sourceTree = ""; }; - FA7E6B9A1B429012000E1B14 /* ConfirmViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfirmViewController.swift; sourceTree = ""; }; + FA7E6B9A1B429012000E1B14 /* CropViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CropViewController.swift; sourceTree = ""; }; FA8231371B3BF8F700A837BE /* CameraView.strings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; path = CameraView.strings; sourceTree = ""; }; FA8231391B3C296C00A837BE /* Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; tabWidth = 4; }; FAB50BEE1B413E8C009905B9 /* ImageCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = ImageCell.swift; sourceTree = ""; tabWidth = 4; }; @@ -128,8 +148,10 @@ FAB50BF91B413E8C009905B9 /* PhotoLibraryViewController.swift */, FAF058651B316695008E5592 /* CameraViewController.swift */, E35A24011F4FE3A8001047FD /* CameraViewController.xib */, - FA7E6B9A1B429012000E1B14 /* ConfirmViewController.swift */, - C4768BFF1CAF2EA100A084F8 /* ConfirmViewController.xib */, + FA7E6B9A1B429012000E1B14 /* CropViewController.swift */, + C4768BFF1CAF2EA100A084F8 /* CropViewController.xib */, + E35A240E1F50B49A001047FD /* ConfirmViewController.swift */, + E35A24111F50B4A7001047FD /* ConfirmViewController.xib */, ); path = ViewController; sourceTree = ""; @@ -137,6 +159,7 @@ FAB50BEB1B413E4E009905B9 /* Views */ = { isa = PBXGroup; children = ( + E35A24051F509CDC001047FD /* OverlayView.swift */, FAB50BEE1B413E8C009905B9 /* ImageCell.swift */, FA5FA3421B3AFA2B00497C62 /* PermissionsView.swift */, FAF058671B3175C5008E5592 /* CameraView.swift */, @@ -148,6 +171,8 @@ FAB50C021B4140AB009905B9 /* Utilities */ = { isa = PBXGroup; children = ( + E33BE71B1F5134C1005842DC /* CIImage+Utilities.m */, + E33BE71C1F5134C1005842DC /* CIImage+Utilities.h */, FAB50BF01B413E8C009905B9 /* ImageFetcher.swift */, C40665431C73A47C00EB9751 /* SingleImageSaver.swift */, C40665471C73B72D00EB9751 /* SingleImageFetcher.swift */, @@ -158,9 +183,11 @@ C4D9BA441CA7224B004F70F7 /* PhotoLibraryAuthorizer.swift */, C4D9BA461CA73163004F70F7 /* UIButtonExtensions.swift */, EBFE097C1CAF1D1A00A8C637 /* UIViewExtensions.swift */, + E35A24081F509FBD001047FD /* CGRectExtensions.swift */, E35A23F91F4F5329001047FD /* CGAffineTransformHelper.h */, E35A23FA1F4F5329001047FD /* CGAffineTransformHelper.m */, E35A23F81F4F5328001047FD /* ALCameraViewController-Bridging-Header.h */, + E35A240B1F509FFC001047FD /* CGPointExtensions.swift */, ); path = Utilities; sourceTree = ""; @@ -225,6 +252,7 @@ buildActionMask = 2147483647; files = ( C4829FFE1CAEB16C00541D08 /* CameraViewController.h in Headers */, + E33BE71F1F5134C1005842DC /* CIImage+Utilities.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -279,7 +307,7 @@ TargetAttributes = { C4829FFA1CAEB16C00541D08 = { CreatedOnToolsVersion = 7.3; - LastSwiftMigration = 0800; + LastSwiftMigration = 0830; }; FAF0583E1B31618D008E5592 = { CreatedOnToolsVersion = 6.3.2; @@ -315,8 +343,9 @@ files = ( C482A0141CAEB1B100541D08 /* CameraView.strings in Resources */, E35A24031F4FE3AD001047FD /* CameraViewController.xib in Resources */, + E35A24131F50B4A7001047FD /* ConfirmViewController.xib in Resources */, C482A0151CAEB1B100541D08 /* CameraViewAssets.xcassets in Resources */, - C4768C011CAF2EAA00A084F8 /* ConfirmViewController.xib in Resources */, + C4768C011CAF2EAA00A084F8 /* CropViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -330,7 +359,8 @@ FA5FA3451B3AFEB300497C62 /* CameraViewAssets.xcassets in Resources */, FAF0584C1B31618D008E5592 /* Images.xcassets in Resources */, FA778A411B8319D8005807E7 /* image.jpg in Resources */, - C4768C001CAF2EA100A084F8 /* ConfirmViewController.xib in Resources */, + C4768C001CAF2EA100A084F8 /* CropViewController.xib in Resources */, + E35A24121F50B4A7001047FD /* ConfirmViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -343,17 +373,22 @@ files = ( C484580B1D0AA44400ECDB15 /* UIViewExtensions.swift in Sources */, C482A0031CAEB18D00541D08 /* ImageFetcher.swift in Sources */, + E35A240D1F509FFC001047FD /* CGPointExtensions.swift in Sources */, C482A0041CAEB18D00541D08 /* SingleImageSaver.swift in Sources */, C482A0051CAEB18D00541D08 /* SingleImageFetcher.swift in Sources */, C482A0061CAEB18D00541D08 /* Utilities.swift in Sources */, + E33BE71E1F5134C1005842DC /* CIImage+Utilities.m in Sources */, C482A0071CAEB18D00541D08 /* CameraShot.swift in Sources */, + E35A240A1F509FBD001047FD /* CGRectExtensions.swift in Sources */, C482A0081CAEB18D00541D08 /* CameraGlobals.swift in Sources */, C482A0091CAEB18D00541D08 /* VolumeControl.swift in Sources */, C482A00A1CAEB18D00541D08 /* PhotoLibraryAuthorizer.swift in Sources */, + E35A24071F509CDC001047FD /* OverlayView.swift in Sources */, + E35A24101F50B49A001047FD /* ConfirmViewController.swift in Sources */, C482A00B1CAEB18D00541D08 /* UIButtonExtensions.swift in Sources */, C482A00C1CAEB18D00541D08 /* PhotoLibraryViewController.swift in Sources */, C482A00D1CAEB18D00541D08 /* CameraViewController.swift in Sources */, - C482A00E1CAEB18D00541D08 /* ConfirmViewController.swift in Sources */, + C482A00E1CAEB18D00541D08 /* CropViewController.swift in Sources */, C482A00F1CAEB18D00541D08 /* ImageCell.swift in Sources */, C482A0101CAEB18D00541D08 /* PermissionsView.swift in Sources */, C482A0111CAEB18D00541D08 /* CameraView.swift in Sources */, @@ -367,13 +402,17 @@ files = ( C44543211CA68DDE00644380 /* VolumeControl.swift in Sources */, E35A23FB1F4F5329001047FD /* CGAffineTransformHelper.m in Sources */, - FA7E6B9B1B429012000E1B14 /* ConfirmViewController.swift in Sources */, + FA7E6B9B1B429012000E1B14 /* CropViewController.swift in Sources */, + E35A240F1F50B49A001047FD /* ConfirmViewController.swift in Sources */, FA5FA3431B3AFA2B00497C62 /* PermissionsView.swift in Sources */, FAB50BFC1B413E8C009905B9 /* ImageFetcher.swift in Sources */, + E35A24091F509FBD001047FD /* CGRectExtensions.swift in Sources */, FA82313A1B3C296C00A837BE /* Utilities.swift in Sources */, FAB50C001B413E8C009905B9 /* PhotoLibraryViewController.swift in Sources */, FAF0586A1B317894008E5592 /* CameraShot.swift in Sources */, + E35A240C1F509FFC001047FD /* CGPointExtensions.swift in Sources */, FAF058661B316695008E5592 /* CameraViewController.swift in Sources */, + E35A24061F509CDC001047FD /* OverlayView.swift in Sources */, C4D9BA451CA7224B004F70F7 /* PhotoLibraryAuthorizer.swift in Sources */, FAB50BFB1B413E8C009905B9 /* ImageCell.swift in Sources */, EBFE097D1CAF1D1A00A8C637 /* UIViewExtensions.swift in Sources */, @@ -384,6 +423,7 @@ C40665461C73A94100EB9751 /* CameraGlobals.swift in Sources */, FAF058451B31618D008E5592 /* AppDelegate.swift in Sources */, C40665441C73A47C00EB9751 /* SingleImageSaver.swift in Sources */, + E33BE71D1F5134C1005842DC /* CIImage+Utilities.m in Sources */, FA787F1C1B4326F100B6B86E /* CropOverlay.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -395,6 +435,7 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ANALYZER_NONNULL = YES; + CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; @@ -409,6 +450,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.zero.CameraViewController; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 3.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -419,6 +461,7 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ANALYZER_NONNULL = YES; + CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -536,7 +579,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEVELOPMENT_TEAM = 3TYX9FV267; INFOPLIST_FILE = "Example/Supporting Files/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.zero.CameraViewController; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -555,7 +598,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEVELOPMENT_TEAM = 3TYX9FV267; INFOPLIST_FILE = "Example/Supporting Files/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.zero.CameraViewController; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/ALCameraViewController/CameraViewAssets.xcassets/cameraButton.imageset/Contents.json b/ALCameraViewController/CameraViewAssets.xcassets/cameraButton.imageset/Contents.json index 174a0b3c..394cf4a9 100644 --- a/ALCameraViewController/CameraViewAssets.xcassets/cameraButton.imageset/Contents.json +++ b/ALCameraViewController/CameraViewAssets.xcassets/cameraButton.imageset/Contents.json @@ -2,18 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "cameraButton.png" - }, - { - "idiom" : "universal", - "scale" : "2x", - "filename" : "cameraButton@2x.png" - }, - { - "idiom" : "universal", - "scale" : "3x", - "filename" : "cameraButton@3x.png" + "filename" : "cameraButton.pdf" } ], "info" : { diff --git a/ALCameraViewController/CameraViewAssets.xcassets/cameraButton.imageset/cameraButton.pdf b/ALCameraViewController/CameraViewAssets.xcassets/cameraButton.imageset/cameraButton.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9904e5cdf7343c1ec893fb79b8ef9e5f68d9e54e GIT binary patch literal 4003 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 literal 0 HcmV?d00001 diff --git a/ALCameraViewController/CameraViewAssets.xcassets/cameraButton.imageset/cameraButton.png b/ALCameraViewController/CameraViewAssets.xcassets/cameraButton.imageset/cameraButton.png deleted file mode 100644 index 82fe0866c2d4335929f1624a8e13759d26483c04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2279 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 BL{$I) diff --git a/ALCameraViewController/CameraViewAssets.xcassets/cameraButton.imageset/cameraButton@2x.png b/ALCameraViewController/CameraViewAssets.xcassets/cameraButton.imageset/cameraButton@2x.png deleted file mode 100644 index 3687d024c5fcef4c6cdbec8d66b4de34fa789ca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7299 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 diff --git a/ALCameraViewController/CameraViewAssets.xcassets/closeButton.imageset/Contents.json b/ALCameraViewController/CameraViewAssets.xcassets/closeButton.imageset/Contents.json index 71896cea..a455fea8 100644 --- a/ALCameraViewController/CameraViewAssets.xcassets/closeButton.imageset/Contents.json +++ b/ALCameraViewController/CameraViewAssets.xcassets/closeButton.imageset/Contents.json @@ -2,18 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "closeButton.png" - }, - { - "idiom" : "universal", - "scale" : "2x", - "filename" : "closeButton@2x.png" - }, - { - "idiom" : "universal", - "scale" : "3x", - "filename" : "closeButton@3x.png" + "filename" : "closeButton.pdf" } ], "info" : { diff --git a/ALCameraViewController/CameraViewAssets.xcassets/closeButton.imageset/closeButton.pdf b/ALCameraViewController/CameraViewAssets.xcassets/closeButton.imageset/closeButton.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2e609c5e1237c7c6593869eab9554b73eeff9802 GIT binary patch literal 4071 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 diff --git a/ALCameraViewController/CameraViewAssets.xcassets/closeButton.imageset/closeButton@2x.png b/ALCameraViewController/CameraViewAssets.xcassets/closeButton.imageset/closeButton@2x.png deleted file mode 100644 index 50e44fc6685b61a8a195ad650d111feab64ff73e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2617 zcmV-93dZ$`P)Px;^GQTORCodHom*@i)fs@#nX`7TLL@OUA#3lh?QE=)#JP~zki;0GIt>v*LR1A6 z9`ew>fK-G8NT^bIio{#{+=o;xNFYRzK#+?<*jyU0lQcJ57OhP-kQ+21sUh`kXAb{= zyl1jIp4pw5otd5W?mX-G+)OSc48TJ63AEY+HN{L5np&Os8@ZZfCO`388?mhBx1W7`1iJx+}Z z^m$H3HC6qr|F{6{xoXb=W5YFv(Vbvv+;eOF6`212WaiWJCk}q^r5Y~*D;s;ZKdx}) zVM;0U(#W7>an4nZYG0g89XJd+H81pf0(fmt&%JZW{Aa+Rs24_+T?Xe@#_8DmXH%)$ zrP@+*N!!rV+dfCD|1I5&_y@tKt>H>~_$#pA(cr`>U@G7ex~d{Um0&a_bSXey0+5HCh;alM ztA(m6xdxI5Ia^%}8=@?4Z3D&zts3fFOHwidstYF#pDn=H6%)M$siex!*zh&R6W8r@ z;gn*ma1c?av8ReXS8egg1lbhJcQL?<7@>JJ5njxiN{R<2bNReqgUJOM7OWy*Zeg1O zo$X4>cc8Yyh;LcEg-wSYndvdm_*X)^$eHMFoV z^AyTyx#ECX=a$~JM)gL(uzv#pM_fkud0sewK6~?z zul79u+%p>)V`D>K{io!`MKgP!erjjpwO3yHW#`8AjeY&6znz?#ax__PCeuz>y`qg@ zP7kN?*@&KCdasy%>*vKAufN>=Soh{`)Uk3!Yx|PLi}wC?&)b7u>ipfV=O5hl!n3&Y zqO>R5gy=W^wEJ@}by&(mmV~4*UQ`ics29{mJW#sq{>BDWjt2rj5C~*Cr1alhxKdiK zP8sIg8Cc5UvjAMrXxuktCW1fy^x!Gj zzG*WE#yVF~l$&eUtZE0iqTh&TyvOi=ojvbrKd%+sJ^y%j?>p~)@Na_|zTPT?W?&_H z5CPL@Y{kx?_ckCzFCiC#>vjEZ>&<##LJlR|Y~D0Nzh<$f?65F|5^S!KS(tfnF$`=EWa`mqi_?4dK&-6`j165Cff+IDE#zddgb|)(kFI3)zw@N;F)D8#1RqVK;4kn7U~N;EJx;nR5d}UeCh$ zQhY%ubkjzm7m-{YmVrhwxY*B?4PPZd245C8S+uz&7KWj+9k{ZjRSaZJy~vtkN$@OE z-pL*(a4QKicx4%2jV&z;$~j%>25zN5o>J74Fdy7R7^&MNjSl*3(Oa-Rw-Dy)LL=iT zb}gMAi#E4)LQf*_zHq5V$l=U>3~g*xSZ5NF9$02Xdk&`D50$F=L< z-H@uhD7jLWJextz)hVCz?F=lXYZ_5SprUA^6(-$j94>u7a3fw*({eH~F?r{2Z@;(S zk4+(1U0}5U``+p<3=R$Le(TRigWCKDKHB=^=0ANJaN1!U|AX&zt3bh>4E>9AfTuSy z7$BUsRRI7$vxp2OT-2ij7D~Y*o}bFALbicn9$?{aFu=xc)&U20S(lA^*75*DD0mLb z{8NvuT{t3;WtX>8lQB%N}Zfq*^35>F4ypbB!d;-V_S>=b`y|V<2Lp=(P zGVeZGyD}qyjO4J`EZ!0@KKvzmAq7X7W(jLyKmgbPqk?}8D+m}wXy}C$-2S7}`Pz|7 z0GJ3iMZ9P0lRddX=>GY`tx-%lMmT(qBS zOlrK>7d?#;F7A~s_)rP2@DG*X+(LHv>&Zlymw?4PK~Ep^>LTFxlEhrRq_QQ!DMy?Y zD>QNA#yHObOCxF@i<&0k8{jNxhVBN1N4x-i0?C(L@C*x-xQ3Qp=JBLDFw^HZV5zhA z!9GdC?{hgnIr-xRKR@`zfx!0QAr1HrO;P bKl}SL`E1*NLtEPK00000NkvXXu0mjf0B7x? diff --git a/ALCameraViewController/CameraViewAssets.xcassets/closeButton.imageset/closeButton@3x.png b/ALCameraViewController/CameraViewAssets.xcassets/closeButton.imageset/closeButton@3x.png deleted file mode 100644 index 45bf9baca7744bc51d3f9d137df7ff256471b914..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4273 zcmV;i5KixjP)Px_Ye_^wRCodHT}yBr#ToAI(XK4Zu`NqB*29uk58^_>DqFS{888YCHU_F7sXR_O zg%dd>RHafyI8Yo2msD~|ZaL)=0#t<*A$|~(#eiM1B)|p{7nUr^)}yd7P+-}5O?Uo( zq+WJcGo#tn>`c#NFFn)U)BXS7|7}lqPxs%Hg!s2>*Wt>M@QG%2VkXOt!p1}?-r6?BeLF)sv}BWx+8gnhZl^&3R!pDldFZd|x>(Xc4i z(c8PBf+U-%&{9;0ZH&+w!e~WF^yA_-C*m_f=`}(1(c5HxY$%<+S(3UuE;O)&Xz1yw zXh>8x3sROMlr&Sywt0+QPIZEl>(IuGQnENYu`n|>arW%(oD2cE2^JxGd&~Bc-RFE^-xB?6=VWf$u5Yv$+>>!){V)5p`oF9t9*XMD?^Cp-rjXv^@?td zk#0iidOyJMyiOr*>74Xk*KYTXrPH&X*Kbmx5`^f!_iz{0v_p|0LcSq@7(&-i^}TcQ zJxCJy$zI<3N{Fuej?`+J_6Q6W8oX3m;kqUkbp7?gw@*y_C8IBdXlpxKUQ zO{r^>!Ar2Ka2FNMHynFQwV z=#ILk)+!*yCxC~molRH&yFH^1pW9igTMJAWwhZyG(i!M(=0eO_<+h(d znXcHObBB%5qBWX(e*GEI-1+v7=5gX z5IE0(LrV|!j;pdk07oCSjj8#y%u^Ii2%Le$Nhc7()sc#gzHyQh1O#b;8O^C;XEclI zh~T#gLCby+f4X*JA#d}bP0%*R_oE`JE`|^cKU6_SCK}7!iU8H`M-1D5jX;iq?OX6G z13zIijqUPV>9~G-1mI1+skXUAgHPv|?Q`a)7Q`T2+yXs@dvlA3?^H#Aa(Yh>*sKuw z91{YUz2QoyxZh9+y#D4zTXC=%+RmvYjtPNlAme3kPGMCiAKI+CP8@P7kt0Ij>S$aL z>$K1~pIQjO=g@sB80J29-1E~1;%;QLjYeL3E1uclC5gPRYw`Pi3SSXr=FUz zL!JSaY0RO$5-EXj41sYzcvTEhD?V&JMMprom*Q zVN)CVEeV0Uu#JtkHV?;1!9xITing_q+>#KuB|mN*tY8apJhT#qZ7ozVCj>a_K>rLD z&&1IIM}RTy00A4DsbNY8^xOhVvqI^t!wiI|#o=VtUcG#enck*^KsP>Snd7+dAfQq6 zH^2%)po6cl_;d=7`P|n8ZH%_gFL?za(A!&nruaUb2$4Ssk2Y>tA z^Z&VZYgR7?6t|v168!GjXTIOn)!79rmbBrK(Th(%`@+Abrl*zlXp25S(dGk$d?azm zVRC)roe$y~f0?La_@_TS|HC`m+wQ`}z3`1iYpAbnICxJ_?XfpbeY~)+=;}U4r}`rq z{_^KP{`5N?J3CP(l&!jY%huhyI;viM?bydo%kd+h;50EcKK!AqJM+pw-_h_rvsEUj z7$Wd(tu5cqmo3%Y*p3GAqp6l;KpFDo!dA==neyeZyGNU&?PZ>C2myNp@lPicR1D|l z7QiK!Fnu-nK?*xEAbuz-%B&)mQYN%HI+2(683Gty)9xq7YgbXMn%4#L2TJhi5-XH`XJ_0X` zt!fErE)9+*p7_O6fA@~(B4o?y6)D0_27?gG954vMxKMgBDw_oP*QF*! z6v%*>N)BkoQHJZa`}2Vg(ml>l;!GvZSXOP`WJ+#~FLXvTDr7Kh4Sq1UY)tht<6O%i zS>Hldw_A!xkzpBAWWbES+oMRC$o5ql>X89Pe~h+tJ+qU7$v2k2`WWB;5kT(k)gXMu7~dJFG{XWpDfPxn9{tQ&h-+`Xd*Zpdyrgh10bEIhzlD(G$dJP5Gssx; zaCH3YaM=3{`I;jajBgqF3E{tYvU*?ng-#_g6MWMU^Cc-+!9p`54x7=06g$<_*yh*5 zT`7atA#wrz;Cg;~tk;TSeHk*Ctd6#l$BX57R(1Okk6eJ)M)+HZV#pv35+za~7hu>4 zM}&s>=Y$N{fgH8zXhww;$OT4Ncv}cZWWX87Cx7+g6Hh+%A`UaH{u_}X1#ls>Ereq- zEU%8v3`rwQ3ZsR94WD0H{VReRUnm)*o>3wiWb5xGDMja$OU%c!pRxfrmU<}3uz#`&}}lvx+2w500)o@ z#vmi2qA>{R00sBu+(IbSVW)p1?JrIleWeQeKil*0~xfP*#*#=2tO9o1^WeY#CuE z&Yr!^1sRbEDu!qP^bngbn;&G5GT4y~QZ3;Am?`b+`rN<= zqv#>Fs%mq!&iP{hzz6-m{LM43`3bz-479VoJ-L1RHuT0rFAZP*AG$XF`sU3=3ATzM zr}}^4eDG^hw%p~%;0U{$tot?kK$aO)4RN%APC-@k1BrbGd`T*Rc(Td~ zq-y0sn|;b=-*hUKV?qoM9|LC+{MGo?;S^f`^P#QKW~+51vn9=0Ad{V7c0DmR@_AjV z71o5YMzi!dPAvpDHh} zZxp@it!P4^%2VSbSD`aOV1<+8!y|P~tyMsZ z?ZpTXKjRJpT=4VfP9MkF$Tj`eObDzUNbyN+V_O~UR0`FBZfio;!-sV)F7=;2j-AMY zMigcu7Bk8)D~I!$YcJtY$1E|9D;)xeIbshr6g;9ZlggDA0t=p=p61(YHhn}Am9=q8 zVFtDPao95GGuQq$I5@cAR_Ub}GP3>mKlB)kK04hJGA?H&0!E+Vt>gcM6jxdXS%YgW zge(w30ey;#@#rH95tlEQMiWK{a?O2)e9=ll2%`=hebhFl=AoO@5>H;`!(QAyPC6~k zGpucBX;*v62!WO2JO#{XP6@)=fD{QkLE11ESQff&FfmPs)X2bUO z4~a(VffVrvF(+2Z%Y!2cIQQtU#ZE`(6=!=}icY0fg=}B%kq0QJ_rOWQUe;?RkMi;O ziV#e^+n+x1CJ5_l=g~^}lD8096$|)uez`H#Iw=Tkp(HxTLuO&%_!3t-X;i$tyq>}J z&ZCtezWh_$+K!f2*NH=*<-WMJ$TiK<*Gkfl%iaoE>6BYa@prxuLWtdWaQFKR-a`FA_yt12bKNMTjg78hUyv8WNSwf|RAeyJ8Bcu{A5% z^GkRg!0{4%6dj49@91oI!JZ4Vh6)2qhHBl5fnSIYOXkkAmq48vW!4p$~N@@hi0nlh$U!~1+Q>>??Le{(sk z>Po`ClBA%*xW?z<%fUPqbdFLnZ(K7nhsPh|iMPgqw{Wf{9%X2pWN21l2;%+^4lf6Z T_5DxS00000NkvXXu0mjf&`Iq3 diff --git a/ALCameraViewController/CameraViewAssets.xcassets/flashOffIcon.imageset/Contents.json b/ALCameraViewController/CameraViewAssets.xcassets/flashOffIcon.imageset/Contents.json index 11564017..ac841418 100644 --- a/ALCameraViewController/CameraViewAssets.xcassets/flashOffIcon.imageset/Contents.json +++ b/ALCameraViewController/CameraViewAssets.xcassets/flashOffIcon.imageset/Contents.json @@ -2,18 +2,7 @@ "images" : [ { "idiom" : "universal", - "filename" : "flashOffIcon.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "flashOffIcon@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "flashOffIcon@3x.png", - "scale" : "3x" + "filename" : "flashOffIcon.pdf" } ], "info" : { diff --git a/ALCameraViewController/CameraViewAssets.xcassets/flashOffIcon.imageset/flashOffIcon.pdf b/ALCameraViewController/CameraViewAssets.xcassets/flashOffIcon.imageset/flashOffIcon.pdf new file mode 100644 index 0000000000000000000000000000000000000000..45a1280f66fa4727151eabc63b758090eb5564b7 GIT binary patch literal 5890 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 literal 0 HcmV?d00001 diff --git a/ALCameraViewController/CameraViewAssets.xcassets/flashOffIcon.imageset/flashOffIcon.png b/ALCameraViewController/CameraViewAssets.xcassets/flashOffIcon.imageset/flashOffIcon.png deleted file mode 100644 index 6c1377f8f9810c378affe466f8c8e05e9daea928..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1441 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 diff --git a/ALCameraViewController/CameraViewAssets.xcassets/flashOffIcon.imageset/flashOffIcon@3x.png b/ALCameraViewController/CameraViewAssets.xcassets/flashOffIcon.imageset/flashOffIcon@3x.png deleted file mode 100644 index 8d9de324aec3d6f8693a67868fff3724a41bf9a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4933 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 DmM-EW diff --git a/ALCameraViewController/CameraViewAssets.xcassets/libraryButton.imageset/Contents.json b/ALCameraViewController/CameraViewAssets.xcassets/libraryButton.imageset/Contents.json index b0c8a6af..4459c65f 100644 --- a/ALCameraViewController/CameraViewAssets.xcassets/libraryButton.imageset/Contents.json +++ b/ALCameraViewController/CameraViewAssets.xcassets/libraryButton.imageset/Contents.json @@ -2,18 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "libraryButton.png" - }, - { - "idiom" : "universal", - "scale" : "2x", - "filename" : "libraryButton@2x.png" - }, - { - "idiom" : "universal", - "scale" : "3x", - "filename" : "libraryButton@3x.png" + "filename" : "libraryButton.pdf" } ], "info" : { diff --git a/ALCameraViewController/CameraViewAssets.xcassets/libraryButton.imageset/libraryButton.pdf b/ALCameraViewController/CameraViewAssets.xcassets/libraryButton.imageset/libraryButton.pdf new file mode 100644 index 0000000000000000000000000000000000000000..21276c7634ebd35d50787bd28e0c2d33c9f7bccd GIT binary patch literal 4480 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 P00000NkvXXu0mjfTTfwQ diff --git a/ALCameraViewController/CameraViewAssets.xcassets/libraryButton.imageset/libraryButton@3x.png b/ALCameraViewController/CameraViewAssets.xcassets/libraryButton.imageset/libraryButton@3x.png deleted file mode 100644 index ffe3c797fa38949235ee30dc649faf96c06352e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7924 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 CGPoint { + return CGPoint(x: self.x+dx, y: self.y+dy) + } + + internal func transform(_ t: CGAffineTransform) -> CGPoint { + return self.applying(t) + } + + internal func transform(_ t: CATransform3D) -> CGPoint { + return self.applying(CATransform3DGetAffineTransform(t)) + } + + internal func distance(_ b: CGPoint) -> CGFloat { + return sqrt(pow(self.x - b.x, 2) + pow(self.y - b.y, 2)) + } + + internal func cgPointIn(_ ciSize: CGSize) -> CGPoint { + var t = CGAffineTransform(scaleX: 1, y: -1) + t = t.translatedBy(x: 0, y: -ciSize.height) + + return self.applying(t) + } + + internal func ciPointIn(_ cgSize: CGSize) -> CGPoint { + var t = CGAffineTransform(scaleX: 1, y: -1) + t = t.translatedBy(x: 0, y: -cgSize.height) + + return self.applying(t) + } + +} diff --git a/ALCameraViewController/Utilities/CGRectExtensions.swift b/ALCameraViewController/Utilities/CGRectExtensions.swift new file mode 100644 index 00000000..b883467f --- /dev/null +++ b/ALCameraViewController/Utilities/CGRectExtensions.swift @@ -0,0 +1,34 @@ +// +// CGRectExtensions.swift +// ALCameraViewController +// +// Created by Zhu Wu on 8/25/17. +// Copyright © 2017 zero. All rights reserved. +// + +import Foundation + +extension CGRect { + internal var topLeft: CGPoint { + return self.origin + } + internal var topRight: CGPoint { + return self.origin.translate(self.size.width, dy: 0) + } + internal var bottomLeft: CGPoint { + return self.origin.translate(0, dy: self.size.height) + } + internal var bottomRight: CGPoint { + return self.origin.translate(self.size.width, dy: self.size.height) + } + internal var center: CGPoint { + return CGPoint(x: origin.x + size.width/2, y: origin.y + size.height/2) + } + internal var bounds: CGRect { + return CGRect(origin: CGPoint.zero, size: size) + } + init(center: CGPoint, size: CGSize) { + self.init(x: center.x - size.width/2, y: center.y - size.height/2, width: size.width, height: size.height) + } +} + diff --git a/ALCameraViewController/Utilities/CIImage+Utilities.h b/ALCameraViewController/Utilities/CIImage+Utilities.h new file mode 100644 index 00000000..288ebf2a --- /dev/null +++ b/ALCameraViewController/Utilities/CIImage+Utilities.h @@ -0,0 +1,50 @@ +// +// CIImage+Utilities.h +// +// Modified by Denis Martin on 12/07/2015 +// Copyright (c) 2015 iRLMobile. All rights reserved. +// Based on IPDFCameraViewController: https://github.com/mmackh/IPDFCameraViewController/tree/master/IPDFCameraViewController +// Copyright (c) 2015 mackh ag. All rights reserved. +// + +@import UIKit; +@import CoreImage; + +@class IRLRectangleFeature; + +@protocol IRLRectangleFeatureProtocol +@property (readonly) CGPoint topLeft; +@property (readonly) CGPoint topRight; +@property (readonly) CGPoint bottomLeft; +@property (readonly) CGPoint bottomRight; +@end + +@interface CIRectangleFeature() +@end + +@interface CIImage (Utilities) + ++ (CIImage *)imageGradientImage:(CGFloat)threshold; + +- (UIImage*)makeUIImageWithContext:(CIContext*)context; +- (UIImage *)orientationCorrecterUIImage; + +// Filters +- (CIImage *)filteredImageUsingUltraContrastWithGradient:(CIImage *)gradient ; +- (CIImage *)filteredImageUsingEnhanceFilter ; +- (CIImage *)filteredImageUsingContrastFilter ; + +- (CIImage *)cropBordersWithMargin:(CGFloat)margin; +- (CIImage *)correctPerspectiveWithCGPoints:(NSArray*)points; +- (CIImage *)drawHighlightOverlayWithcolor:(UIColor*)color CIRectangleFeature:(id)rectangle; +- (CIImage *)drawCenterOverlayWithColor:(UIColor*)color point:(CGPoint)point; +- (CIImage *)drawFocusOverlayWithColor:(UIColor*)color point:(CGPoint)point amplitude:(CGFloat)amplitude; + +@end + +@interface IRLRectangleFeature : CIFeature +@property (readwrite) CGPoint topLeft; +@property (readwrite) CGPoint topRight; +@property (readwrite) CGPoint bottomLeft; +@property (readwrite) CGPoint bottomRight; +@end diff --git a/ALCameraViewController/Utilities/CIImage+Utilities.m b/ALCameraViewController/Utilities/CIImage+Utilities.m new file mode 100644 index 00000000..d7ba0cb7 --- /dev/null +++ b/ALCameraViewController/Utilities/CIImage+Utilities.m @@ -0,0 +1,271 @@ +// +// CIImage+Utilities.m +// +// Modified by Denis Martin on 12/07/2015 +// Copyright (c) 2015 iRLMobile. All rights reserved. +// Based on IPDFCameraViewController: https://github.com/mmackh/IPDFCameraViewController/tree/master/IPDFCameraViewController +// Copyright (c) 2015 mackh ag. All rights reserved. +// + +#import "CIImage+Utilities.h" + +@implementation CIImage (Utilities) + + ++ (CIImage *)imageGradientImage:(CGFloat)threshold { + CGSize size = CGSizeMake(256.0, 1.0); + CGRect r = CGRectZero; + r.size = size; + CGRect copy = r; + UIGraphicsBeginImageContextWithOptions(size, NO, 0.0); + + int points = 200; + [[UIColor whiteColor] setFill]; + [[UIBezierPath bezierPathWithRect:r] fill]; + r.size.width = r.size.width * threshold; + for (int i=0;i)rectangle { + + // Create the Overlay + CIImage *image = self; + CIColor *ciColor = [[CIColor alloc] initWithColor:color]; + CIImage *overlay = [CIImage imageWithColor:ciColor]; + + overlay = [overlay imageByCroppingToRect:image.extent]; + + overlay = [overlay imageByApplyingFilter:@"CIPerspectiveTransformWithExtent" + withInputParameters:@{ + @"inputExtent" : [CIVector vectorWithCGRect:image.extent], + @"inputTopLeft" : [CIVector vectorWithCGPoint:rectangle.topLeft], + @"inputTopRight" : [CIVector vectorWithCGPoint:rectangle.topRight], + @"inputBottomLeft" : [CIVector vectorWithCGPoint:rectangle.bottomLeft], + @"inputBottomRight" : [CIVector vectorWithCGPoint:rectangle.bottomRight] + }]; + + return [overlay imageByCompositingOverImage:image]; +} + +- (CIImage *)drawCenterOverlayWithColor:(UIColor*)color + point:(CGPoint)point { + + // Create the Overlay + CIImage *image = self; + CIColor *ciColor = [[CIColor alloc] initWithColor:color]; + CIImage *overlay = [CIImage imageWithColor:ciColor]; + overlay = [overlay imageByCroppingToRect:image.extent]; + + overlay = [overlay imageByApplyingFilter:@"CIPerspectiveTransformWithExtent" + withInputParameters:@{ + @"inputExtent" : [CIVector vectorWithCGRect:image.extent], + @"inputTopLeft" : [CIVector vectorWithCGPoint:CGPointMake(point.x-5, point.y-5)], + @"inputTopRight" : [CIVector vectorWithCGPoint:CGPointMake(point.x+5, point.y-5)], + @"inputBottomLeft" : [CIVector vectorWithCGPoint:CGPointMake(point.x-5, point.y+5)], + @"inputBottomRight" : [CIVector vectorWithCGPoint:CGPointMake(point.x+5, point.y+5)] + }]; + + return [overlay imageByCompositingOverImage:image]; +} + +- (CIImage *)drawFocusOverlayWithColor:(UIColor*)color + point:(CGPoint)point + amplitude:(CGFloat)amplitude +{ + + // Create the Overlay + CIImage *image = self; + CIColor *ciColor = [[CIColor alloc] initWithColor:color]; + CIImage *overlay = [CIImage imageWithColor:ciColor]; + overlay = [overlay imageByCroppingToRect:image.extent]; + + overlay = [overlay imageByApplyingFilter:@"CIPerspectiveTransformWithExtent" + withInputParameters:@{ + @"inputExtent" : [CIVector vectorWithCGRect:image.extent], + @"inputTopLeft" : [CIVector vectorWithCGPoint:CGPointMake(point.x-amplitude, point.y-amplitude)], + @"inputTopRight" : [CIVector vectorWithCGPoint:CGPointMake(point.x+amplitude, point.y-amplitude)], + @"inputBottomLeft" : [CIVector vectorWithCGPoint:CGPointMake(point.x-amplitude, point.y+amplitude)], + @"inputBottomRight" : [CIVector vectorWithCGPoint:CGPointMake(point.x+amplitude, point.y+amplitude)] + }]; + + return [overlay imageByCompositingOverImage:image]; +} + + + +@end + +@implementation IRLRectangleFeature + +@end diff --git a/ALCameraViewController/ViewController/CameraViewController.swift b/ALCameraViewController/ViewController/CameraViewController.swift index fde2bcd7..41d839dd 100644 --- a/ALCameraViewController/ViewController/CameraViewController.swift +++ b/ALCameraViewController/ViewController/CameraViewController.swift @@ -19,22 +19,23 @@ public extension CameraViewController { let imagePicker = PhotoLibraryViewController() let navigationController = UINavigationController(rootViewController: imagePicker) + navigationController.isNavigationBarHidden = true navigationController.navigationBar.barTintColor = UIColor.black navigationController.navigationBar.barStyle = UIBarStyle.black navigationController.modalTransitionStyle = UIModalTransitionStyle.crossDissolve imagePicker.onSelectionComplete = { [weak imagePicker] asset in if let asset = asset { - let confirmController = ConfirmViewController(asset: asset, allowsCropping: croppingEnabled) - confirmController.onComplete = { [weak imagePicker] image, asset in + let cropViewController = CropViewController(asset: asset, allowsCropping: croppingEnabled) + cropViewController.onComplete = { [weak imagePicker] image, asset in if let image = image, let asset = asset { completion(image, asset) } else { imagePicker?.dismiss(animated: true, completion: nil) } } - confirmController.modalTransitionStyle = UIModalTransitionStyle.crossDissolve - imagePicker?.present(confirmController, animated: true, completion: nil) + + imagePicker?.navigationController?.pushViewController(cropViewController, animated: true) } else { completion(nil, nil) } @@ -50,7 +51,7 @@ open class CameraViewController: UIViewController { var allowCropping = false var animationRunning = false - var lastInterfaceOrientation : UIInterfaceOrientation? + var lastInterfaceOrientation : UIInterfaceOrientation? = UIApplication.shared.statusBarOrientation open var onCompletion: CameraViewCompletion? var volumeControl: VolumeControl? @@ -549,19 +550,20 @@ open class CameraViewController: UIViewController { internal func layoutCameraResult(uiImage: UIImage) { cameraView.stopSession() - startConfirmController(uiImage: uiImage) + startCropController(uiImage: uiImage) toggleButtons(enabled: true) } internal func layoutCameraResult(asset: PHAsset) { cameraView.stopSession() - startConfirmController(asset: asset) + startCropController(asset: asset) toggleButtons(enabled: true) } - private func startConfirmController(uiImage: UIImage) { - let confirmViewController = ConfirmViewController(image: uiImage, allowsCropping: allowCropping) - confirmViewController.onComplete = { [weak self] image, asset in + private func startCropController(uiImage: UIImage) { + + let cropViewController = CropViewController(image: uiImage, allowsCropping: allowCropping) + cropViewController.onComplete = { [weak self] image, asset in defer { self?.dismiss(animated: true, completion: nil) } @@ -573,13 +575,19 @@ open class CameraViewController: UIViewController { self?.onCompletion?(image, asset) self?.onCompletion = nil } - confirmViewController.modalTransitionStyle = UIModalTransitionStyle.crossDissolve - present(confirmViewController, animated: true, completion: nil) + + let navigationController = UINavigationController(rootViewController: cropViewController) + + navigationController.navigationBar.barTintColor = UIColor.black + navigationController.navigationBar.barStyle = UIBarStyle.black + navigationController.modalTransitionStyle = UIModalTransitionStyle.crossDissolve + + present(navigationController, animated: true, completion: nil) } - private func startConfirmController(asset: PHAsset) { - let confirmViewController = ConfirmViewController(asset: asset, allowsCropping: allowCropping) - confirmViewController.onComplete = { [weak self] image, asset in + private func startCropController(asset: PHAsset) { + let cropViewController = CropViewController(asset: asset, allowsCropping: allowCropping) + cropViewController.onComplete = { [weak self] image, asset in defer { self?.dismiss(animated: true, completion: nil) } @@ -591,8 +599,14 @@ open class CameraViewController: UIViewController { self?.onCompletion?(image, asset) self?.onCompletion = nil } - confirmViewController.modalTransitionStyle = UIModalTransitionStyle.crossDissolve - present(confirmViewController, animated: true, completion: nil) + + let navigationController = UINavigationController(rootViewController: cropViewController) + + navigationController.navigationBar.barTintColor = UIColor.black + navigationController.navigationBar.barStyle = UIBarStyle.black + navigationController.modalTransitionStyle = UIModalTransitionStyle.crossDissolve + + present(navigationController, animated: true, completion: nil) } private func showSpinner() -> UIActivityIndicatorView { diff --git a/ALCameraViewController/ViewController/CameraViewController.xib b/ALCameraViewController/ViewController/CameraViewController.xib index f675b830..13bca256 100644 --- a/ALCameraViewController/ViewController/CameraViewController.xib +++ b/ALCameraViewController/ViewController/CameraViewController.xib @@ -32,7 +32,7 @@ @@ -42,7 +42,7 @@ - + @@ -51,25 +51,25 @@ - + @@ -93,11 +93,11 @@ - + - + - + diff --git a/ALCameraViewController/ViewController/ConfirmViewController.swift b/ALCameraViewController/ViewController/ConfirmViewController.swift index 475656a4..21a77f9a 100644 --- a/ALCameraViewController/ViewController/ConfirmViewController.swift +++ b/ALCameraViewController/ViewController/ConfirmViewController.swift @@ -1,369 +1,143 @@ // -// ALConfirmViewController.swift +// ConfirmViewController.swift // ALCameraViewController // -// Created by Alex Littlejohn on 2015/06/30. -// Copyright (c) 2015 zero. All rights reserved. +// Created by Zhu Wu on 8/25/17. +// Copyright © 2017 zero. All rights reserved. // -import UIKit +import Foundation import Photos -public class ConfirmViewController: UIViewController, UIScrollViewDelegate { - - let imageView = UIImageView() - @IBOutlet weak var scrollView: UIScrollView! - @IBOutlet weak var cropOverlay: CropOverlay! - @IBOutlet weak var cancelButton: UIButton! - @IBOutlet weak var confirmButton: UIButton! - @IBOutlet weak var centeringView: UIView! - - var allowsCropping: Bool = false - var verticalPadding: CGFloat = 30 - var horizontalPadding: CGFloat = 30 - - public var onComplete: CameraViewCompletion? - - let asset: PHAsset? - let image: UIImage? - - public init(image: UIImage, allowsCropping: Bool) { - self.allowsCropping = allowsCropping - self.asset = nil - self.image = image - super.init(nibName: "ConfirmViewController", bundle: CameraGlobals.shared.bundle) - } - - public init(asset: PHAsset, allowsCropping: Bool) { - self.allowsCropping = allowsCropping - self.asset = asset - self.image = nil - super.init(nibName: "ConfirmViewController", bundle: CameraGlobals.shared.bundle) - } - - public required init?(coder aDecoder: NSCoder) { - asset = nil - image = nil - super.init(coder: aDecoder) - } - - public override var prefersStatusBarHidden: Bool { - return true - } - - public override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { - return UIStatusBarAnimation.slide - } +public class ConfirmViewController: UIViewController { + let image: UIImage? + let asset: PHAsset? + + @IBOutlet weak var imageView: UIImageView! + + @IBOutlet weak var backButton: UIButton! + @IBOutlet weak var doneButton: UIButton! + + public var onComplete: CameraViewCompletion? + + + public override var prefersStatusBarHidden: Bool { + return true + } + + public override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { + return UIStatusBarAnimation.slide + } open override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .portrait } - - public override func viewDidLoad() { - super.viewDidLoad() - - view.backgroundColor = UIColor.black - - scrollView.addSubview(imageView) - scrollView.delegate = self - scrollView.maximumZoomScale = 1 - - cropOverlay.isHidden = true - - let spinner = showSpinner() - - disable() - - if let asset = asset { - _ = SingleImageFetcher() - .setAsset(asset) - .setTargetSize(largestPhotoSize()) - .onSuccess { [weak self] image in - self?.configureWithImage(image) - self?.hideSpinner(spinner) - self?.enable() - } - .onFailure { [weak self] error in - self?.hideSpinner(spinner) - } - .fetch() - } else if let image = image { - configureWithImage(image) - hideSpinner(spinner) - enable() - } - } - - public override func viewWillLayoutSubviews() { - super.viewWillLayoutSubviews() - let scale = calculateMinimumScale(view.frame.size) - let frame = allowsCropping ? cropOverlay.frame : view.bounds - - scrollView.contentInset = calculateScrollViewInsets(frame) - scrollView.minimumZoomScale = scale - scrollView.zoomScale = scale - centerScrollViewContents() - centerImageViewOnRotate() - } - - public override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { - super.viewWillTransition(to: size, with: coordinator) - - let scale = calculateMinimumScale(size) - var frame = view.bounds - - if allowsCropping { - frame = cropOverlay.frame - let centeringFrame = centeringView.frame - var origin: CGPoint - - if size.width > size.height { // landscape - let offset = (size.width - centeringFrame.height) - let expectedX = (centeringFrame.height/2 - frame.height/2) + offset - origin = CGPoint(x: expectedX, y: frame.origin.x) - } else { - let expectedY = (centeringFrame.width/2 - frame.width/2) - origin = CGPoint(x: frame.origin.y, y: expectedY) - } - - frame.origin = origin - } else { - frame.size = size - } - - let insets = calculateScrollViewInsets(frame) - - coordinator.animate(alongsideTransition: { [weak self] context in - self?.scrollView.contentInset = insets - self?.scrollView.minimumZoomScale = scale - self?.scrollView.zoomScale = scale - self?.centerScrollViewContents() - self?.centerImageViewOnRotate() - }, completion: nil) - } - - private func configureWithImage(_ image: UIImage) { - if allowsCropping { - cropOverlay.isHidden = false - } else { - cropOverlay.isHidden = true - } - - buttonActions() - - imageView.image = image - imageView.sizeToFit() - view.setNeedsLayout() - } - - private func calculateMinimumScale(_ size: CGSize) -> CGFloat { - var _size = size - - if allowsCropping { - _size = cropOverlay.frame.size - } - - guard let image = imageView.image else { - return 1 - } - - let scaleWidth = _size.width / image.size.width - let scaleHeight = _size.height / image.size.height - - var scale: CGFloat - - if allowsCropping { - scale = max(scaleWidth, scaleHeight) - } else { - scale = min(scaleWidth, scaleHeight) - } - - return scale - } - - private func calculateScrollViewInsets(_ frame: CGRect) -> UIEdgeInsets { - let bottom = view.frame.height - (frame.origin.y + frame.height) - let right = view.frame.width - (frame.origin.x + frame.width) - let insets = UIEdgeInsets(top: frame.origin.y, left: frame.origin.x, bottom: bottom, right: right) - return insets - } - - private func centerImageViewOnRotate() { - if allowsCropping { - let size = allowsCropping ? cropOverlay.frame.size : scrollView.frame.size - let scrollInsets = scrollView.contentInset - let imageSize = imageView.frame.size - var contentOffset = CGPoint(x: -scrollInsets.left, y: -scrollInsets.top) - contentOffset.x -= (size.width - imageSize.width) / 2 - contentOffset.y -= (size.height - imageSize.height) / 2 - scrollView.contentOffset = contentOffset - } - } - - private func centerScrollViewContents() { - let size = allowsCropping ? cropOverlay.frame.size : scrollView.frame.size - let imageSize = imageView.frame.size - var imageOrigin = CGPoint.zero - - if imageSize.width < size.width { - imageOrigin.x = (size.width - imageSize.width) / 2 - } - - if imageSize.height < size.height { - imageOrigin.y = (size.height - imageSize.height) / 2 - } - - imageView.frame.origin = imageOrigin - } - - private func buttonActions() { - confirmButton.action = { [weak self] in self?.confirmPhoto() } - cancelButton.action = { [weak self] in self?.cancel() } - } - - internal func cancel() { - onComplete?(nil, nil) - } - - internal func confirmPhoto() { - - guard let image = imageView.image else { - return - } - - disable() - - imageView.isHidden = true - - let spinner = showSpinner() - - if let asset = asset { - var fetcher = SingleImageFetcher() - .onSuccess { [weak self] image in - self?.onComplete?(image, self?.asset) - self?.hideSpinner(spinner) - self?.enable() - } - .onFailure { [weak self] error in - self?.hideSpinner(spinner) - self?.showNoImageScreen(error) - } - .setAsset(asset) - if allowsCropping { - let rect = normalizedRect(makeProportionalCropRect(), orientation: image.imageOrientation) - fetcher = fetcher.setCropRect(rect) - } - - fetcher = fetcher.fetch() - } else { - var newImage = image - - if allowsCropping { - let cropRect = makeProportionalCropRect() - let resizedCropRect = CGRect(x: (image.size.width) * cropRect.origin.x, - y: (image.size.height) * cropRect.origin.y, - width: (image.size.width * cropRect.width), - height: (image.size.height * cropRect.height)) - newImage = image.crop(rect: resizedCropRect) - } - - onComplete?(newImage, nil) - hideSpinner(spinner) - enable() - } - } - - public func viewForZooming(in scrollView: UIScrollView) -> UIView? { - return imageView - } - - public func scrollViewDidZoom(_ scrollView: UIScrollView) { - centerScrollViewContents() - } - - func showSpinner() -> UIActivityIndicatorView { - let spinner = UIActivityIndicatorView() - spinner.activityIndicatorViewStyle = .white - spinner.center = view.center - spinner.startAnimating() - - view.addSubview(spinner) - view.bringSubview(toFront: spinner) - - return spinner - } - - func hideSpinner(_ spinner: UIActivityIndicatorView) { - spinner.stopAnimating() - spinner.removeFromSuperview() - } - - func disable() { - confirmButton.isEnabled = false - } - - func enable() { - confirmButton.isEnabled = true - } - - func showNoImageScreen(_ error: NSError) { - let permissionsView = PermissionsView(frame: view.bounds) - - let desc = localizedString("error.cant-fetch-photo.description") - - permissionsView.configureInView(view, title: error.localizedDescription, description: desc, completion: { [weak self] in self?.cancel() }) - } - - private func makeProportionalCropRect() -> CGRect { - var cropRect = cropOverlay.frame - cropRect.origin.x += scrollView.contentOffset.x - cropRect.origin.y += scrollView.contentOffset.y - - let normalizedX = cropRect.origin.x / imageView.frame.width - let normalizedY = cropRect.origin.y / imageView.frame.height - - let normalizedWidth = cropRect.width / imageView.frame.width - let normalizedHeight = cropRect.height / imageView.frame.height - - return CGRect(x: normalizedX, y: normalizedY, width: normalizedWidth, height: normalizedHeight) - } - + + public init(_ image: UIImage?, _ asset: PHAsset?) { + self.image = image + self.asset = asset + super.init(nibName: "ConfirmViewController", bundle: CameraGlobals.shared.bundle) + } + + public required init?(coder aDecoder: NSCoder) { + image = nil + asset = nil + super.init(coder: aDecoder) + } + + public override func viewDidLoad() { + super.viewDidLoad() + + if let image = image { + configureWithImage(image) + } + } + + private func configureWithImage(_ image: UIImage) { + setupButtonActions() + + imageView.image = image + } + + func setupButtonActions() { + backButton.action = { [weak self] in self?.navigationController?.popViewController(animated: false) } + doneButton.action = { [weak self] in self?.confirmPhoto() } + } + + func confirmPhoto() { + + guard let image = imageView.image else { + return + } + + disable() + + imageView.isHidden = true + + let spinner = showSpinner() + +// if let asset = asset { +// var fetcher = SingleImageFetcher() +// .onSuccess { [weak self] image in +// self?.onComplete?(image, self?.asset) +// self?.hideSpinner(spinner) +// self?.enable() +// } +// .onFailure { [weak self] error in +// self?.hideSpinner(spinner) +// self?.showNoImageScreen(error) +// } +// .setAsset(asset) +// if allowsCropping { +// let rect = normalizedRect(makeProportionalCropRect(), orientation: image.imageOrientation) +// fetcher = fetcher.setCropRect(rect) +// } +// +// fetcher = fetcher.fetch() +// } else { + let newImage = image + + onComplete?(newImage, asset) + hideSpinner(spinner) + enable() +// } + } + + internal func cancel() { + onComplete?(nil, nil) + } + + func showSpinner() -> UIActivityIndicatorView { + let spinner = UIActivityIndicatorView() + spinner.activityIndicatorViewStyle = .white + spinner.center = view.center + spinner.startAnimating() + + view.addSubview(spinner) + view.bringSubview(toFront: spinner) + + return spinner + } + + func hideSpinner(_ spinner: UIActivityIndicatorView) { + spinner.stopAnimating() + spinner.removeFromSuperview() + } + + func disable() { + doneButton.isEnabled = false + } + + func enable() { + doneButton.isEnabled = true + } + + func showNoImageScreen(_ error: NSError) { + let permissionsView = PermissionsView(frame: view.bounds) + + let desc = localizedString("error.cant-fetch-photo.description") + + permissionsView.configureInView(view, title: error.localizedDescription, description: desc, completion: { [weak self] in self?.cancel() }) + } } -extension UIImage { - func crop(rect: CGRect) -> UIImage { - - var rectTransform: CGAffineTransform - switch imageOrientation { - case .left: - rectTransform = CGAffineTransform(rotationAngle: radians(90)).translatedBy(x: 0, y: -size.height) - case .right: - rectTransform = CGAffineTransform(rotationAngle: radians(-90)).translatedBy(x: -size.width, y: 0) - case .down: - rectTransform = CGAffineTransform(rotationAngle: radians(-180)).translatedBy(x: -size.width, y: -size.height) - default: - rectTransform = CGAffineTransform.identity - } - - rectTransform = rectTransform.scaledBy(x: scale, y: scale) - - if let cropped = cgImage?.cropping(to: rect.applying(rectTransform)) { - return UIImage(cgImage: cropped, scale: scale, orientation: imageOrientation).fixOrientation() - } - - return self - } - - func fixOrientation() -> UIImage { - if imageOrientation == .up { - return self - } - - UIGraphicsBeginImageContextWithOptions(size, false, scale) - draw(in: CGRect(origin: .zero, size: size)) - let normalizedImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() ?? self - UIGraphicsEndImageContext() - - return normalizedImage - } -} diff --git a/ALCameraViewController/ViewController/ConfirmViewController.xib b/ALCameraViewController/ViewController/ConfirmViewController.xib index 0fb99dd6..43d0082f 100644 --- a/ALCameraViewController/ViewController/ConfirmViewController.xib +++ b/ALCameraViewController/ViewController/ConfirmViewController.xib @@ -4,20 +4,16 @@ - - - + - - - - - - + + + + @@ -25,186 +21,73 @@ - - - - + + + - - + - - - - - - - + + + + + + + + + + + + + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + diff --git a/ALCameraViewController/ViewController/CropViewController.swift b/ALCameraViewController/ViewController/CropViewController.swift new file mode 100644 index 00000000..126dbc67 --- /dev/null +++ b/ALCameraViewController/ViewController/CropViewController.swift @@ -0,0 +1,417 @@ +// +// ALCropViewController.swift +// ALCameraViewController +// +// Created by Alex Littlejohn on 2015/06/30. +// Copyright (c) 2015 zero. All rights reserved. +// + +import UIKit +import Photos + +public class CropViewController: UIViewController, UIScrollViewDelegate { + + let imageView = UIImageView() + @IBOutlet weak var scrollView: UIScrollView! + @IBOutlet weak var cropOverlay: OverlayView! + @IBOutlet weak var cancelButton: UIButton! + @IBOutlet weak var confirmButton: UIButton! + @IBOutlet weak var borderDetectionButton: UIButton! + + var allowsCropping: Bool = false + + public var onComplete: CameraViewCompletion? + + let asset: PHAsset? + let image: UIImage? + + public init(image: UIImage, allowsCropping: Bool) { + self.allowsCropping = allowsCropping + self.asset = nil + self.image = image + super.init(nibName: "CropViewController", bundle: CameraGlobals.shared.bundle) + } + + public init(asset: PHAsset, allowsCropping: Bool) { + self.allowsCropping = allowsCropping + self.asset = asset + self.image = nil + super.init(nibName: "CropViewController", bundle: CameraGlobals.shared.bundle) + } + + public required init?(coder aDecoder: NSCoder) { + asset = nil + image = nil + super.init(coder: aDecoder) + } + + public override var prefersStatusBarHidden: Bool { + return true + } + + public override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { + return UIStatusBarAnimation.slide + } + + open override var supportedInterfaceOrientations: UIInterfaceOrientationMask { + return .portrait + } + + public override func viewDidLoad() { + super.viewDidLoad() + + view.backgroundColor = UIColor.black + + scrollView.addSubview(imageView) + scrollView.delegate = self + scrollView.maximumZoomScale = 1 + + cropOverlay.isHidden = true + + let spinner = showSpinner() + + disable() + + if let asset = asset { + _ = SingleImageFetcher() + .setAsset(asset) + .setTargetSize(largestPhotoSize()) + .onSuccess { [weak self] image in + self?.configureWithImage(image) + self?.hideSpinner(spinner) + self?.enable() + } + .onFailure { [weak self] error in + self?.hideSpinner(spinner) + } + .fetch() + } else if let image = image { + configureWithImage(image) + hideSpinner(spinner) + enable() + } + } + + public override func viewWillLayoutSubviews() { + super.viewWillLayoutSubviews() + let scale = calculateMinimumScale(scrollView.frame.size) + let frame = scrollView.bounds + + scrollView.contentInset = calculateScrollViewInsets(frame) + scrollView.minimumZoomScale = scale + scrollView.maximumZoomScale = scale + scrollView.zoomScale = scale + centerScrollViewContents() +// centerImageViewOnRotate() + centerOverlayView() + + } + + public override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + super.viewWillTransition(to: size, with: coordinator) + + let scale = calculateMinimumScale(size) + var frame = view.bounds + + if allowsCropping { + frame = scrollView.frame + let centeringFrame = scrollView.frame + var origin: CGPoint + + if size.width > size.height { // landscape + let offset = (size.width - centeringFrame.height) + let expectedX = (centeringFrame.height/2 - frame.height/2) + offset + origin = CGPoint(x: expectedX, y: frame.origin.x) + } else { + let expectedY = (centeringFrame.width/2 - frame.width/2) + origin = CGPoint(x: frame.origin.y, y: expectedY) + } + + frame.origin = origin + } else { + frame.size = size + } + + let insets = calculateScrollViewInsets(frame) + + coordinator.animate(alongsideTransition: { [weak self] context in + self?.scrollView.contentInset = insets + self?.scrollView.minimumZoomScale = scale + self?.scrollView.zoomScale = scale + self?.centerScrollViewContents() + self?.centerImageViewOnRotate() + self?.centerOverlayView() + }, completion: nil) + } + + private func configureWithImage(_ image: UIImage) { + if allowsCropping { + cropOverlay.isHidden = false + } else { + cropOverlay.isHidden = true + } + + buttonActions() + + imageView.image = image + imageView.sizeToFit() + view.setNeedsLayout() + } + + private func calculateMinimumScale(_ size: CGSize) -> CGFloat { + let _size = size +// +// if allowsCropping { +// _size = cropOverlay.frame.size +// } + + guard let image = imageView.image else { + return 1 + } + + let scaleWidth = _size.width / image.size.width + let scaleHeight = _size.height / image.size.height + + var scale: CGFloat + + if allowsCropping { + scale = min(scaleWidth, scaleHeight) + } else { + scale = min(scaleWidth, scaleHeight) + } + + return scale + } + + private func calculateScrollViewInsets(_ frame: CGRect) -> UIEdgeInsets { + let bottom = scrollView.frame.height - (frame.origin.y + frame.height) + let right = scrollView.frame.width - (frame.origin.x + frame.width) + let insets = UIEdgeInsets(top: frame.origin.y, left: frame.origin.x, bottom: bottom, right: right) + return insets + } + + private func centerImageViewOnRotate() { + if allowsCropping { +// let size = allowsCropping ? cropOverlay.frame.size : scrollView.frame.size + let size = scrollView.frame.size + + let scrollInsets = scrollView.contentInset + let imageSize = imageView.frame.size + var contentOffset = CGPoint(x: -scrollInsets.left, y: -scrollInsets.top) + contentOffset.x -= (size.width - imageSize.width) / 2 + contentOffset.y -= (size.height - imageSize.height) / 2 + scrollView.contentOffset = contentOffset + } + } + + private func centerScrollViewContents() { +// let size = allowsCropping ? cropOverlay.frame.size : scrollView.frame.size + let size = scrollView.frame.size + + let imageSize = imageView.frame.size + var imageOrigin = CGPoint.zero + + if imageSize.width < size.width { + imageOrigin.x = (size.width - imageSize.width) / 2 + } + + if imageSize.height < size.height { + imageOrigin.y = (size.height - imageSize.height) / 2 + } + + imageView.frame.origin = imageOrigin + } + + func centerOverlayView() { + let frame = scrollView.convert(imageView.frame, to: self.view) + cropOverlay.frame = frame + cropOverlay.setNeedsDisplay() + } + + private func buttonActions() { + confirmButton.action = { [weak self] in self?.confirmPhoto() } + cancelButton.action = { [weak self] in self?.cancel() } + borderDetectionButton.action = { [weak self] in self?.detectBorders() } + } + + func detectBorders() { + if cropOverlay.detectBorders(imageView) { + print("found borders") + } + else { + print("no borders") + } + borderDetectionButton.setTitle("Select All", for: .normal) + borderDetectionButton.action = { [weak self] in self?.selectAllBorders() } + } + + func selectAllBorders() { + cropOverlay.layoutButtons() + + borderDetectionButton.setTitle("Find Borders", for: .normal) + borderDetectionButton.action = { [weak self] in self?.detectBorders() } + } + + internal func cancel() { + onComplete?(nil, nil) + } + + internal func confirmPhoto() { + + guard let image = imageView.image else { + return + } + + disable() + + let spinner = showSpinner() + +// if let asset = asset { +// var fetcher = SingleImageFetcher() +// .onSuccess { [weak self] image in +// self?.onComplete?(image, self?.asset) +// self?.hideSpinner(spinner) +// self?.enable() +// } +// .onFailure { [weak self] error in +// self?.hideSpinner(spinner) +// self?.showNoImageScreen(error) +// } +// .setAsset(asset) +// if allowsCropping { +// let rect = normalizedRect(makeProportionalCropRect(), orientation: image.imageOrientation) +// fetcher = fetcher.setCropRect(rect) +// } +// +// fetcher = fetcher.fetch() +// } else { + var newImage = image + + if allowsCropping { + newImage = cropOverlay.cropImage(imageView) +// let cropRect = makeProportionalCropRect() +// let resizedCropRect = CGRect(x: (image.size.width) * cropRect.origin.x, +// y: (image.size.height) * cropRect.origin.y, +// width: (image.size.width * cropRect.width), +// height: (image.size.height * cropRect.height)) +// newImage = image.crop(rect: resizedCropRect) + self.startConfimController(uiImage: newImage) + } + else { + self.onComplete?(newImage,asset) + } + hideSpinner(spinner) + enable() +// } + } + + public func viewForZooming(in scrollView: UIScrollView) -> UIView? { + return imageView + } + + public func scrollViewDidZoom(_ scrollView: UIScrollView) { + centerScrollViewContents() + } + + func showSpinner() -> UIActivityIndicatorView { + let spinner = UIActivityIndicatorView() + spinner.activityIndicatorViewStyle = .whiteLarge + spinner.center = view.center + spinner.startAnimating() + spinner.sizeToFit() + + view.addSubview(spinner) + view.bringSubview(toFront: spinner) + + return spinner + } + + func hideSpinner(_ spinner: UIActivityIndicatorView) { + spinner.stopAnimating() + spinner.removeFromSuperview() + } + + func disable() { + confirmButton.isEnabled = false + } + + func enable() { + confirmButton.isEnabled = true + } + + func showNoImageScreen(_ error: NSError) { + let permissionsView = PermissionsView(frame: view.bounds) + + let desc = localizedString("error.cant-fetch-photo.description") + + permissionsView.configureInView(view, title: error.localizedDescription, description: desc, completion: { [weak self] in self?.cancel() }) + } + + private func makeProportionalCropRect() -> CGRect { + var cropRect = cropOverlay.frame + cropRect.origin.x += scrollView.contentOffset.x + cropRect.origin.y += scrollView.contentOffset.y + + let normalizedX = cropRect.origin.x / imageView.frame.width + let normalizedY = cropRect.origin.y / imageView.frame.height + + let normalizedWidth = cropRect.width / imageView.frame.width + let normalizedHeight = cropRect.height / imageView.frame.height + + return CGRect(x: normalizedX, y: normalizedY, width: normalizedWidth, height: normalizedHeight) + } + + private func startConfimController(uiImage: UIImage) { + + let confirmController = ConfirmViewController(uiImage, asset) + confirmController.onComplete = { [weak self] image, asset in + guard let image = image else { + return + } + + self?.onComplete?(image, asset) + self?.onComplete = nil + } + + self.navigationController?.pushViewController(confirmController, animated: false) + } + +} + +extension UIImage { + func crop(rect: CGRect) -> UIImage { + + var rectTransform: CGAffineTransform + switch imageOrientation { + case .left: + rectTransform = CGAffineTransform(rotationAngle: radians(90)).translatedBy(x: 0, y: -size.height) + case .right: + rectTransform = CGAffineTransform(rotationAngle: radians(-90)).translatedBy(x: -size.width, y: 0) + case .down: + rectTransform = CGAffineTransform(rotationAngle: radians(-180)).translatedBy(x: -size.width, y: -size.height) + default: + rectTransform = CGAffineTransform.identity + } + + rectTransform = rectTransform.scaledBy(x: scale, y: scale) + + if let cropped = cgImage?.cropping(to: rect.applying(rectTransform)) { + return UIImage(cgImage: cropped, scale: scale, orientation: imageOrientation).fixOrientation() + } + + return self + } + + func fixOrientation() -> UIImage { + if imageOrientation == .up { + return self + } + + UIGraphicsBeginImageContextWithOptions(size, false, scale) + draw(in: CGRect(origin: .zero, size: size)) + let normalizedImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() ?? self + UIGraphicsEndImageContext() + + return normalizedImage + } +} diff --git a/ALCameraViewController/ViewController/CropViewController.xib b/ALCameraViewController/ViewController/CropViewController.xib new file mode 100644 index 00000000..3becf7e1 --- /dev/null +++ b/ALCameraViewController/ViewController/CropViewController.xib @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ALCameraViewController/Views/CameraView.swift b/ALCameraViewController/Views/CameraView.swift index 1617553d..f5d265c8 100644 --- a/ALCameraViewController/Views/CameraView.swift +++ b/ALCameraViewController/Views/CameraView.swift @@ -200,6 +200,7 @@ public class CameraView: UIView { } do { + // TODO: Change this to torch mode try device.lockForConfiguration() if device.flashMode == .on { device.flashMode = .off diff --git a/ALCameraViewController/Views/OverlayView.swift b/ALCameraViewController/Views/OverlayView.swift new file mode 100644 index 00000000..a5c3e6e5 --- /dev/null +++ b/ALCameraViewController/Views/OverlayView.swift @@ -0,0 +1,207 @@ +// +// OverlayView.swift +// Instashot +// +// Created by Zhu Wu on 8/19/17. +// Copyright © 2017 Skrapit Ltd. All rights reserved. +// + +import Foundation +import UIKit +import UIKit.UIGestureRecognizerSubclass + +class OverlayView: UIView { + lazy var topLeftButton: UIView = { + let btn = UIView() + btn.backgroundColor = UIColor.blue + btn.bounds = CGRect(origin: CGPoint.zero, size: CGSize(width: 10, height: 10)) + return btn + }() + + + lazy var topRightButton: UIView = { + let btn = UIView() + btn.backgroundColor = UIColor.blue + btn.bounds = CGRect(origin: CGPoint.zero, size: CGSize(width: 10, height: 10)) + return btn + }() + + lazy var bottomLeftButton: UIView = { + let btn = UIView() + btn.backgroundColor = UIColor.blue + btn.bounds = CGRect(origin: CGPoint.zero, size: CGSize(width: 10, height: 10)) + return btn + }() + + lazy var bottomRightButton: UIView = { + let btn = UIView() + btn.backgroundColor = UIColor.blue + btn.bounds = CGRect(origin: CGPoint.zero, size: CGSize(width: 10, height: 10)) + btn.isUserInteractionEnabled = true + return btn + }() + + + override init(frame: CGRect) { + super.init(frame: frame) + setupButtons() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + setupButtons() + } + + override func layoutSubviews() { + super.layoutSubviews() + + } + + func setupButtons() { + _ = [topLeftButton,topRightButton,bottomLeftButton,bottomRightButton].map({ + $0.autoresizingMask = [.flexibleTopMargin, .flexibleBottomMargin,.flexibleLeftMargin,.flexibleRightMargin] + addSubview($0) + }) + + self.addGestureRecognizer(UIPanViewGestureRecognizer(target: self, action: #selector(parentPan))) + + self.layoutButtons() + } + + func detectBorders(_ underneathImage: UIImageView) -> Bool { + let imageView = underneathImage + let ciContext = CIContext() + let ciImage = CIImage(image: imageView.image!)! + + let detector = CIDetector(ofType: CIDetectorTypeRectangle, + context: ciContext, + options: [CIDetectorAccuracy: CIDetectorAccuracyHigh])! + + let features = detector.features(in: ciImage) + + // MARK: CIDetectorTypeRectangle only detects one rectangle + if let rect = features.first as? CIRectangleFeature { + self.layoutButtons(rect, imageView.image!.size) + return true + } + + return false + } + + func layoutButtons() { + let margin:CGFloat = 10.0 + topLeftButton.center = self.bounds.topLeft.translate(margin, dy: margin) + topRightButton.center = self.bounds.topRight.translate(-margin, dy: margin) + bottomLeftButton.center = self.bounds.bottomLeft.translate(margin, dy: -margin) + bottomRightButton.center = self.bounds.bottomRight.translate(-margin, dy: -margin) + setNeedsDisplay() + } + + func layoutButtons(_ rectFeature: CIRectangleFeature, _ imageSize: CGSize) { + let scaleTransform = CGAffineTransform(scaleX: self.bounds.size.width/imageSize.width, y: self.bounds.size.height/imageSize.height) + + topLeftButton.center = rectFeature.topLeft.ciPointIn(imageSize).applying(scaleTransform) + topRightButton.center = rectFeature.topRight.ciPointIn(imageSize).applying(scaleTransform) + bottomLeftButton.center = rectFeature.bottomLeft.ciPointIn(imageSize).applying(scaleTransform) + bottomRightButton.center = rectFeature.bottomRight.ciPointIn(imageSize).applying(scaleTransform) + setNeedsDisplay() + } + + func cropImage(_ imageView:UIImageView) -> UIImage { + let ciImage = CIImage(image: imageView.image!)! + + var t = CGAffineTransform(scaleX: 1, y: -1) + t = t.translatedBy(x: 0, y: -imageView.frame.size.height) + let scaleTransform = CGAffineTransform(scaleX: imageView.image!.size.width/imageView.frame.size.width, y: imageView.image!.size.height/imageView.frame.size.height) + + let topLeft = self.topLeftButton.frame.center.applying(t).applying(scaleTransform) + let topRight = self.topRightButton.frame.center.applying(t).applying(scaleTransform) + let bottomLeft = self.bottomLeftButton.frame.center.applying(t).applying(scaleTransform) + let bottomRight = self.bottomRightButton.frame.center.applying(t).applying(scaleTransform) + + + let points = [NSValue(cgPoint: topLeft), + NSValue(cgPoint: topRight), + NSValue(cgPoint: bottomLeft), + NSValue(cgPoint: bottomRight)] + + let image = ciImage.correctPerspective(withCGPoints: points)!.makeUIImage(with: CIContext()) + + return image! + } + + override func draw(_ rect: CGRect) { + super.draw(rect) + + // connect buttons via straight lines + + let lineWidth:CGFloat = 3.0 + + let path = UIBezierPath() + path.lineWidth = lineWidth + + path.move(to: topLeftButton.center) + path.addLine(to: topRightButton.center) + path.addLine(to: bottomRightButton.center) + path.addLine(to: bottomLeftButton.center) + + + //set the stroke color + #colorLiteral(red: 0, green: 0.9810667634, blue: 0.5736914277, alpha: 0.3).setFill() + + //draw the stroke + path.fill() + + } + + func parentPan(_ sender: UIPanViewGestureRecognizer) { + switch sender.state { + case .began: + sender.attachedView = self.anchor(_contains: sender.location(in: self)) + break + case .changed: + guard let view = sender.attachedView else { return } + var location = sender.location(in: self) + location.x = max(self.bounds.minX, location.x) + location.x = min(self.bounds.maxX, location.x) + location.y = max(self.bounds.minY, location.y) + location.y = min(self.bounds.maxY, location.y) + view.center = location + self.setNeedsDisplay() + break + default: + sender.attachedView = nil + break + + } + } + + func anchor(_contains point:CGPoint) -> UIView? { + return [topLeftButton,topRightButton,bottomLeftButton,bottomRightButton].first(where: { (view) -> Bool in + let frame = view.frame.insetBy(dx: -30, dy: -30) + return frame.contains(point) + }) + } + +} + +class UIPanViewGestureRecognizer: UIPanGestureRecognizer { + var attachedView:UIView? +} + + + + + + + + + + + + + + + + + From f775e76e7e5ddede5f3465777ef9b6fd83a48f92 Mon Sep 17 00:00:00 2001 From: Wallace Wu Date: Mon, 28 Aug 2017 10:47:33 -0400 Subject: [PATCH 05/24] Update build settings for framework target --- .../project.pbxproj | 18 ++++++++++-------- .../CameraViewController-Bridging-Header.h | 0 CameraViewController/CameraViewController.h | 2 ++ 3 files changed, 12 insertions(+), 8 deletions(-) rename ALCameraViewController/Utilities/ALCameraViewController-Bridging-Header.h => CameraViewController/CameraViewController-Bridging-Header.h (100%) diff --git a/ALCameraViewController.xcodeproj/project.pbxproj b/ALCameraViewController.xcodeproj/project.pbxproj index 482b970e..ae617768 100644 --- a/ALCameraViewController.xcodeproj/project.pbxproj +++ b/ALCameraViewController.xcodeproj/project.pbxproj @@ -13,7 +13,6 @@ C44543211CA68DDE00644380 /* VolumeControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = C44543201CA68DDE00644380 /* VolumeControl.swift */; }; C4768C001CAF2EA100A084F8 /* CropViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C4768BFF1CAF2EA100A084F8 /* CropViewController.xib */; }; C4768C011CAF2EAA00A084F8 /* CropViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C4768BFF1CAF2EA100A084F8 /* CropViewController.xib */; }; - C4829FFE1CAEB16C00541D08 /* CameraViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = C4829FFD1CAEB16C00541D08 /* CameraViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; C482A0031CAEB18D00541D08 /* ImageFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAB50BF01B413E8C009905B9 /* ImageFetcher.swift */; }; C482A0041CAEB18D00541D08 /* SingleImageSaver.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40665431C73A47C00EB9751 /* SingleImageSaver.swift */; }; C482A0051CAEB18D00541D08 /* SingleImageFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40665471C73B72D00EB9751 /* SingleImageFetcher.swift */; }; @@ -38,6 +37,8 @@ E33BE71D1F5134C1005842DC /* CIImage+Utilities.m in Sources */ = {isa = PBXBuildFile; fileRef = E33BE71B1F5134C1005842DC /* CIImage+Utilities.m */; }; E33BE71E1F5134C1005842DC /* CIImage+Utilities.m in Sources */ = {isa = PBXBuildFile; fileRef = E33BE71B1F5134C1005842DC /* CIImage+Utilities.m */; }; E33BE71F1F5134C1005842DC /* CIImage+Utilities.h in Headers */ = {isa = PBXBuildFile; fileRef = E33BE71C1F5134C1005842DC /* CIImage+Utilities.h */; }; + E33BE7211F5460AB005842DC /* CGAffineTransformHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E35A23FA1F4F5329001047FD /* CGAffineTransformHelper.m */; }; + E33BE7221F5460AD005842DC /* CGAffineTransformHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = E35A23F91F4F5329001047FD /* CGAffineTransformHelper.h */; }; E35A23FB1F4F5329001047FD /* CGAffineTransformHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E35A23FA1F4F5329001047FD /* CGAffineTransformHelper.m */; }; E35A24031F4FE3AD001047FD /* CameraViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35A24011F4FE3A8001047FD /* CameraViewController.xib */; }; E35A24041F4FEB0B001047FD /* CameraViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35A24011F4FE3A8001047FD /* CameraViewController.xib */; }; @@ -84,7 +85,7 @@ C4D9BA461CA73163004F70F7 /* UIButtonExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIButtonExtensions.swift; sourceTree = ""; }; E33BE71B1F5134C1005842DC /* CIImage+Utilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CIImage+Utilities.m"; sourceTree = ""; }; E33BE71C1F5134C1005842DC /* CIImage+Utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CIImage+Utilities.h"; sourceTree = ""; }; - E35A23F81F4F5328001047FD /* ALCameraViewController-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ALCameraViewController-Bridging-Header.h"; sourceTree = ""; }; + E33BE7231F54626D005842DC /* CameraViewController-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CameraViewController-Bridging-Header.h"; sourceTree = ""; }; E35A23F91F4F5329001047FD /* CGAffineTransformHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CGAffineTransformHelper.h; sourceTree = ""; }; E35A23FA1F4F5329001047FD /* CGAffineTransformHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CGAffineTransformHelper.m; sourceTree = ""; }; E35A24011F4FE3A8001047FD /* CameraViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CameraViewController.xib; sourceTree = ""; }; @@ -136,6 +137,7 @@ C4829FFC1CAEB16C00541D08 /* CameraViewController */ = { isa = PBXGroup; children = ( + E33BE7231F54626D005842DC /* CameraViewController-Bridging-Header.h */, C4829FFD1CAEB16C00541D08 /* CameraViewController.h */, C4829FFF1CAEB16C00541D08 /* Info.plist */, ); @@ -186,7 +188,6 @@ E35A24081F509FBD001047FD /* CGRectExtensions.swift */, E35A23F91F4F5329001047FD /* CGAffineTransformHelper.h */, E35A23FA1F4F5329001047FD /* CGAffineTransformHelper.m */, - E35A23F81F4F5328001047FD /* ALCameraViewController-Bridging-Header.h */, E35A240B1F509FFC001047FD /* CGPointExtensions.swift */, ); path = Utilities; @@ -251,7 +252,7 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - C4829FFE1CAEB16C00541D08 /* CameraViewController.h in Headers */, + E33BE7221F5460AD005842DC /* CGAffineTransformHelper.h in Headers */, E33BE71F1F5134C1005842DC /* CIImage+Utilities.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -389,6 +390,7 @@ C482A00C1CAEB18D00541D08 /* PhotoLibraryViewController.swift in Sources */, C482A00D1CAEB18D00541D08 /* CameraViewController.swift in Sources */, C482A00E1CAEB18D00541D08 /* CropViewController.swift in Sources */, + E33BE7211F5460AB005842DC /* CGAffineTransformHelper.m in Sources */, C482A00F1CAEB18D00541D08 /* ImageCell.swift in Sources */, C482A0101CAEB18D00541D08 /* PermissionsView.swift in Sources */, C482A0111CAEB18D00541D08 /* CameraView.swift in Sources */, @@ -445,7 +447,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = CameraViewController/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.zero.CameraViewController; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -470,7 +472,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = CameraViewController/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.zero.CameraViewController; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -524,6 +526,7 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + SWIFT_OBJC_BRIDGING_HEADER = "CameraViewController/CameraViewController-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -564,6 +567,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.3; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_OBJC_BRIDGING_HEADER = "CameraViewController/CameraViewController-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; @@ -583,7 +587,6 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.zero.CameraViewController; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "ALCameraViewController/Utilities/ALCameraViewController-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 3.0; }; @@ -602,7 +605,6 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.zero.CameraViewController; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "ALCameraViewController/Utilities/ALCameraViewController-Bridging-Header.h"; SWIFT_VERSION = 3.0; }; name = Release; diff --git a/ALCameraViewController/Utilities/ALCameraViewController-Bridging-Header.h b/CameraViewController/CameraViewController-Bridging-Header.h similarity index 100% rename from ALCameraViewController/Utilities/ALCameraViewController-Bridging-Header.h rename to CameraViewController/CameraViewController-Bridging-Header.h diff --git a/CameraViewController/CameraViewController.h b/CameraViewController/CameraViewController.h index c6e40c05..dd67f617 100644 --- a/CameraViewController/CameraViewController.h +++ b/CameraViewController/CameraViewController.h @@ -7,6 +7,8 @@ // #import +#import "CGAffineTransformHelper.h" +#import "CIImage+Utilities.h" //! Project version number for CameraViewController. FOUNDATION_EXPORT double CameraViewControllerVersionNumber; From 8d83e46d7c6ba1df8b688280bb567cc9eb927fb6 Mon Sep 17 00:00:00 2001 From: Wallace Wu Date: Mon, 28 Aug 2017 10:50:52 -0400 Subject: [PATCH 06/24] Make few public headers --- ALCameraViewController.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ALCameraViewController.xcodeproj/project.pbxproj b/ALCameraViewController.xcodeproj/project.pbxproj index ae617768..5a5e9ddb 100644 --- a/ALCameraViewController.xcodeproj/project.pbxproj +++ b/ALCameraViewController.xcodeproj/project.pbxproj @@ -36,9 +36,9 @@ C4D9BA471CA73163004F70F7 /* UIButtonExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D9BA461CA73163004F70F7 /* UIButtonExtensions.swift */; }; E33BE71D1F5134C1005842DC /* CIImage+Utilities.m in Sources */ = {isa = PBXBuildFile; fileRef = E33BE71B1F5134C1005842DC /* CIImage+Utilities.m */; }; E33BE71E1F5134C1005842DC /* CIImage+Utilities.m in Sources */ = {isa = PBXBuildFile; fileRef = E33BE71B1F5134C1005842DC /* CIImage+Utilities.m */; }; - E33BE71F1F5134C1005842DC /* CIImage+Utilities.h in Headers */ = {isa = PBXBuildFile; fileRef = E33BE71C1F5134C1005842DC /* CIImage+Utilities.h */; }; + E33BE71F1F5134C1005842DC /* CIImage+Utilities.h in Headers */ = {isa = PBXBuildFile; fileRef = E33BE71C1F5134C1005842DC /* CIImage+Utilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; E33BE7211F5460AB005842DC /* CGAffineTransformHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E35A23FA1F4F5329001047FD /* CGAffineTransformHelper.m */; }; - E33BE7221F5460AD005842DC /* CGAffineTransformHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = E35A23F91F4F5329001047FD /* CGAffineTransformHelper.h */; }; + E33BE7221F5460AD005842DC /* CGAffineTransformHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = E35A23F91F4F5329001047FD /* CGAffineTransformHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; E35A23FB1F4F5329001047FD /* CGAffineTransformHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E35A23FA1F4F5329001047FD /* CGAffineTransformHelper.m */; }; E35A24031F4FE3AD001047FD /* CameraViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35A24011F4FE3A8001047FD /* CameraViewController.xib */; }; E35A24041F4FEB0B001047FD /* CameraViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35A24011F4FE3A8001047FD /* CameraViewController.xib */; }; From b7e907d947f5fe3c920fe9e51aff61f243b3dd87 Mon Sep 17 00:00:00 2001 From: Wallace Wu Date: Mon, 28 Aug 2017 11:25:27 -0400 Subject: [PATCH 07/24] Added project settings --- .../project.pbxproj | 22 +++-- .../Utilities/CGAffineTransformHelper.h | 12 --- .../Utilities/CGAffineTransformHelper.m | 97 ------------------- .../Utilities/CIImage+Utilities.h | 17 +--- .../Utilities/CIImage+Utilities.m | 4 +- .../Utilities/IRLRectangleFeatureExtensions.h | 32 ++++++ .../Utilities/IRLRectangleFeatureExtensions.m | 13 +++ .../CameraViewController-Bridging-Header.h | 2 +- CameraViewController/CameraViewController.h | 6 +- 9 files changed, 64 insertions(+), 141 deletions(-) delete mode 100644 ALCameraViewController/Utilities/CGAffineTransformHelper.h delete mode 100644 ALCameraViewController/Utilities/CGAffineTransformHelper.m create mode 100644 ALCameraViewController/Utilities/IRLRectangleFeatureExtensions.h create mode 100644 ALCameraViewController/Utilities/IRLRectangleFeatureExtensions.m diff --git a/ALCameraViewController.xcodeproj/project.pbxproj b/ALCameraViewController.xcodeproj/project.pbxproj index 5a5e9ddb..7e25152e 100644 --- a/ALCameraViewController.xcodeproj/project.pbxproj +++ b/ALCameraViewController.xcodeproj/project.pbxproj @@ -37,9 +37,10 @@ E33BE71D1F5134C1005842DC /* CIImage+Utilities.m in Sources */ = {isa = PBXBuildFile; fileRef = E33BE71B1F5134C1005842DC /* CIImage+Utilities.m */; }; E33BE71E1F5134C1005842DC /* CIImage+Utilities.m in Sources */ = {isa = PBXBuildFile; fileRef = E33BE71B1F5134C1005842DC /* CIImage+Utilities.m */; }; E33BE71F1F5134C1005842DC /* CIImage+Utilities.h in Headers */ = {isa = PBXBuildFile; fileRef = E33BE71C1F5134C1005842DC /* CIImage+Utilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E33BE7211F5460AB005842DC /* CGAffineTransformHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E35A23FA1F4F5329001047FD /* CGAffineTransformHelper.m */; }; - E33BE7221F5460AD005842DC /* CGAffineTransformHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = E35A23F91F4F5329001047FD /* CGAffineTransformHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E35A23FB1F4F5329001047FD /* CGAffineTransformHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = E35A23FA1F4F5329001047FD /* CGAffineTransformHelper.m */; }; + E33BE7271F546920005842DC /* IRLRectangleFeatureExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = E33BE7251F546920005842DC /* IRLRectangleFeatureExtensions.h */; }; + E33BE7281F546920005842DC /* IRLRectangleFeatureExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = E33BE7261F546920005842DC /* IRLRectangleFeatureExtensions.m */; }; + E33BE7291F546920005842DC /* IRLRectangleFeatureExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = E33BE7261F546920005842DC /* IRLRectangleFeatureExtensions.m */; }; + E33BE72A1F546C0B005842DC /* CameraViewController-Bridging-Header.h in Headers */ = {isa = PBXBuildFile; fileRef = E33BE7231F54626D005842DC /* CameraViewController-Bridging-Header.h */; }; E35A24031F4FE3AD001047FD /* CameraViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35A24011F4FE3A8001047FD /* CameraViewController.xib */; }; E35A24041F4FEB0B001047FD /* CameraViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35A24011F4FE3A8001047FD /* CameraViewController.xib */; }; E35A24061F509CDC001047FD /* OverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35A24051F509CDC001047FD /* OverlayView.swift */; }; @@ -86,8 +87,8 @@ E33BE71B1F5134C1005842DC /* CIImage+Utilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CIImage+Utilities.m"; sourceTree = ""; }; E33BE71C1F5134C1005842DC /* CIImage+Utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CIImage+Utilities.h"; sourceTree = ""; }; E33BE7231F54626D005842DC /* CameraViewController-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CameraViewController-Bridging-Header.h"; sourceTree = ""; }; - E35A23F91F4F5329001047FD /* CGAffineTransformHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CGAffineTransformHelper.h; sourceTree = ""; }; - E35A23FA1F4F5329001047FD /* CGAffineTransformHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CGAffineTransformHelper.m; sourceTree = ""; }; + E33BE7251F546920005842DC /* IRLRectangleFeatureExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IRLRectangleFeatureExtensions.h; sourceTree = ""; }; + E33BE7261F546920005842DC /* IRLRectangleFeatureExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IRLRectangleFeatureExtensions.m; sourceTree = ""; }; E35A24011F4FE3A8001047FD /* CameraViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CameraViewController.xib; sourceTree = ""; }; E35A24051F509CDC001047FD /* OverlayView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OverlayView.swift; sourceTree = ""; }; E35A24081F509FBD001047FD /* CGRectExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CGRectExtensions.swift; sourceTree = ""; }; @@ -186,9 +187,9 @@ C4D9BA461CA73163004F70F7 /* UIButtonExtensions.swift */, EBFE097C1CAF1D1A00A8C637 /* UIViewExtensions.swift */, E35A24081F509FBD001047FD /* CGRectExtensions.swift */, - E35A23F91F4F5329001047FD /* CGAffineTransformHelper.h */, - E35A23FA1F4F5329001047FD /* CGAffineTransformHelper.m */, E35A240B1F509FFC001047FD /* CGPointExtensions.swift */, + E33BE7251F546920005842DC /* IRLRectangleFeatureExtensions.h */, + E33BE7261F546920005842DC /* IRLRectangleFeatureExtensions.m */, ); path = Utilities; sourceTree = ""; @@ -252,7 +253,8 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - E33BE7221F5460AD005842DC /* CGAffineTransformHelper.h in Headers */, + E33BE72A1F546C0B005842DC /* CameraViewController-Bridging-Header.h in Headers */, + E33BE7271F546920005842DC /* IRLRectangleFeatureExtensions.h in Headers */, E33BE71F1F5134C1005842DC /* CIImage+Utilities.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -381,6 +383,7 @@ E33BE71E1F5134C1005842DC /* CIImage+Utilities.m in Sources */, C482A0071CAEB18D00541D08 /* CameraShot.swift in Sources */, E35A240A1F509FBD001047FD /* CGRectExtensions.swift in Sources */, + E33BE7291F546920005842DC /* IRLRectangleFeatureExtensions.m in Sources */, C482A0081CAEB18D00541D08 /* CameraGlobals.swift in Sources */, C482A0091CAEB18D00541D08 /* VolumeControl.swift in Sources */, C482A00A1CAEB18D00541D08 /* PhotoLibraryAuthorizer.swift in Sources */, @@ -390,7 +393,6 @@ C482A00C1CAEB18D00541D08 /* PhotoLibraryViewController.swift in Sources */, C482A00D1CAEB18D00541D08 /* CameraViewController.swift in Sources */, C482A00E1CAEB18D00541D08 /* CropViewController.swift in Sources */, - E33BE7211F5460AB005842DC /* CGAffineTransformHelper.m in Sources */, C482A00F1CAEB18D00541D08 /* ImageCell.swift in Sources */, C482A0101CAEB18D00541D08 /* PermissionsView.swift in Sources */, C482A0111CAEB18D00541D08 /* CameraView.swift in Sources */, @@ -403,7 +405,6 @@ buildActionMask = 2147483647; files = ( C44543211CA68DDE00644380 /* VolumeControl.swift in Sources */, - E35A23FB1F4F5329001047FD /* CGAffineTransformHelper.m in Sources */, FA7E6B9B1B429012000E1B14 /* CropViewController.swift in Sources */, E35A240F1F50B49A001047FD /* ConfirmViewController.swift in Sources */, FA5FA3431B3AFA2B00497C62 /* PermissionsView.swift in Sources */, @@ -411,6 +412,7 @@ E35A24091F509FBD001047FD /* CGRectExtensions.swift in Sources */, FA82313A1B3C296C00A837BE /* Utilities.swift in Sources */, FAB50C001B413E8C009905B9 /* PhotoLibraryViewController.swift in Sources */, + E33BE7281F546920005842DC /* IRLRectangleFeatureExtensions.m in Sources */, FAF0586A1B317894008E5592 /* CameraShot.swift in Sources */, E35A240C1F509FFC001047FD /* CGPointExtensions.swift in Sources */, FAF058661B316695008E5592 /* CameraViewController.swift in Sources */, diff --git a/ALCameraViewController/Utilities/CGAffineTransformHelper.h b/ALCameraViewController/Utilities/CGAffineTransformHelper.h deleted file mode 100644 index 1e7af7fd..00000000 --- a/ALCameraViewController/Utilities/CGAffineTransformHelper.h +++ /dev/null @@ -1,12 +0,0 @@ -// -// CGAffineTransform+CGAffineTransformHelper.h -// ALCameraViewController -// -// Created by Zhu Wu on 8/24/17. -// Copyright © 2017 zero. All rights reserved. -// - -@import Foundation; -@import UIKit; - -NSString *affineTransformDescription(CGAffineTransform transform); diff --git a/ALCameraViewController/Utilities/CGAffineTransformHelper.m b/ALCameraViewController/Utilities/CGAffineTransformHelper.m deleted file mode 100644 index a833d31e..00000000 --- a/ALCameraViewController/Utilities/CGAffineTransformHelper.m +++ /dev/null @@ -1,97 +0,0 @@ -// -// CGAffineTransform+CGAffineTransformHelper.m -// ALCameraViewController -// -// Created by Zhu Wu on 8/24/17. -// Copyright © 2017 zero. All rights reserved. -// - -#import "CGAffineTransformHelper.h" - - -NSString *affineTransformDescription(CGAffineTransform transform) -{ - // check if it's simply the identity matrix - if (CGAffineTransformIsIdentity(transform)) { - return @"Is the identity transform"; - } - // the above does't catch things like a 720° rotation so also check it manually - if (fabs(transform.a - 1.0) < FLT_EPSILON && - fabs(transform.b - 0.0) < FLT_EPSILON && - fabs(transform.c - 0.0) < FLT_EPSILON && - fabs(transform.d - 1.0) < FLT_EPSILON && - fabs(transform.tx - 0.0) < FLT_EPSILON && - fabs(transform.ty - 0.0) < FLT_EPSILON) { - return @"Is the identity transform"; - } - - // The affine transforms is built up like this: - - // a b tx - // c d ty - // 0 0 1 - - // An array to hold all the different descirptions, charasteristics of the transform. - NSMutableArray *descriptions = [NSMutableArray array]; - - // Checking for a translation - if (fabs(transform.tx) > FLT_EPSILON) { // translation along X - [descriptions addObject:[NSString stringWithFormat:@"Will move %.2f along the X axis", - transform.tx]]; - } - if (fabs(transform.ty) > FLT_EPSILON) { // translation along Y - [descriptions addObject:[NSString stringWithFormat:@"Will move %.2f along the Y axis", - transform.ty]]; - } - - - // Checking for a rotation - CGFloat angle = atan2(transform.b, transform.a); // get the angle of the rotation. Note this assumes no shearing! - if (fabs(angle) < FLT_EPSILON || fabs(angle - M_PI) < FLT_EPSILON) { - // there is a change that there is a 180° rotation, in that case, A and D will and be negative. - BOOL bothAreNegative = transform.a < 0.0 && transform.d < 0.0; - - if (bothAreNegative) { - angle = M_PI; - } else { - angle = 0.0; // this is not considered a rotation, but a negative scale along one axis. - } - } - - // add the rotation description if there was an angle - if (fabs(angle) > FLT_EPSILON) { - [descriptions addObject:[NSString stringWithFormat:@"Will rotate %.1f° degrees", - angle*180.0/M_PI]]; - } - - - // Checking for a scale (and account for the possible rotation as well) - CGFloat scaleX = transform.a/cos(angle); - CGFloat scaleY = transform.d/cos(angle); - - - if (fabs(scaleX - scaleY) < FLT_EPSILON && fabs(scaleX - 1.0) > FLT_EPSILON) { - // if both are the same then we can format things a little bit nicer - [descriptions addObject:[NSString stringWithFormat:@"Will scale by %.2f along both X and Y", - scaleX]]; - } else { - // otherwise we look at X and Y scale separately - if (fabs(scaleX - 1.0) > FLT_EPSILON) { // scale along X - [descriptions addObject:[NSString stringWithFormat:@"Will scale by %.2f along the X axis", - scaleX]]; - } - - if (fabs(scaleY - 1.0) > FLT_EPSILON) { // scale along Y - [descriptions addObject:[NSString stringWithFormat:@"Will scale by %.2f along the Y axis", - scaleY]]; - } - } - - // Return something else when there is nothing to say about the transform matrix - if (descriptions.count == 0) { - return @"Can't easilly be described."; - } - - // join all the descriptions on their own line - return [descriptions componentsJoinedByString:@",\n"]; -} diff --git a/ALCameraViewController/Utilities/CIImage+Utilities.h b/ALCameraViewController/Utilities/CIImage+Utilities.h index 288ebf2a..f6743b26 100644 --- a/ALCameraViewController/Utilities/CIImage+Utilities.h +++ b/ALCameraViewController/Utilities/CIImage+Utilities.h @@ -11,16 +11,7 @@ @import CoreImage; @class IRLRectangleFeature; - -@protocol IRLRectangleFeatureProtocol -@property (readonly) CGPoint topLeft; -@property (readonly) CGPoint topRight; -@property (readonly) CGPoint bottomLeft; -@property (readonly) CGPoint bottomRight; -@end - -@interface CIRectangleFeature() -@end +@protocol IRLRectangleFeatureProtocol; @interface CIImage (Utilities) @@ -42,9 +33,3 @@ @end -@interface IRLRectangleFeature : CIFeature -@property (readwrite) CGPoint topLeft; -@property (readwrite) CGPoint topRight; -@property (readwrite) CGPoint bottomLeft; -@property (readwrite) CGPoint bottomRight; -@end diff --git a/ALCameraViewController/Utilities/CIImage+Utilities.m b/ALCameraViewController/Utilities/CIImage+Utilities.m index d7ba0cb7..5acea77b 100644 --- a/ALCameraViewController/Utilities/CIImage+Utilities.m +++ b/ALCameraViewController/Utilities/CIImage+Utilities.m @@ -8,6 +8,7 @@ // #import "CIImage+Utilities.h" +#import "IRLRectangleFeatureExtensions.h" @implementation CIImage (Utilities) @@ -266,6 +267,3 @@ - (CIImage *)drawFocusOverlayWithColor:(UIColor*)color @end -@implementation IRLRectangleFeature - -@end diff --git a/ALCameraViewController/Utilities/IRLRectangleFeatureExtensions.h b/ALCameraViewController/Utilities/IRLRectangleFeatureExtensions.h new file mode 100644 index 00000000..ba1e8538 --- /dev/null +++ b/ALCameraViewController/Utilities/IRLRectangleFeatureExtensions.h @@ -0,0 +1,32 @@ +// +// IRLRectangleFeatureExtensions.h +// ALCameraViewController +// +// Created by Zhu Wu on 8/28/17. +// Copyright © 2017 zero. All rights reserved. +// + +@import UIKit; +@import CoreImage; + +@protocol IRLRectangleFeatureProtocol +@property (readonly) CGPoint topLeft; +@property (readonly) CGPoint topRight; +@property (readonly) CGPoint bottomLeft; +@property (readonly) CGPoint bottomRight; +@end + +@interface CIRectangleFeature() +@end + + +@interface IRLRectangleFeature : CIFeature +@property (readwrite) CGPoint topLeft; +@property (readwrite) CGPoint topRight; +@property (readwrite) CGPoint bottomLeft; +@property (readwrite) CGPoint bottomRight; +@end + +@interface IRLRectangleFeature (IRLRectangleFeatureExtensions) + +@end diff --git a/ALCameraViewController/Utilities/IRLRectangleFeatureExtensions.m b/ALCameraViewController/Utilities/IRLRectangleFeatureExtensions.m new file mode 100644 index 00000000..d76c6001 --- /dev/null +++ b/ALCameraViewController/Utilities/IRLRectangleFeatureExtensions.m @@ -0,0 +1,13 @@ +// +// IRLRectangleFeatureExtensions.m +// ALCameraViewController +// +// Created by Zhu Wu on 8/28/17. +// Copyright © 2017 zero. All rights reserved. +// + +#import "IRLRectangleFeatureExtensions.h" + +@implementation IRLRectangleFeature + +@end diff --git a/CameraViewController/CameraViewController-Bridging-Header.h b/CameraViewController/CameraViewController-Bridging-Header.h index 1c6b63a3..0e7fe38d 100644 --- a/CameraViewController/CameraViewController-Bridging-Header.h +++ b/CameraViewController/CameraViewController-Bridging-Header.h @@ -3,5 +3,5 @@ // -#import "CGAffineTransformHelper.h" #import "CIImage+Utilities.h" +#import "IRLRectangleFeatureExtensions.h" diff --git a/CameraViewController/CameraViewController.h b/CameraViewController/CameraViewController.h index dd67f617..b9ff2082 100644 --- a/CameraViewController/CameraViewController.h +++ b/CameraViewController/CameraViewController.h @@ -7,8 +7,10 @@ // #import -#import "CGAffineTransformHelper.h" -#import "CIImage+Utilities.h" +#import +#import +#import + //! Project version number for CameraViewController. FOUNDATION_EXPORT double CameraViewControllerVersionNumber; From 8a8e63c50be3d48fcf172bed7933afa9a9aa3981 Mon Sep 17 00:00:00 2001 From: Wallace Wu Date: Mon, 28 Aug 2017 11:35:17 -0400 Subject: [PATCH 08/24] Removed useless files --- CameraViewController/CameraViewController.h | 1 - 1 file changed, 1 deletion(-) diff --git a/CameraViewController/CameraViewController.h b/CameraViewController/CameraViewController.h index b9ff2082..cb22c398 100644 --- a/CameraViewController/CameraViewController.h +++ b/CameraViewController/CameraViewController.h @@ -7,7 +7,6 @@ // #import -#import #import #import From f13949b96e03c8678cbc0ddd7e91b3601fef4a08 Mon Sep 17 00:00:00 2001 From: Wallace Wu Date: Mon, 28 Aug 2017 14:16:48 -0400 Subject: [PATCH 09/24] update project settings --- .../project.pbxproj | 32 +++++++++---------- .../Utilities/CIImage+Utilities.m | 2 +- ...ons.h => IRLRectangleFeature+Extensions.h} | 0 ...ons.m => IRLRectangleFeature+Extensions.m} | 2 +- .../CameraViewController-Bridging-Header.h | 2 +- CameraViewController/CameraViewController.h | 4 +-- 6 files changed, 21 insertions(+), 21 deletions(-) rename ALCameraViewController/Utilities/{IRLRectangleFeatureExtensions.h => IRLRectangleFeature+Extensions.h} (100%) rename ALCameraViewController/Utilities/{IRLRectangleFeatureExtensions.m => IRLRectangleFeature+Extensions.m} (82%) diff --git a/ALCameraViewController.xcodeproj/project.pbxproj b/ALCameraViewController.xcodeproj/project.pbxproj index 7e25152e..4980d631 100644 --- a/ALCameraViewController.xcodeproj/project.pbxproj +++ b/ALCameraViewController.xcodeproj/project.pbxproj @@ -37,10 +37,10 @@ E33BE71D1F5134C1005842DC /* CIImage+Utilities.m in Sources */ = {isa = PBXBuildFile; fileRef = E33BE71B1F5134C1005842DC /* CIImage+Utilities.m */; }; E33BE71E1F5134C1005842DC /* CIImage+Utilities.m in Sources */ = {isa = PBXBuildFile; fileRef = E33BE71B1F5134C1005842DC /* CIImage+Utilities.m */; }; E33BE71F1F5134C1005842DC /* CIImage+Utilities.h in Headers */ = {isa = PBXBuildFile; fileRef = E33BE71C1F5134C1005842DC /* CIImage+Utilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E33BE7271F546920005842DC /* IRLRectangleFeatureExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = E33BE7251F546920005842DC /* IRLRectangleFeatureExtensions.h */; }; - E33BE7281F546920005842DC /* IRLRectangleFeatureExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = E33BE7261F546920005842DC /* IRLRectangleFeatureExtensions.m */; }; - E33BE7291F546920005842DC /* IRLRectangleFeatureExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = E33BE7261F546920005842DC /* IRLRectangleFeatureExtensions.m */; }; - E33BE72A1F546C0B005842DC /* CameraViewController-Bridging-Header.h in Headers */ = {isa = PBXBuildFile; fileRef = E33BE7231F54626D005842DC /* CameraViewController-Bridging-Header.h */; }; + E33BE7271F546920005842DC /* IRLRectangleFeature+Extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = E33BE7251F546920005842DC /* IRLRectangleFeature+Extensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E33BE7281F546920005842DC /* IRLRectangleFeature+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = E33BE7261F546920005842DC /* IRLRectangleFeature+Extensions.m */; }; + E33BE7291F546920005842DC /* IRLRectangleFeature+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = E33BE7261F546920005842DC /* IRLRectangleFeature+Extensions.m */; }; + E33BE72E1F5494EC005842DC /* CameraViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = C4829FFD1CAEB16C00541D08 /* CameraViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; E35A24031F4FE3AD001047FD /* CameraViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35A24011F4FE3A8001047FD /* CameraViewController.xib */; }; E35A24041F4FEB0B001047FD /* CameraViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35A24011F4FE3A8001047FD /* CameraViewController.xib */; }; E35A24061F509CDC001047FD /* OverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35A24051F509CDC001047FD /* OverlayView.swift */; }; @@ -86,9 +86,9 @@ C4D9BA461CA73163004F70F7 /* UIButtonExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIButtonExtensions.swift; sourceTree = ""; }; E33BE71B1F5134C1005842DC /* CIImage+Utilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CIImage+Utilities.m"; sourceTree = ""; }; E33BE71C1F5134C1005842DC /* CIImage+Utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CIImage+Utilities.h"; sourceTree = ""; }; - E33BE7231F54626D005842DC /* CameraViewController-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CameraViewController-Bridging-Header.h"; sourceTree = ""; }; - E33BE7251F546920005842DC /* IRLRectangleFeatureExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IRLRectangleFeatureExtensions.h; sourceTree = ""; }; - E33BE7261F546920005842DC /* IRLRectangleFeatureExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IRLRectangleFeatureExtensions.m; sourceTree = ""; }; + E33BE7251F546920005842DC /* IRLRectangleFeature+Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "IRLRectangleFeature+Extensions.h"; sourceTree = ""; }; + E33BE7261F546920005842DC /* IRLRectangleFeature+Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "IRLRectangleFeature+Extensions.m"; sourceTree = ""; }; + E33BE72F1F54955E005842DC /* CameraViewController-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CameraViewController-Bridging-Header.h"; sourceTree = ""; }; E35A24011F4FE3A8001047FD /* CameraViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CameraViewController.xib; sourceTree = ""; }; E35A24051F509CDC001047FD /* OverlayView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OverlayView.swift; sourceTree = ""; }; E35A24081F509FBD001047FD /* CGRectExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CGRectExtensions.swift; sourceTree = ""; }; @@ -138,7 +138,7 @@ C4829FFC1CAEB16C00541D08 /* CameraViewController */ = { isa = PBXGroup; children = ( - E33BE7231F54626D005842DC /* CameraViewController-Bridging-Header.h */, + E33BE72F1F54955E005842DC /* CameraViewController-Bridging-Header.h */, C4829FFD1CAEB16C00541D08 /* CameraViewController.h */, C4829FFF1CAEB16C00541D08 /* Info.plist */, ); @@ -188,8 +188,8 @@ EBFE097C1CAF1D1A00A8C637 /* UIViewExtensions.swift */, E35A24081F509FBD001047FD /* CGRectExtensions.swift */, E35A240B1F509FFC001047FD /* CGPointExtensions.swift */, - E33BE7251F546920005842DC /* IRLRectangleFeatureExtensions.h */, - E33BE7261F546920005842DC /* IRLRectangleFeatureExtensions.m */, + E33BE7251F546920005842DC /* IRLRectangleFeature+Extensions.h */, + E33BE7261F546920005842DC /* IRLRectangleFeature+Extensions.m */, ); path = Utilities; sourceTree = ""; @@ -253,9 +253,9 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - E33BE72A1F546C0B005842DC /* CameraViewController-Bridging-Header.h in Headers */, - E33BE7271F546920005842DC /* IRLRectangleFeatureExtensions.h in Headers */, + E33BE7271F546920005842DC /* IRLRectangleFeature+Extensions.h in Headers */, E33BE71F1F5134C1005842DC /* CIImage+Utilities.h in Headers */, + E33BE72E1F5494EC005842DC /* CameraViewController.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -383,7 +383,7 @@ E33BE71E1F5134C1005842DC /* CIImage+Utilities.m in Sources */, C482A0071CAEB18D00541D08 /* CameraShot.swift in Sources */, E35A240A1F509FBD001047FD /* CGRectExtensions.swift in Sources */, - E33BE7291F546920005842DC /* IRLRectangleFeatureExtensions.m in Sources */, + E33BE7291F546920005842DC /* IRLRectangleFeature+Extensions.m in Sources */, C482A0081CAEB18D00541D08 /* CameraGlobals.swift in Sources */, C482A0091CAEB18D00541D08 /* VolumeControl.swift in Sources */, C482A00A1CAEB18D00541D08 /* PhotoLibraryAuthorizer.swift in Sources */, @@ -412,7 +412,7 @@ E35A24091F509FBD001047FD /* CGRectExtensions.swift in Sources */, FA82313A1B3C296C00A837BE /* Utilities.swift in Sources */, FAB50C001B413E8C009905B9 /* PhotoLibraryViewController.swift in Sources */, - E33BE7281F546920005842DC /* IRLRectangleFeatureExtensions.m in Sources */, + E33BE7281F546920005842DC /* IRLRectangleFeature+Extensions.m in Sources */, FAF0586A1B317894008E5592 /* CameraShot.swift in Sources */, E35A240C1F509FFC001047FD /* CGPointExtensions.swift in Sources */, FAF058661B316695008E5592 /* CameraViewController.swift in Sources */, @@ -528,7 +528,6 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; - SWIFT_OBJC_BRIDGING_HEADER = "CameraViewController/CameraViewController-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -569,7 +568,6 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.3; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; - SWIFT_OBJC_BRIDGING_HEADER = "CameraViewController/CameraViewController-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; @@ -589,6 +587,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.zero.CameraViewController; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "CameraViewController/CameraViewController-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 3.0; }; @@ -607,6 +606,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.zero.CameraViewController; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "CameraViewController/CameraViewController-Bridging-Header.h"; SWIFT_VERSION = 3.0; }; name = Release; diff --git a/ALCameraViewController/Utilities/CIImage+Utilities.m b/ALCameraViewController/Utilities/CIImage+Utilities.m index 5acea77b..92964856 100644 --- a/ALCameraViewController/Utilities/CIImage+Utilities.m +++ b/ALCameraViewController/Utilities/CIImage+Utilities.m @@ -8,7 +8,7 @@ // #import "CIImage+Utilities.h" -#import "IRLRectangleFeatureExtensions.h" +#import "IRLRectangleFeature+Extensions.h" @implementation CIImage (Utilities) diff --git a/ALCameraViewController/Utilities/IRLRectangleFeatureExtensions.h b/ALCameraViewController/Utilities/IRLRectangleFeature+Extensions.h similarity index 100% rename from ALCameraViewController/Utilities/IRLRectangleFeatureExtensions.h rename to ALCameraViewController/Utilities/IRLRectangleFeature+Extensions.h diff --git a/ALCameraViewController/Utilities/IRLRectangleFeatureExtensions.m b/ALCameraViewController/Utilities/IRLRectangleFeature+Extensions.m similarity index 82% rename from ALCameraViewController/Utilities/IRLRectangleFeatureExtensions.m rename to ALCameraViewController/Utilities/IRLRectangleFeature+Extensions.m index d76c6001..cee57e70 100644 --- a/ALCameraViewController/Utilities/IRLRectangleFeatureExtensions.m +++ b/ALCameraViewController/Utilities/IRLRectangleFeature+Extensions.m @@ -6,7 +6,7 @@ // Copyright © 2017 zero. All rights reserved. // -#import "IRLRectangleFeatureExtensions.h" +#import "IRLRectangleFeature+Extensions.h" @implementation IRLRectangleFeature diff --git a/CameraViewController/CameraViewController-Bridging-Header.h b/CameraViewController/CameraViewController-Bridging-Header.h index 0e7fe38d..3e5d816f 100644 --- a/CameraViewController/CameraViewController-Bridging-Header.h +++ b/CameraViewController/CameraViewController-Bridging-Header.h @@ -4,4 +4,4 @@ #import "CIImage+Utilities.h" -#import "IRLRectangleFeatureExtensions.h" +#import "IRLRectangleFeature+Extensions.h" diff --git a/CameraViewController/CameraViewController.h b/CameraViewController/CameraViewController.h index cb22c398..d038be2c 100644 --- a/CameraViewController/CameraViewController.h +++ b/CameraViewController/CameraViewController.h @@ -7,8 +7,8 @@ // #import -#import -#import +#import "CIImage+Utilities.h" +#import "IRLRectangleFeature+Extensions.h" //! Project version number for CameraViewController. From 2c9d1e042083764af87024dd1e8be15529b06ce6 Mon Sep 17 00:00:00 2001 From: Wallace Wu Date: Tue, 29 Aug 2017 16:52:07 -0400 Subject: [PATCH 10/24] updated icons --- .../Contents.json | 13 +------------ .../cameraButtonHighlighted.pdf | Bin 0 -> 4006 bytes .../cameraButtonHighlighted.png | Bin 2643 -> 0 bytes .../cameraButtonHighlighted@2x.png | Bin 7540 -> 0 bytes .../cameraButtonHighlighted@3x.png | Bin 12453 -> 0 bytes .../flashAutoIcon.imageset/Contents.json | 13 +------------ .../flashAutoIcon.imageset/flashAutoIcon.pdf | Bin 0 -> 30853 bytes .../flashAutoIcon.imageset/flashAutoIcon.png | Bin 1459 -> 0 bytes .../flashAutoIcon.imageset/flashAutoIcon@2x.png | Bin 3071 -> 0 bytes .../flashAutoIcon.imageset/flashAutoIcon@3x.png | Bin 4775 -> 0 bytes .../flashOnIcon.imageset/Contents.json | 13 +------------ .../flashOnIcon.imageset/flashOnIcon.pdf | Bin 0 -> 5826 bytes .../flashOnIcon.imageset/flashOnIcon.png | Bin 1201 -> 0 bytes .../flashOnIcon.imageset/flashOnIcon@2x.png | Bin 2496 -> 0 bytes .../flashOnIcon.imageset/flashOnIcon@3x.png | Bin 3897 -> 0 bytes .../swapButton.imageset/Contents.json | 13 +------------ .../swapButton.imageset/swapButton.pdf | Bin 0 -> 4075 bytes .../swapButton.imageset/swapButton.png | Bin 1692 -> 0 bytes .../swapButton.imageset/swapButton@2x.png | Bin 3370 -> 0 bytes .../swapButton.imageset/swapButton@3x.png | Bin 5686 -> 0 bytes 20 files changed, 4 insertions(+), 48 deletions(-) create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/cameraButtonHighlighted.imageset/cameraButtonHighlighted.pdf delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/cameraButtonHighlighted.imageset/cameraButtonHighlighted.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/cameraButtonHighlighted.imageset/cameraButtonHighlighted@2x.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/cameraButtonHighlighted.imageset/cameraButtonHighlighted@3x.png create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/flashAutoIcon.imageset/flashAutoIcon.pdf delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/flashAutoIcon.imageset/flashAutoIcon.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/flashAutoIcon.imageset/flashAutoIcon@2x.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/flashAutoIcon.imageset/flashAutoIcon@3x.png create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/flashOnIcon.imageset/flashOnIcon.pdf delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/flashOnIcon.imageset/flashOnIcon.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/flashOnIcon.imageset/flashOnIcon@2x.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/flashOnIcon.imageset/flashOnIcon@3x.png create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/swapButton.imageset/swapButton.pdf delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/swapButton.imageset/swapButton.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/swapButton.imageset/swapButton@2x.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/swapButton.imageset/swapButton@3x.png diff --git a/ALCameraViewController/CameraViewAssets.xcassets/cameraButtonHighlighted.imageset/Contents.json b/ALCameraViewController/CameraViewAssets.xcassets/cameraButtonHighlighted.imageset/Contents.json index 6c78aba0..0c0bbd1c 100644 --- a/ALCameraViewController/CameraViewAssets.xcassets/cameraButtonHighlighted.imageset/Contents.json +++ b/ALCameraViewController/CameraViewAssets.xcassets/cameraButtonHighlighted.imageset/Contents.json @@ -2,18 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "cameraButtonHighlighted.png" - }, - { - "idiom" : "universal", - "scale" : "2x", - "filename" : "cameraButtonHighlighted@2x.png" - }, - { - "idiom" : "universal", - "scale" : "3x", - "filename" : "cameraButtonHighlighted@3x.png" + "filename" : "cameraButtonHighlighted.pdf" } ], "info" : { diff --git a/ALCameraViewController/CameraViewAssets.xcassets/cameraButtonHighlighted.imageset/cameraButtonHighlighted.pdf b/ALCameraViewController/CameraViewAssets.xcassets/cameraButtonHighlighted.imageset/cameraButtonHighlighted.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f3b64b7c2bb9320c1058b4d00c978b51d7452721 GIT binary patch literal 4006 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 literal 0 HcmV?d00001 diff --git a/ALCameraViewController/CameraViewAssets.xcassets/cameraButtonHighlighted.imageset/cameraButtonHighlighted.png b/ALCameraViewController/CameraViewAssets.xcassets/cameraButtonHighlighted.imageset/cameraButtonHighlighted.png deleted file mode 100644 index c6a63711594d90b91372f37ef8a69835ed3f0964..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2643 zcmV-Z3as^sP)Px<4M{{nRCodHoZD|4)g8xYjd$bJm)PBnlVaK^A*3=80&&#}B{6MET2jhO1Bj|s z-zp&#<%K-u56Ba|pa>!LtwJh-nion9O-hTC2vOBZ!_8_4i6}TE&Tf6j&aUm{`!Tb_ znX|Ju-}my9ews7CbNznzoSB_7zu!1cO==9(7^pE&y$pm_6M8zGu2cW_Nq0%V@9I_^ zTcpjd>fnsKI;P_l>3?0lpyT;aC^Vq5HDAH~f(nHdpN*|E6N*5y|s{FR}@6sNT zd37<3t;xC~twH)5>6_A7>2e8e(+7PutVuFT8I(XYNsmgukgl}QCw(`SGUigtF3S?u zpzAe|Bhq8iXud(IY0|m)yKo%cG4kk#-&RrJ?F$y|97@b ze?HSWadG-PZB4`X|L_NwZ|msTt=71U+me>yg!HJ0Oxl?XIS&F_ayue#n<~95?Fy(o z^2wDe|2cj3ovw?ajdkxe-Pw43U3);W#hW(W9CGfN_-JxR`o`S8J@@zDzIE%pYBlIC z-!J>)BJuKKdtEevB5%J2@v3x#HJEff9zXl~n?5|k%qE8o0ph)_? zdU-+WyMQH=$@l*BO3(NDBArcIuJul6!Ce#$B5%QTnq@uHogA3>^<#(r7l}mfvC8ul z^Q1`pgJm!3bV2CcnfH=<@R6q_d%EYf-rc=z-Hn3{JaDWX>6pIi931YOJoL!Hb6V2- ztdT+D6APJ%B@-y}xaRdr&1F0L!AApUPriG;>-E^r8b`zS<z_p*^;lE{r^w@AEP>~MWcFkdB+2Q&OtG0Ah7d64&-X5LyS z4}6S~u`*`Hj?ECTz3gH&%(;_A6R0NmlkEGS$2E^-%gkHopW)m?TfQ8|%9t5D7_6Sa z2-c#cC<671@OZ`(h9}%@d;Ze9n`>S<%sg-4Zh|p0b})d&%0KL4w#?b51qoC`Yz**h z>s>Ep8|1G_Z)^9Oy{}R z$%a?h0tT>vNu_yK&Ip*no>%e`s9&H-wU3!C@OZ`(#{8dTGoy^tU;z`@EEvaJ4lMIG zr+Eofu_vYGbJz&awmhD#`V+=C7#5$>(-N4#rp92}ZDj*%%C51TJHbB%?4%UV3}N3n1QMc!mm3 zfECOZOdltiyetAWRk3wv3UK7@883iLTP3H#3T6xA11>i{a~6ThWsApq5u-|RUOn>m ztXc%DU_G$?=texH{=B^VS-pZ z!J!+UWY16~iFrS4VYlG=xFN3~fq28?&}}tT@uy%0y9Kl;0xy`A2qnN99*6E~5wL<8 z>=tGpH{=D)Kwj&OWGc$lD@G^*-tg5TUilC@XspXu}uUJ zK`g{!RJwo>tX9+$T=WEC4vCb*ymU?i-4ZY8XtLEx>>1%xjv|06 zMuY`SU=t?Z|7Ha2aFA2-5-8?*ggb85CUB3~Gs34#dpW1U0wy;o(S&l`<-oN0(s>DV zOFpL~zf49#1nv=gM)*{@3mCuxCSk$3JR@KRdtNC>pnd^n+EY?*&C1q6;2yDOgin>L zFm^D21xyAGuoB%~aFrD#kVe(e868fL&InPD1nv=gM)*{@31epLU~X1Y%@XxU;NBx;G8373 zjFmCF5t}AaVB=E&MK3AyqG>jiGcA{|{mSf>5`37ETDWV5iDHf-kx>7aq`nzU;2yDO zgio!tD5m*<>k$Q9|8kWBt}_IS#9GL|$S8RUX9(oz&cqj$G?z2>+D9i$qVlCh7T3gA zr35RRQv2+Q$wt1kNZh7;qS?Cw%GEx+6F^FqNhGq2pOGGx23;CzpMJ_>Ex;fm_sUFw z_RfIpc~j8G$MD0(mAIIXk8PM4o!y*@SJubJOtM5G9+^j^$D~m+&rYjsS%3b{#Dcvup<$h=hzJt`&ktXpdC0PD15!DFCLdP=(DAE8}w z0!?~ECh;ftN{Ij}%g-R2cxvey12qO}3{)EfUjcWCcIXD+mf-*Z002ovPDHLkV1g-g B8Grx) diff --git a/ALCameraViewController/CameraViewAssets.xcassets/cameraButtonHighlighted.imageset/cameraButtonHighlighted@2x.png b/ALCameraViewController/CameraViewAssets.xcassets/cameraButtonHighlighted.imageset/cameraButtonHighlighted@2x.png deleted file mode 100644 index 4792c85255fe73d72784198eee0bdc514c4079c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7540 zcma)>byQSe^yryk5QdTN9%2XyDG5OsxEt@Ylz>)!jv*>~T4_B!Y6{nkJOA&EcMtQ7 zM%(aWUH~^OC0VS>uk_nkSPXnB@-jMJfL$XyCvv^!%IcOyW7MG_kI1aRAvH2cCGfr( zg_#O9oR*~MxyZUf;dPLFl5H|wY$E3cKvcC|;kz)YOad?|6oywrs7Bgh+DJ%vuO^o2 zb?d45j9+dc;cV=cPKu9<=T+X&LZ1Bp=M}$4IX2N2=s0Xc9gb^O zR#2BZ{S$GY7n$$%=|q0)siae|adqv>nG@o@6n)C{Nf7A!AJd2zV^d=nV@=Nz(U8~( z5Q&}8G0QQqmhmlK(N4FA)=&`(6mJuIXt=<>KvOO+v@iNKaxNi0nIm6Xh6o-P9Pe+) z5mxjBP=Roy8}lV;zL%M^HbBS{fLmZ9>sjoxo1O{+Z3|*C+Bc>Zpk=;K78icDyS;ZQ ze#{Z?B1QpW9(F^J5cl|i!u$v>Nox&t56InH-bn@kZb0(aPjHT;ty3q01EGw#L;(@) zSnHf3IbrX&s`8lvk@O=)wMD`JnO5n}ODDPS{T4M68KI+xPq%!aD^;b4gJd=+vVr9mGj^&%Z~jIP z4HaIxxw>ATGw^V8AEl+HzWsA_6fMb!<{|#T&v>Db-BPd*y`6B0l6L%7Ob(EVDgE4Y zHKtd9Dm#38b#+BoW!yG5Gd?azVVNZ^CZ&J5b#v@roYEZd1)1+^=e+8$z9yk7v zDSWxbjVCvuDj!>0TT#Wu#n>~lli6{dPq;_o=JOoz4(=Tb5r1>06Z>|Xlp6?L0#dJA zY(?3|gjm-suk=Re*nG`?8Mu-3sFW)_*KFZ5bxYKDqAsi54pGve{2LvE{-m+@EKiqy zXWaVS$zJHDq1LXGP);;_-y+cZ>T97w^w-fGi3Vy7@0@{Eu_`6vJ&*W<1+i`pw%MC5 z4z@>Bk%3+r2e*938e1P}hwOyAySpoF5djh&zjUnh^k!ID3?oXE?ML}$Dh-MtFCS$% zYfesu%q3d#;L>p4tFng`R9>l2QBd5pTMi~t3QxsZTUzQYcshG_KRA=)yo!+93uf>0 z)FLHbTc!Uo^Q>~Bnesj%AHB4H>*n|eHN#gz!?S4#?;ow}+G}{bJsV!E!ZPY-Kx6fG zN+2|rtSXAXyd0)uBvzrRtE=Nk?E8i?`Mr5-tvx*cZ*bksVKqY_h0HGh3-B$ z@`e?kj3lrs$&QYW(!=cKn)_|P=6<+iQl9yh1%AM8Ua^=& zP{`QG$nR}$6a}O3RCFI9r{5gmOqxs=Q&BtVPP#BM(CfAJ9oQ=A_X87ZoohoAlRWR; zxkqHw_X%UdTM;*}Z+#v3g*ZCdV;x+-%VE!T{eU2hmSEV}^b>qF)}xPW-k$tozK_Ut z&Y;DGy-vIXut*8BxYFpUx3&Nuvva*80T1W}_b-c@)5VpuZp2Y1j?HU*8WkNKFkfq@&6H^+dLu`us@!!%_M#8W z3LWV8Zrjg)8d1a?^NNV+vAZon*VbY#aM$@;-spC6q@b~2(eQRwiqT!Cr6*C1#V17F zFR0?E<14w!%-1+zai?_W3}Rrgufg;202zi@;<1?)lnpxfjc^M@+{L%qH0V~X6X>A7 zsZ)@6-$L1^bu+uZaWh*S6}xf1(-%uOYL}P2~y}BK-TzbAwyeH;;L_qM$exH8&!8c(! z`J`6bv!^0XpV=4U2R6jaK%fh;pFd+-lcY?rCb&yzX=zhy2A@c+yNqlzdzGoPy^kk* zkUn5M>tk&2=8URFrLw$SB5FGmHjtDQOSnT;2?Ub~@~hwhWTc+f(T6>z**)EvZ>ZWH zO5xT730B82sZReAMOl~kwBcBr#$J4Xhpjm646iCHyY#-fJb8rt&>^G#Nh&QQ)FrPl zQsS=`LATI#%iJo5nM$MG2FJzBnY;}99ln<(p4Nvs&al-wxJ$nF`~qrefZ^9niDur9 zM(?8yLE_;-L5@wZUYC<0NBQdC6@wj%&4bJVEH`-czhfxa+uM8a6t%;*n1AxKjO{Ii z+%(GC?aJ7#toZZigQ3&i`6p1_u#j}3ZZzV29Sg>{Qe;7^(PcPa2V=Uf1^=n@R;zUy z7UBA%U~%&K^R-g3hMmD}$i#H5cX|WLpH#w}S~Svt07)C$g19B9Q+tm)>d2jCM7z~e zZL_y8{LY}1!>(tcqOERMse)&=044sT+DZ*a-E3yW8N1u$8KlpOO2hCK#^{h(bitc7 zh;xU`AJq37&+WGgQq;W0U3z%8M$Lp(wB)w6;tp}OK#^^dZZxmDLu<3=J8?k5H+9R9 zES25I&E46rmThO~o%7M6A2-eyShoa04JD`mjjV~&9<1jFVeA>i!&SVmt!@oldb0xu zI$NI2=Zs`qZb&kfAjIZgU=z;F#!6s0{F4vV7emIRlg_8Bs)Lbt@nHiDqRFaZ!}f;D zKiPyfFD7-OCk>AW=ucnU`QGd1Xx8u7ZCl5VSFOx_|Q<<2^ed?XNu zC}fA;l2Ni!Rn4uj^*9_Kyw7`}|MB$bJGDJac2j>MonK@^Sc;MMby=97&iB~NK;;}c zH#^CXb3{iBgiix+5yZQZWY1Ida8mUHTSg*DP(bSiI18Ei)1CLETrNB2eF0eL&3T@q zem#zhQ`(yY2Ew{nW9y1Y4_1*LByfb1Od^ZkpG(_Y_-y23z00{%yGBteDg+@K~VQl~J0inJswt7maZchvf|2~W>9(%2; zQC>A)Ss?f@u46Y$dC&K2NU)bKByRZUa~f5xVPH?pYz8$@EoP&s0cGgI{rAv3;ysga)NdBOtV0@Y9G(BTe{s39)F7e@2?Zx;N6^b>S z=R=2%mbq*20_Ff<{yAJt&hI%Hb<)G(Eyjl4)J~kEgogJdrjr_EjVm_^=<4f%VQ;H&RK&g^Di^cM5;qH!NlC1{7c524Xfu(D5pvl#0(9eyG5mtsNzad1RKB>09 zT_E*5x%^PV!RL2iWZ6_ihkX|-^+ndw@=vEDX~mpX!ExbIKO!ClUQYg0a@*KmipVtF zrx;P_a6$F^Qs6b-{r4Ls#K}czIG|$6zG^-3K@!*Aghu9{h?gec=c za;X99>zs_a4T@~`bRaJS5fSYoEPEG!!5-mjf@GP62gxL5(t6GoL;Nh3YgP!>3 zozk#vJAk=bOvS^PQ&m-!%6OsrmE=Ill}CjKJ}u722jxkxR%PUcKD1(^V0}GvU52{s zTsHFX5|FPti2C;}5Y40+&HeM({WxAT`Z(D|GE`U7@Y1>X_x;_yUl4HC zXg_WOf1014*VutsC1JkKo($Z;S1OVpqdEDep);ItUAnn#0SKz=FxC>}@}&L>27D;_ z_+BWp7kPls^iY*O2nRF`^ifIpuwd5s5sX|UVFw)UI;uz|Yd?MoH|72O@24YaY#qDe z)>HkOSezO3|JnNCpRJVul!8PW362hdvXDAH$=^wYy;C9Jj0N4{umi-!OD$dX|5Jk) zVhE3JzPBb|9HXo=+^YB2d4I(}#DW2^Lv9YMpe>%CMfY|RV9O_OM`I(eiE|SN&Hl6e z6~=PDSHMf(c7MgSM?37j+iEJ0|F>SQThPeRkRUkS>Lcwlpgckx{0ZkYu?rR&=x+_z z8BQGGED=TpcF=-^QEBAd7~#ReCMEa_Y*lCFha6R5e;w0&PDXr#RkM3SFn=SYTwR*2 zH3S6O2eq*s2{7k-|4=KE9~v4`-=GNFQ~XnyTaxjg%MObc%)~g}|72GIBJAu+n?PFR zI-un5TsaH>Jo^3LFsPMH1wM>Mi!RAOxIbu26yKY_pf&oR_B*XTe#1%7v6o~Gb;8F~ z@2bBm@iXPDnkpR`P=qxIndIACNo9>eG8b1t&jDX)qeQ0l$2oGtbcd8LHh6z>v{~{R&rnjF?0nEa=chyUyp4T z_!RvB!Ioc%S%a93iiu)r$uWk^Hm`e00N*m!4o*XP>N7Jl37gZ(t@W*oli!fd;(vmL ziJQ47uB_)Ku>ujOYqn^DJBp3?R`Y}Akt|m=GYH;moaw|uUbBhW4wnv zjD%Wk$YX3Js%IFRqaRco?0W&->h_#vHqg`2IrjN+5U9H>N~OejT9jLqje~^!JqBls zv9#WWMtG=oPKhwxHDk?D_omfc8o|JgkCeW=Wqu;euv;BPvjL0Ik$Ze9Fqo`o6Hf z{#3r0WSr{sF(MWmEpwyJ4k4B^S5c3w(D+fbK+V15g*PD1xNW&qZ8bc?O7rWIkLKks zqXg7WE-4xljxDWmiW6g!$lh(<$xBv(kq_Qb2Yn$XiSg*AJ31;aFV|c>dD2!n^Q{<( zDtwM+p9S{3`!7Q7_?rDsgscq?2rfV745i@KP2Z2=*>TXJBUhZ4g!#Ly0#Fv#IH{N) zK-NO-X{Z35$4d$0dexKs7VWmvpI+J=;OCX$ScR)>UT^k_+@$n{ ze9iv?;Io|H!!1wWafdv3w!#blgrvblYZ38TJD1MB`Pr|l?D-UnJ{C$>Ke-e&Ur6@Z ze}zZ0ztNU-e&IQ24KSDgEAJLBZ9q7%f{Y3@y{$s}HV6mB#L)bnu8>fW=5D!tZ$)ig z&I2i2U>^WtGP~zUnvEOlSxc*iUI3j_Le6`Ze2QI(M%Ale3JMDDXbkpo-#@X9J4>gt zX4zD3QcuT05(u#9_KdKz_GHg0!Jd;5-vLSzLNpy*m%rEAk!28p>8oT3gkI_(W3qlzar+!VW1b9je#HGK^|pO_hcCmY8O5Mv#b zvL|#F`lO{ejhgIty7CAf@(xeerb_OEnmhH&(S>>ky0aa+;k{e)k!McddO-t+^0M<} z*yb|o$XE@@o>LEqJzdq;Yzsv=dqj*2@~XgS+}qn*O(EdmFPOP>oYKp+aHh1VLB=*} z+qTX~$Z((g+M4ZjlnXr+faRyGNi@#2C&#q+{c3J*e*dx?;OExw{~oJ502Yb*KiHt0 z@ednDFxWu+RalzHp<&SOp7mUs&Wjf}*%FggPL50Er3{lIl+i(bLI8?{da;I(fg zp{Zzt**+*0QQ>E`^B_$s&w(uuuK=2%+c5R&=_(TwA-~IGMNGE+!SBoELdXc>dGp~B zeyzYiTtRA`M!~e%!XFx>|M66Z@qsJ}6PB5rQM*K4nw^-UjVc5JsY=F?sI732E@ann z3#~Qd2^0C?U}rIxDWY_}@zo>CeRiKU)rI5<9}1B`8{Wx$1NgYRKzd!jH;ZDOTwFAo z+T|L1ljb<~*7*f#8_tLnQ>M|hFWb^Tc6@&Z0T~aFFM=Tu z!L%<9MgJF=&Dd|A2Wfvz;OY3rhfBY6g!*3hs=ZqIR!Q;;@+t*t(vP$e_!27t$gqfa z7U7euEXc;_u~};O)6lCl^k#`qu)2O$t@~v=%aKf8JkAR6^~j|x?7b18*e9vHBNqTB*?DN8yP|T_};|zL(wK4be&Yb1L z!5ma;9|a)>!E@uZd8ch>96LILU0!-n45Y7)tPaeAqyb)I&r|7n@Ll_AQ3SA=KFi4I3BP_r<&uJMP8rD;LJ3KLch`3dB@2 zx^jP6%zSSb(%#;lB;mQ2y?S;PeI@DL_oKA@WWHTG-SHRN7UHZ%;aTTw0hoEy)Vkpu z7DD2Zk0MyRa&-T6c$4A`tQPwSR_O}B)ICDy4h{}tpZJ{CHq_ViSz?0w{}f`-mhMT$ zjY%0SREN^Y)wsnj+`w8 z3gU3c!G$z(jiU!LuTxE3E=1} zFbpaLAa#ujXLA?S9DpVhXRdZ%o$Z^D-oJMwM`OI|ehX}44yX*j@{t-peyGXwQ*G7P zDXr@1pWR38@KEa+jS8jT&be`G(N{Xr_oKiZP$67W*Xm0H&e$#eG0|4S|=GKeG^kgVF>tDTJnIQwT;qPp6~uO#ai@l zHaD+Ai<_tTKtT&A^A*osXgk;=<)QGf^vukRjd9DHQQtIXBrS@$iqb9OsIF68X_cNW zBfD#nTaqQVMCULcx{=s#bt=>(7(ZZ3cSNGtNurq} zIAo$q_KX}~eogSlQo%#G(#d9Mo^W$D>jlLzHgVjr9T%^i3_J)6d5*Vd64DOxXzi2< z)%?S~dC(r{4_vv)UGw(HZmVU<=X``5*f_W2T+;9-%q%mox{N<_$~UCB1ov3fWa%cR zg6JcO2bBMy;?7yz3536&9TTy{{q3rGV~MGx*C(E0#_0zJcm@A<<~}hu>3BK`5{Z(r z$rSkjFUgLvjyaV#`#rPI2) i`2TUi=MX>d05>vj)=I1*7nn9GmWskt`AS*S;Qs~hfocN) diff --git a/ALCameraViewController/CameraViewAssets.xcassets/cameraButtonHighlighted.imageset/cameraButtonHighlighted@3x.png b/ALCameraViewController/CameraViewAssets.xcassets/cameraButtonHighlighted.imageset/cameraButtonHighlighted@3x.png deleted file mode 100644 index 089430d9d02bbf793c9061c8bf634f45148bcc94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12453 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 q76rPk|3BvM|C{1J!}ouI+sBkb55qvpN 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 N002ovPDHLkV1fiG*XsZP diff --git a/ALCameraViewController/CameraViewAssets.xcassets/flashAutoIcon.imageset/flashAutoIcon@3x.png b/ALCameraViewController/CameraViewAssets.xcassets/flashAutoIcon.imageset/flashAutoIcon@3x.png deleted file mode 100644 index f780e1691a218d4b7fa9d27c042f08e255b38651..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4775 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 B<%j?P diff --git a/ALCameraViewController/CameraViewAssets.xcassets/flashOnIcon.imageset/Contents.json b/ALCameraViewController/CameraViewAssets.xcassets/flashOnIcon.imageset/Contents.json index 4a2a5a59..cf3e6ece 100644 --- a/ALCameraViewController/CameraViewAssets.xcassets/flashOnIcon.imageset/Contents.json +++ b/ALCameraViewController/CameraViewAssets.xcassets/flashOnIcon.imageset/Contents.json @@ -2,18 +2,7 @@ "images" : [ { "idiom" : "universal", - "filename" : "flashOnIcon.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "flashOnIcon@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "flashOnIcon@3x.png", - "scale" : "3x" + "filename" : "flashOnIcon.pdf" } ], "info" : { diff --git a/ALCameraViewController/CameraViewAssets.xcassets/flashOnIcon.imageset/flashOnIcon.pdf b/ALCameraViewController/CameraViewAssets.xcassets/flashOnIcon.imageset/flashOnIcon.pdf new file mode 100644 index 0000000000000000000000000000000000000000..219128efd4fc6c5c29c7ea48fa809b763f6c7631 GIT binary patch literal 5826 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 literal 0 HcmV?d00001 diff --git a/ALCameraViewController/CameraViewAssets.xcassets/flashOnIcon.imageset/flashOnIcon.png b/ALCameraViewController/CameraViewAssets.xcassets/flashOnIcon.imageset/flashOnIcon.png deleted file mode 100644 index 227ccce99935d6c3acc30cd7efbabc447e60e757..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1201 zcmV;i1Wx;jP)Px(Ye_^wR9FekSzSvMQ5fF*C^M9bEXB1g*G+QCk1om!Q3|Amt_tchFT7E&yHU_T z5D1Ehzd)kITY~}%EQKz_zATkZStY4#HKh+*wC5Q-!|d$LI3H)X9(b5D=e*}V&%X1X zGiS~o@Og(HE<)fjus}l;eVZD_QJx2vLDx9ovS&H^Re_ZtMLGe0#0T&l7VCO)tAisoVmMH99n{iF|YM>j^ z@|IetNrhH0^G4b_J3c;sy|J;8Ps}T*iP{us1t+6%{Q}rVRmqVDW z*RAp!7Z(@fwY9b9+uGXBxc$+Ze$+;dJ|Q@)X_Qi&o16PaM?F0~k(`_y89tSC6@ob% zrDA4gMp=$ZN=i=k_V!+s;G8={CBjT-r(48*$Df*-ithq6Y;A45>i7E(?c2%PfExXb zaLC%uUF+7?*3JgN-ue0YM}~%m8r^wH>J_438B0%+S8=npwze+Hkx1lnQ&W@Iv5s*z zcuI$chK8d>MMWu(yP~3^u(Y(aSP0Gr`uqE@)zsA77j-VK1)c;?PEOvaudlDRJ8*S% zb!A6K$JxQb!H;(P=OG*j<2h$>k;~?lc=t)&g*(> zCL>P4JU;RSJpL8DieC#S;cz%zg6AoC8FW4Igh;HfPyPVB4+ewBMZLr;H7-*y!Lu$; zn4X^A9335Xvm~`lg$KfyNC|Pz zU&6z<{{_^dMwg=WCqF!4`2_M5Q6GI&WfXjUbMH(&D)fTcz&9U%Sz11wIDk!z!S0RT z)<`gIRzMzks`~?0W)M>t>zUDbW`b$E0R8}jV5ZW8X~4)DibZ`&4zo@RMmh%a+#*-o zkcKkTkU5)@2HLT#A}s8f(_C5#!6H#9`AYu}!K4XhG=|eh&75uq14hnV)GeV8mo09< zY{98u;j|ouFvwJKdQ8Aw*Btm3R9?5Z+J;-f+5s5#5Xk)l#S5Y+|F7G>uHX%6euX!$ P00000NkvXXu0mjf+Oj)( diff --git a/ALCameraViewController/CameraViewAssets.xcassets/flashOnIcon.imageset/flashOnIcon@2x.png b/ALCameraViewController/CameraViewAssets.xcassets/flashOnIcon.imageset/flashOnIcon@2x.png deleted file mode 100644 index 5eb993a5b70f6bc09ba1d78aec08f08c2ad58a0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2496 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 Hu0mjf`|&T? diff --git a/ALCameraViewController/CameraViewAssets.xcassets/swapButton.imageset/Contents.json b/ALCameraViewController/CameraViewAssets.xcassets/swapButton.imageset/Contents.json index a9a94654..fddb4bb7 100644 --- a/ALCameraViewController/CameraViewAssets.xcassets/swapButton.imageset/Contents.json +++ b/ALCameraViewController/CameraViewAssets.xcassets/swapButton.imageset/Contents.json @@ -2,18 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "swapButton.png" - }, - { - "idiom" : "universal", - "scale" : "2x", - "filename" : "swapButton@2x.png" - }, - { - "idiom" : "universal", - "scale" : "3x", - "filename" : "swapButton@3x.png" + "filename" : "swapButton.pdf" } ], "info" : { diff --git a/ALCameraViewController/CameraViewAssets.xcassets/swapButton.imageset/swapButton.pdf b/ALCameraViewController/CameraViewAssets.xcassets/swapButton.imageset/swapButton.pdf new file mode 100644 index 0000000000000000000000000000000000000000..edee8db0858033ec54609c54bb5035dc158abd99 GIT binary patch literal 4075 zcmai1c{r49`?gGB2$dyLp1h2d%xX~Cmq{rkW!G$WMq}*Bk|m7niIPP2ttg@)d*U@@ zONAy|LL%9{elsnhQVqL*L z?5?qYgRjB_L+8|*Z}WB+MMkRnA6$g&zsxoz*&Fh;YhbQO{qB9~nYh0z%WF8D_+b3L zIs*2l83hodR9nv%Bi;KyhcFsJlMGz2pwzHvMH?@AhYwJwr>V4Hx>gm9kC16w9m-k|~^4qBi z$KOk~RjcZo819{SYFCKVyOf=M+jF|6>xs1kzovn`k>A&ny20r)5n!Sl;YT{m6{`xY z)LCD+3YukPEfK#I=$x-R5r7(D?Z5q!iEb1C`Mp?Yi5?_RGM?xGpuYp!BsU7v?g6k0 z%&g{VBEb=>Me+eGVN3v_1R&tnU}iagoWk1mvkgXM65fPJ0W6tE>F5F0092dgLL!^E zWAQ|Q)hBHaIH2?`teP4C)%BrZOeoAAeY0VhHf5HL8JyLwAMshx&-mZ7_;(u=k7Zi_ z^;P-B_s2-US(j#JafX>MRFgFqZma{LIz%r=Jn<|>>wk|+`VH@MCW9gobea;aYnK!t zvncMz1H3$TLKtKmsUKv-5grQh(%Ggbv{UXp;oLKJOoS9(SBUp&2yTF9LC~nB-dIO> ze2D7IGgqwmWjJlK)qG@dvT|V1elB33n$2h<1k^w=V-G@QnhAZHuD9B?yS-_dV~-#^ zzZv^8hMgSW z`J-1=9PY6B~@3uzy+ZoS9=fggj z8h=RQ35|592|FHa7N8V2_l16 zL+<1H9^{zG7O8vjpm*MiIns3gV(dlBvXlp$udp-6B=}pOiM^L_zf!fw3gM<$0;&`k zpwiJz93pVw1|aPseNIrE zdy;!IbY}y~I5^LcA{8#^+hm24dvN`g=2LwM$eBbT{cvf~v(j>@6~X89ousTGsu0?N z#I~aZ40(^ahK*r~bOvB6BaonOlyndxWO!0SS8MQ$%E>1hz8b#T_s{OgbL%xLxLKWU zVMx;nI2i!NBqCG3q>Q!|Cly=2@qTpBJCclEtuv$4$6gy4kAU55D@Q)Mq@?jI1>>bdXxvZ~^A z#nIQq*RXvUrR?>d#Hr>*$q%$e9-<7OC{SSvnR(E7?_g!g!*@ig&TaWQdI@f1{xqF9<+T3gz9+9ayA z!oh;~5y)cPV)BsZqNox80Q6fBiA zE3GO`ytNEZLCv7HrN(oaYQ`DG8QFE1I?KQp&$@uu7o#!vhkYkWX! zxYH=UyfbHL;!$z_krA)D*??nd)@4H?HD_w*OZ-bx>yULgmuiGh1dV_B6~*gdO=v*h z&gl<~s?K@pD3`3i?1LWt+>vziPPxt3kL)3LUt&~AkmD5y3RGJk_sm|? zH_4+G(`y~42Vy3@np~TPUa1alR;?cvI3*B|iEd5GO`H^`^V(cXDZLPXp|mn#88_!N zm#cPEEmAE;ZFj9#ZD9a(1-r?y>9scWW#IGV+Q7OYNEuYb^8uU<(gU66QsYJN?AqoD zYOH6kuL+TazOJ{P8+R*k2JIPGp@Yx1M<{C0XtoNc}Nr9=DoO70sG+=|@YkUwrvvS|CndmJ>7SQD|H zFxhf=GG^X-g}4z9N(p@!+O3n)WF3juFVPp)ALTIAeDu!qq3uHOSbkDmQkEPtzdQeL z$IyzEiXJT)Y*g7{Yow|y4cdsxf@xR3aP0eJy8E6+cf7$t4|BVko7ev__dlig z-q!WijIXuRv95sYiNVk9dhId9y(4Z>!@b6Ljmv5;I+V{%v}iriGG@?@bXxMeG`k49 z%nsR=7dyR4k+SLjifex#_1;kCZNl`3dBBC$p^l}{S=#-j`|IBCytuvJ4oy{mF-ygn z+YEM7VI2-NgZ{R;N71WcyuXEoK^;=t)7pY6BY2`2MPtoH$ zg>T(XcwXe;zLHHTcAU$}jT$bjRbL9;%v{GWw#HA*7_Jy5XT+#` zU*_3Z@PWA6O^hsuep&yMo`0jE-$*$cj`&G!SxlIPG3m0twzd}5gGc~a6!t7&{nLd- z(tl^aEDrDS-&r|}ZhJDBJsg0ZawK>#X*f#)Fr)oKk>T(^B5GqPSQnE0cX{CPQx}{k zl06(rZU7Xnfcka+PgQa7G!_pSngC`19HszAD4+pjPb`_@2QZocHwocGk^7ki{AU^m zb&euna3z>BLInXsDZ@|}Fqka!{nzuC+cDJy!4uCEa`5kIK((3rjl#T>4vWEmi^-BF zB*L%%{}ls1WTG7y2Eb8Z*#AEOT2T?H2-pEXFr*@yc{SDpxc$UnNLG!0$B;Px# literal 0 HcmV?d00001 diff --git a/ALCameraViewController/CameraViewAssets.xcassets/swapButton.imageset/swapButton.png b/ALCameraViewController/CameraViewAssets.xcassets/swapButton.imageset/swapButton.png deleted file mode 100644 index 137243eb63989e51949c5df81e7ce6e8473e2614..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1692 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 APyhe` diff --git a/ALCameraViewController/CameraViewAssets.xcassets/swapButton.imageset/swapButton@3x.png b/ALCameraViewController/CameraViewAssets.xcassets/swapButton.imageset/swapButton@3x.png deleted file mode 100644 index bcbd31ee8bd1c5b9a40984324754c642f4709d88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5686 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 From cab887f94641663860fa5ee53eb0b8b67e40a0b3 Mon Sep 17 00:00:00 2001 From: Wallace Wu Date: Tue, 29 Aug 2017 17:05:47 -0400 Subject: [PATCH 11/24] update UI part 2 --- .../confirmButton.imageset/Contents.json | 13 +------------ .../confirmButton.imageset/confirmButton.pdf | Bin 0 -> 4038 bytes .../confirmButton.imageset/confirmButton.png | Bin 1258 -> 0 bytes .../confirmButton@2x.png | Bin 2760 -> 0 bytes .../confirmButton@3x.png | Bin 4468 -> 0 bytes .../libraryCancel.imageset/Contents.json | 13 +------------ .../libraryCancel.imageset/libraryCancel.pdf | Bin 0 -> 4071 bytes .../libraryCancel.imageset/libraryCancel.png | Bin 484 -> 0 bytes .../libraryCancel@2x.png | Bin 843 -> 0 bytes .../libraryCancel@3x.png | Bin 1092 -> 0 bytes .../libraryConfirm.imageset/Contents.json | 13 +------------ .../libraryConfirm.imageset/libraryConfirm.pdf | Bin 0 -> 4038 bytes .../libraryConfirm.imageset/libraryConfirm.png | Bin 591 -> 0 bytes .../libraryConfirm@2x.png | Bin 1241 -> 0 bytes .../libraryConfirm@3x.png | Bin 1909 -> 0 bytes .../retakeButton.imageset/Contents.json | 13 +------------ .../retakeButton.imageset/retakeButton.pdf | Bin 0 -> 4071 bytes .../retakeButton.imageset/retakeButton.png | Bin 1124 -> 0 bytes .../retakeButton.imageset/retakeButton@2x.png | Bin 2423 -> 0 bytes .../retakeButton.imageset/retakeButton@3x.png | Bin 4010 -> 0 bytes .../ViewController/CameraViewController.swift | 1 - .../ViewController/CameraViewController.xib | 17 ++++++++--------- .../ViewController/CropViewController.swift | 2 +- 23 files changed, 13 insertions(+), 59 deletions(-) create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/confirmButton.imageset/confirmButton.pdf delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/confirmButton.imageset/confirmButton.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/confirmButton.imageset/confirmButton@2x.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/confirmButton.imageset/confirmButton@3x.png create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/libraryCancel.imageset/libraryCancel.pdf delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/libraryCancel.imageset/libraryCancel.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/libraryCancel.imageset/libraryCancel@2x.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/libraryCancel.imageset/libraryCancel@3x.png create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/libraryConfirm.imageset/libraryConfirm.pdf delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/libraryConfirm.imageset/libraryConfirm.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/libraryConfirm.imageset/libraryConfirm@2x.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/libraryConfirm.imageset/libraryConfirm@3x.png create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/retakeButton.imageset/retakeButton.pdf delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/retakeButton.imageset/retakeButton.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/retakeButton.imageset/retakeButton@2x.png delete mode 100644 ALCameraViewController/CameraViewAssets.xcassets/retakeButton.imageset/retakeButton@3x.png diff --git a/ALCameraViewController/CameraViewAssets.xcassets/confirmButton.imageset/Contents.json b/ALCameraViewController/CameraViewAssets.xcassets/confirmButton.imageset/Contents.json index b1455e12..b7385f6e 100644 --- a/ALCameraViewController/CameraViewAssets.xcassets/confirmButton.imageset/Contents.json +++ b/ALCameraViewController/CameraViewAssets.xcassets/confirmButton.imageset/Contents.json @@ -2,18 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "confirmButton.png" - }, - { - "idiom" : "universal", - "scale" : "2x", - "filename" : "confirmButton@2x.png" - }, - { - "idiom" : "universal", - "scale" : "3x", - "filename" : "confirmButton@3x.png" + "filename" : "confirmButton.pdf" } ], "info" : { diff --git a/ALCameraViewController/CameraViewAssets.xcassets/confirmButton.imageset/confirmButton.pdf b/ALCameraViewController/CameraViewAssets.xcassets/confirmButton.imageset/confirmButton.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fcf9f34883dbbadfd800720cb39f2b7c65a68b7b GIT binary patch literal 4038 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 Ld3gg9L-79rD0av8 literal 0 HcmV?d00001 diff --git a/ALCameraViewController/CameraViewAssets.xcassets/confirmButton.imageset/confirmButton.png b/ALCameraViewController/CameraViewAssets.xcassets/confirmButton.imageset/confirmButton.png deleted file mode 100644 index 4b68cf57fcc2e2f3415c9a1d3c16077b64f382d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1258 zcmVPx(q)9|UR9Fesna^t-RTRh1y)!0heu#A;@)n|{2qGde(KcXqf)ZO7f?bJ-;zFeU zg7%NljiExcTC5uv3R%<|yKt9cYwQm}7uuFb1xbnsZOxCqq%(8|L(%n z;7?GAzUGQ*X4>e<$}^7EFG24MfV|&IhB4Pf)CoTbzPY$>;0LR@7;FU$YwlIb{Q#3D zZ58E>hneS%@eaf4XY=~=+6nx}6?U!7h>y_sT&+)MfEf+?v_40F z>KfP#P22kRZg zEJ>Oz1m=qdQ@3Ti&8lk89ofi8X(4d*A=4h=ostqW5*Q1>S63HGKeX*=I#`B`ir=$c zdD#eiWZaR_d$r8}9mx9^d}|Z&<pDIbe5>K=Nk!bJfUeXFOTW!NVNhB+n-=d zJNN=bFb=MtKIOk>eAtJT#nGmX@bwS6Z-atcR>R%o`*vg=&2C$I3>&EGM3LmsT=8?#cs03GDAT z=`NnECc_HJuQ!OSI!toZ8_}TsvnzodyOPihy9w-XHv)NM!IN7_cLQk!x{;94%*YfN znmc42mOfq%Wad(q>X++*yt&{@CEJ`U!>SRin&~5}Ni~Bjfd1-gAV)7pbbtJ7VcLK)t3jXEj38w@7iFo9ZtyGg=fsTF*BXhFdF%mCcN3zhE^MZ!kyx4J_|U?v1ip8e*Iq0} zyhAZp75L)*L7bS)Y~0a1S2G)*n8{QH<_%MxOkS|w3xzCXO0#5unPFkd6LF*6AwR9N zSRD*xNoRdHF$2s7=CX_g@3Fp}g$%WMHS*j6%*OLm14r;Urdi*PLfvG@)13>a4aBl6FHzn?YI8Q>*kNe7&vvU`|Flta4cVJ_pjUk06kgR U`IN)cegFUf07*qoM6N<$g5is0I{*Lx diff --git a/ALCameraViewController/CameraViewAssets.xcassets/confirmButton.imageset/confirmButton@2x.png b/ALCameraViewController/CameraViewAssets.xcassets/confirmButton.imageset/confirmButton@2x.png deleted file mode 100644 index c0a544808827bd8acc8c4c92675d14c813d761c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2760 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 literal 0 HcmV?d00001 diff --git a/ALCameraViewController/CameraViewAssets.xcassets/libraryCancel.imageset/libraryCancel.png b/ALCameraViewController/CameraViewAssets.xcassets/libraryCancel.imageset/libraryCancel.png deleted file mode 100644 index a7205d04c46e2f42f1c657ca70db935697a50a91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 484 zcmVPx$o=HSOR9FdPU>F6XAut*Oqai><2)wqIl>%WRl){y~b(GV7W-P@87r?<_!Xb_# z%*?@hoQZ?=_G?E4dlU&AoHtI2)r?H6SJ?SEC*n{77beO94F4H7GBPl7F)=Z1BjgB> z|KmmWKiG)FUbrwL zoJE+y_|{oz4$u)vK*xOh_wS#V=>7)>VcNi!GcdJ+d=9pJ@BJk(IeauJ4gi^h)e+=c z4mJ><>u|`SID+y2|D_C!OsS;$9A-ADApqA0iw=kYX~7ON1Vj^+2$3~F+5ds*;4YH* zZ(y2#jKn9JNtOeUnvJ;aPSo$#b!B3jHEPxZn+2| ztDz)J^el?Ya*`Z?$8wnYWI2MU5P0XPTnbFCT|{Ix6h|=p|LZEe@8L0+3$f8erGfuU z35!qy<1nbq9@0000U}p7naSW+o zd^^)HJH%1oc=`RKEW9gRidDq2ilRE_3OKUpYuaqxv~lA`o*S>sIXG@{KAJADg+roy z#^KdEERIKjgF!ff$)|x6iSxi-Sz+ZDGqpCpLyd>GUz{HkUt98|^fUX^{M-JIFP-EPY1$-Y z5IrY;)y?;t&b(ysnfh$Y=F>A+8Y=$p-Wn#ic5Th+Ng;RMo19*{TS?&i_WRB|L{}9b z&H9@=r*_g;h0Z`FX#w$`xlaVmSNsXr@5YIlm?*r{tnH=kjjmSF?OW=mYhccujPLmxjb4?3m& z==bQYcJ3XqOg`@`^>N1Wy)ld`qWP0vvbNk|SR#5~ zn`0-#39WtN0w)+twC|a-1Tlm>s&!IezA#5-zF3f**~!Nqg&RAwdv5*S-Fvn7^YME% zaodxZ&AmLAdC8oO&A}b+^&iDGD!2W=@J|{NHNQ;0-&Ju?z4xQLnIX%3*+yUMNsIvs z`LF7^u6VE*Un;uuoF z_;$8+hKQrY@$_pdtwJWp*xfpw9q`goS$in<%CRtQc?G2iRvo2?n=BhQY!GwN(b>9b z!-XT-O%s&3j-5Il`{?nScZ=Lq*6%K4Gb)<5eS7uvyZQSj{x{ofzWYqg{rB77yg7G= ztC5$*fq@+KPn~I!g=D1U$(S&w7=ypB&b`l{uXE?(?p>$ehMi3Ho56;`r2` zk9wKkA1%5SIFU=EpQqPT^3E!MFZJs6^@|ETuUk$IkUJSOG3eg9es7Jh4)HS2|F80X z=sv+|_CnuRD(=$!UW)qD`cvP%s=CyD@YqF>eU=(ecP5qnH>-||QeDX~_v*B?&K;8k zxaw_B+)G%Sx#w)ri!FU24f~GUaB)wGauTUodgV*s$@B4t9{H}C7t-)!XF=%wm+6O^ zmQNDkjPJNKE5cS@5tpf zv%P%yT|q=brj6{;*8Rn+KA7pOTk?7?hk<8+_XCdm1qEsiK}_L4&ann~Jm8t%+F+tu z(0<;{K}x8m;k=i_B%zwd^L`FOLN!h2gATZ<{9v2Ew!u&32gm%a4P`1XR`%YkfA-mz z`St91EIKn^vYs-Jxm_Oe@{6mEmPN76IqBlnWfq6c3pa}=G`$I7D*thhEQ=+x4m z{iezXYb;jSd)FpCHWF`Lb?w}X`&H(5drJh&R@$8JTIZ})eB;geQ-@Z^#I2cG%NK2F zUJApQ{n{v`>V6nj9>FVdQ&MBb@08(hx AI{*Lx diff --git a/ALCameraViewController/CameraViewAssets.xcassets/libraryConfirm.imageset/Contents.json b/ALCameraViewController/CameraViewAssets.xcassets/libraryConfirm.imageset/Contents.json index 064ab6a6..3a092e5c 100644 --- a/ALCameraViewController/CameraViewAssets.xcassets/libraryConfirm.imageset/Contents.json +++ b/ALCameraViewController/CameraViewAssets.xcassets/libraryConfirm.imageset/Contents.json @@ -2,18 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "libraryConfirm.png" - }, - { - "idiom" : "universal", - "scale" : "2x", - "filename" : "libraryConfirm@2x.png" - }, - { - "idiom" : "universal", - "scale" : "3x", - "filename" : "libraryConfirm@3x.png" + "filename" : "libraryConfirm.pdf" } ], "info" : { diff --git a/ALCameraViewController/CameraViewAssets.xcassets/libraryConfirm.imageset/libraryConfirm.pdf b/ALCameraViewController/CameraViewAssets.xcassets/libraryConfirm.imageset/libraryConfirm.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fcf9f34883dbbadfd800720cb39f2b7c65a68b7b GIT binary patch literal 4038 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 Ld3gg9L-79rD0av8 literal 0 HcmV?d00001 diff --git a/ALCameraViewController/CameraViewAssets.xcassets/libraryConfirm.imageset/libraryConfirm.png b/ALCameraViewController/CameraViewAssets.xcassets/libraryConfirm.imageset/libraryConfirm.png deleted file mode 100644 index b428110036cff7deede7247a9b2eb4f52d2c12a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 591 zcmV-V0Px%2}wjjR9Fe^Qom~yQ4pS)y&roL5EN3SP$6LBkv*@m(Ljip^)x7gphYA_Ql|<2 z2kERtgml^{$OXAZ?p4=ncG9p}$tcNb>gyqWKt`DOsJ zCsQC(AXDHUD}aBBKZy3LMEU0kd`2rh7uQPf)3|bJ&R_Kfje{#hxu$e?8UO)_76tR~ z6c9woRU$7E@)6Sr%g4a4T}_eeViwt^6L719UX-!+zu@*I7VyqrD6{ zZ;JpwU5?r-COGYpxO?Q$8$>9Wdztxnt@wT%7M*kd8OK=wAYQP6NcgxC9X+vUYo)LU zvgNO2j(OvgZELgEcjH>IZe#jcX8}s96=vSG07S4+ dOo9JOfgcmlnb#&+`B4A>002ovPDHLkV1kt95cvQA diff --git a/ALCameraViewController/CameraViewAssets.xcassets/libraryConfirm.imageset/libraryConfirm@2x.png b/ALCameraViewController/CameraViewAssets.xcassets/libraryConfirm.imageset/libraryConfirm@2x.png deleted file mode 100644 index 377d7cd24c69683ccb88c5d274b965b87300cbbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1241 zcmV;~1Sb25P)Px(lSxEDRCodHnSW>;MHI(pX76XNu_bMdNKsU<;7RK31@s@Ojno4so;be6!*zV~M4eLwqVc8(AtFG)ZWkOU+FNk9^i1SA1TKoXDyBmqf45|9KW zfptZIhLh7iHyKkmo!6@Gw&dkt=Z4Pr2qiD0fDjP!3zXs2T*80OX-?}7K-V{ahP+!l z(wO+JYOz3I)+`qvJ(JipS8ZRZ%~lF%CI9x+U+vy49mi_L^BgIm_j+mDfYW?EPCKks z{A1tGZBo3UW0aD|MLAGr1w}rQeO&+uC;#qH0)e0K&8s3IxDOOa2}VVJk-g;sM6`vi zjQGZ}#JfZyQ2Y{Zg8OoP!AqhTk-en>gfoSE81YU}N*@sk03fDiSqCJ3bu+hnMh!5YlR0%JBYwyu_}fJmlzze3n?6#t+odwlbY_~!fZ&5w&> z>an*RfT*TFgda67{yvcazTsI=j^`7>lcJb%ma7Eyl`f2|B;_f*_BC5l;% z-SHBLg!%`Ti|13*H=|?br%sblN6o0>A;;~+W7%I>vS3%E#q(Sp15g+U*C&?K>)m7K zXPiboAXIJf3966@jO`G`^B*~Q$a(5?!hcp2 z&fBV1?4d+SW7)UW`ffhMg_3UdOzjO`ylHEE%l0jarpv|r?|=m#iu~M;pRyOD?fpl{ z$j|>fYpA389!8anop>z!8Qm!FY_|A+^RyGOlCL{sj1WfOwTr___(3nsyf8f+HdRgU zqlA5n;{BpN7=MlwOHXHqLVt*28fjnE5~xlfnlTPiMn9;w)wWTThP%dLg!L6p=&kiv zo-yvsl5Re8da(U!#n$Y*YXCgKXhwg7GWM~nWC8L8-PnD8@UH8w#&OtrReM0~9NBo_ z6Z~QF+6rHX+HU_nW53@^#$wOy7S9uCNCi}ssG4~I*Y_bD)XBJ~=3$|CCbs!TWt`i2 zZ%74H63)eZUtoJb9$T%7&GruDL~&t$&svG+xiu63A28eN`00000NkvXXu0mjf DK&4mx diff --git a/ALCameraViewController/CameraViewAssets.xcassets/libraryConfirm.imageset/libraryConfirm@3x.png b/ALCameraViewController/CameraViewAssets.xcassets/libraryConfirm.imageset/libraryConfirm@3x.png deleted file mode 100644 index a7f0959b27460ef09efe3c1f2ce90e1ddf127d1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1909 zcmb7_`9Bkk1IM?g-QJx_CGa#VPpHIMI4-=Ci!KA-pN^ZNV&?`$_0ds)a42mk<(b#y>_>@nzn zk@{(`|13!`+XFDx!`=o!A5vQa0Kf*0NNcY|ps*}5%FFf;5%;~jIoeU_4T20mfs~ix z|9%;Mr3cOmh}5*cAz#zyU_+7+9TT@?XMf8_%94q8p!-yBC)CohDz{W@yPh8~DXi8a z$}@~Q)%H)4c$#(D|Wqwv&{)13+36c$_Fv05}NW z_g@G6nLM@O-C)GCizTSo@KgJT#~FuNiOP#oX?GMDhXA>_oZotqc5^E~ii10{RhT{wdZi}r8Nk?07pl=MA&K_d@FvjL<4;OR!YvfgXw+)!V&$M1u^ zo4vIUGHDH?0}4mOcJM$ERBK-5Z+@}uCv5*b6Qq1LDWO-TOHaA#wME}+R{|Z@rCM6K znD*>E5#>A`;AP*IMFedlZq#>aRx7%i?oI=n+wYU7Iy2@JjU7mE-V*9+*9p*rJKPE%E4kL z1Iy3u%sztoWP6|>o?T{gdHC08@f35noky5HT!S`dJcE3eYmQEIay^q!BkNtTvccnnfr`K*qA zs-$t-Xk7ngMhi_0Xr)|7>qC~bPm~wRm5hyC3NleT0~86g{52<&CTNB!kH$7wSr}u+ z$ymS_u|?>gy5h>Qp=xb&DTwVmu;XVXUp7brj$hwX#C%bQQkkB*Go196T7UKz3)_c}+e#E8x zl1kH2a;8?C&Wp--vzyE5EEYm06Q3Biyq)As?@x|6uLGed#FKX{U9Ui_aMh)t7(B)k zY+y3pgEedxvhKhy=oFPtc4g!u#vXGM)l$#9K5=o&yH~ghWCg@4Ps@*v`S~eIb-84q ztW`}Sz4d->`+*@9t!$IvQ97zAwS99QHJDw?+lNE<7j5p3W&2Pj+_<{bN9^`cITe|& zfkY#9F%N2?=@UbncGa}2alzJdMTpf>WYb@3xV(YvG_aB=nDg@k8pt^ zHdJo&q6QYmk@l5b2IBD@^)G#{J4AF@>60tDivco$H0a$kgSqwKZ`+vxOa6p@_xWrx zWezzA-6Bt-JSlK8_LPg zU&1^;i%4cfUq&lr9~vlF56ZEv8aIUb#hg}#%Js#;T_aR6b`5hK)D5G#k6dTm8WZ@OWQ++O}oAty;5ng4;piKo&LK?B^R%Z=D5N>9jvnyFiz8fE$ z5I?Ugw^#$X-TW3>W0pVZWs7FgBNLOtV*!LP!|%qk zXi3;;;0xHj6{d|}u7B_i%Zcm84=F_n@Y>*1a=25_TSJE0jRSfFFo$4{#+cUDF~PTq z%7AlA z3W25^;ukEit)+WZ#H=4y17+kw!BxEKZtzB{ICAFd*+`4!$Km4Si5F wZp48#HNp`J@46UAa&7;!X#Ov!0-l5z+-VLSeA|n?w&ziRqpb^)ZWEOLFF^2hL;wH) diff --git a/ALCameraViewController/CameraViewAssets.xcassets/retakeButton.imageset/Contents.json b/ALCameraViewController/CameraViewAssets.xcassets/retakeButton.imageset/Contents.json index dbd696ed..c6040a9c 100644 --- a/ALCameraViewController/CameraViewAssets.xcassets/retakeButton.imageset/Contents.json +++ b/ALCameraViewController/CameraViewAssets.xcassets/retakeButton.imageset/Contents.json @@ -2,18 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "retakeButton.png" - }, - { - "idiom" : "universal", - "scale" : "2x", - "filename" : "retakeButton@2x.png" - }, - { - "idiom" : "universal", - "scale" : "3x", - "filename" : "retakeButton@3x.png" + "filename" : "retakeButton.pdf" } ], "info" : { diff --git a/ALCameraViewController/CameraViewAssets.xcassets/retakeButton.imageset/retakeButton.pdf b/ALCameraViewController/CameraViewAssets.xcassets/retakeButton.imageset/retakeButton.pdf new file mode 100644 index 0000000000000000000000000000000000000000..88b8b0e413a22e4c8329031ece7ae433eb8d9f2e GIT binary patch literal 4071 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 literal 0 HcmV?d00001 diff --git a/ALCameraViewController/CameraViewAssets.xcassets/retakeButton.imageset/retakeButton.png b/ALCameraViewController/CameraViewAssets.xcassets/retakeButton.imageset/retakeButton.png deleted file mode 100644 index c46c955c836283fd7bdf4bd5710df2160666409d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1124 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 diff --git a/ALCameraViewController/CameraViewAssets.xcassets/retakeButton.imageset/retakeButton@3x.png b/ALCameraViewController/CameraViewAssets.xcassets/retakeButton.imageset/retakeButton@3x.png deleted file mode 100644 index 391c76707d5e97685a5c59d26e139ed0aff5780f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4010 zcmV;b4^{AqP)Px^WJyFpRCodHU2SX}#TlO2Gx0}ahn$s<21+h=RkxLZ76cU^qCTS{KH4Hx{GdMw zg@Q_uC@p~^N<^s&stQe2LQ8%CErk9+YE-oXN=1w9MkGi5w;6y`9h>tEiH`&^< zqSs)o56Ve%&b|_`?3QIG8T)_>*)JIDpP8K>{QTP=XO=w>l8aCg0wic%+17lclyVCQ za1CQTp{AT=PD=I$=Y02P({q0ZIcC(vS&AwQgy1LBsjCdb*a8CF1i&4o#ZWf}mSYmW z%N`-b?zID>dw~>D>IP*AaillZ(w^WyFc{wkB5YPygf5UtIVzakF(u@4n+Hc{UA!6C zqskFttat6ICf>1Ca(N$2?uNi55nx8B@=kEccVy+{u62VaPY0NF)vS~u#L+9yTeGUU z=^g;O7ZxE|6?r5ckQvk;Po192KE3I!4^OF3Bozq3GwJR-nIV4_A0ia1US^o!5A7Tn ze(q6pcog3a^17jfIN7)9B7-HKLDlf}APcQ(UZ_eA2$tKrw*Tn6jl$RvLS!!PTFqAT z#~7D)!z!RFL5C#?NC6wM3vH8!lLtp8mg0js3!D(+y{T)NVY~pVus)a~hBFt_@nrnA zWdHE%L6#seLJah>rVEX(U!rgiqDwije1jCG=Xrq@a44QQEJn7c2U*th^lcIhL^0#N z=bX!o=9j^PD{L_6s45ZwFZMApcXQ|9Cm&aNwC>x!6C#uDx}F()H;{JLjW*s1j58r` zO%9B_=BF5Zb?Cc$pMa-uzkRkkwjK#! z;A}@{|L_Ay!}Dn=39|A@Eiw)k}uf?5** zq8-TEbm`q&oZSLlJXvpobrFKv#JXu&uL`_-AG+9vsRYy$>U4s=syTQ4 zqW2Pjmx-0rE!;5vq5TH8Vs6m$$g`F$u~Nexj#2wLC^&uxyfFm%~S0(^5`*UP0*LWulo zZ_6LjSJ9M!ovxRe3|a@Wt*!YuBGq5|@2nM!{kx4*1NYeM&xL800zQBm$OWzgEuE8A9#!P!uBxnRf#f~WsJ5_oYqbKpPh^v}_k7PP5eAj4Ug zexn!?lc>@@{niD+V=6&XDMIExo1R~1tfZDr%*{s%MBb~--xPx;MTE&fin2Jc;6q5XjY1fL zB1Oc>kk@>k112HhNc4n|4tdCalOh&mK!*ckUnGHY+RAW6D?1TdLRi54P@ErWT6h&a z&d;#*2JLI9AU5}qytWiEBLfMXxM1WrIdw08CExIh6fq65qsAA)wgjZmnU6fq@3 zo&g3CLZ%`_hkQ|LB}J^sK%$c=YGtTD878l0cYocIBKBl3#oNKhukPNDCdXy&q#dHC zohbU9y=H;Vx&+fn%Y=pvub08&M>J+oz0EUMcO63O^L#%tP$o?Wq^N{74rIueUmiBl zXW3p!7?HT=p!z6R&iIf45&#$Q2?mcoAxPUbkRn!OAQ^!Rq~N1y zc8VcO9+5cKN(QU&u_lEWGIE?nhYL2TVe6CI_sthvpa*87zTBoD>!ZOhROZ2p1uOCPNHJVR67D1g#5zI^+YZ z+)5uCMFvYK5wsMfd*T2Ualwax7a?T7Rc4ist#|&E(YQjn5XiJQhom5^VF-n~UnGQJ zOnpLNQPAcaZZ0e1K*(U_?tl~~R$9nZ@ldGyMYJ=s^Mh!B=9I=x%Mmt}E=fq310{nc zq-vxftTsz1TCb~dl)1d_^Jo?cLF*J^AJ{k409ghF6mVwWze{d5gbWsn3ZyWx;=am( zbZ)ItNjMh?K^NFZVK*IB4%5He&gS?2(_9o(&dsvfzrN7;+0hH6AS{H57Az%J$1U(>_+_ChC zK8vCR7IeIf3{*}#La-?zpQEk(q9_PmCj7@kx1?h`S=bVS_H*QtYb#+Vu?WPGZteE$ zq@vjpf^KBxB(|xM89LV?N)o_U&!%qe%T$&Sv^O*=n5XPt)3ITd0D2~OmfQE6%2bvR zbo2CF_GxV;ND@&AGIM%9yR%YhDiUJTTOXccf)Cg3W{kL#soFP)Y#0b3z6xn&~k1(SdX}A%){{c*lfD9vqqAjNeAx zT;UT-Oc6s@q%(9ved<&KjtM~tCi{n9$KY-__8xR9fe1fGx+0yqDWWSvP{N1B$aWBK zpPNkdv%yP%bVRyxo3o=894=)=UV> zu(SWjZ@@=AOkS(>J${dLksKI)vYupX@*#>c#FV@47qI~9Ek*JAGDrzX`DaXt+k!0X z>K3TWLM)V5zAuJvN7d!3c@w0pqMjGY{(UiWTfJl;IeB3rOnD!>cw<}h>ehd8&Mr42 z^q)W^fNEm@+{DZ`Hy%7T?L~%OSO^mb0U}`9Qh1>jXK9eEy(9zW>KP#@F(SnwG4dVM zVlUCP4n9f%J_E_xE6ZRZ^{mRU5?na)@xJaSQGIMHir1GONC3_K-*&z^azB!)%Yn3m z;uj&zyfW$T2N;*Xrmu+YGS_h~C4f4Dnf(m)H7zUU>bs&c>8=}?!CwRj-OXJ|6V>mH zQx9Z4ole!W@UWFpDKi@TU`F%HFceo*dQRW7mjDdIK9-&RUaj5H_Nm&(dg@f#XOSQK zfCJPkB&rWGdpbCi0AxinBiRK(1_I@Kl~G)B^lDy*ittac7VC@e>FXs4fD0#Ra*Nyf z3`;50b{2?*D1=4@p85#0l{)xolc1LLr#HPh{8fp!JqCQxr_<+!+3uoW`09^7s;ZLWFXx%)It=J z~NyQ+zIY?WMYi>l*k zI*j-vpT5Gb^x>@~lOT`E5yC3`k=|5GyTR|kK9buav%C?O@u8JlXt9oR>oZv8Z`4s) zLKFyupG>E&G7JNgKln`m+);2(`BQYdOu|3fLkoPZ9T?pUz)JVSgnLIg+g{D|*pP>XQcV zLqWb=ct7ZK{M&y(tIDHerJvT0E?h1+Xe{;Q7g|CT7kaEWwV}x{(vtBstnvjYSPy&; ze>RrGhGifCb~EIMXeS!le8k#sq8L}$t|LPTJHa2nynCI|DtZzU - @@ -34,6 +33,11 @@ + @@ -66,11 +70,6 @@ - @@ -94,10 +93,10 @@ - + - + - + diff --git a/ALCameraViewController/ViewController/CropViewController.swift b/ALCameraViewController/ViewController/CropViewController.swift index 126dbc67..821c445d 100644 --- a/ALCameraViewController/ViewController/CropViewController.swift +++ b/ALCameraViewController/ViewController/CropViewController.swift @@ -60,7 +60,7 @@ public class CropViewController: UIViewController, UIScrollViewDelegate { public override func viewDidLoad() { super.viewDidLoad() - view.backgroundColor = UIColor.black + self.navigationController?.isNavigationBarHidden = true scrollView.addSubview(imageView) scrollView.delegate = self From 9cba4df7715c6b5e7179bb7a330b3b9c5ab28aa2 Mon Sep 17 00:00:00 2001 From: Wallace Wu Date: Tue, 29 Aug 2017 17:42:50 -0400 Subject: [PATCH 12/24] update UI for cropping --- .../anchorButton.imageset/Contents.json | 12 +++++ .../anchorButton.imageset/anchorButton.pdf | Bin 0 -> 4177 bytes .../ViewController/ConfirmViewController.xib | 6 --- .../ViewController/CropViewController.xib | 19 +++---- .../Views/OverlayView.swift | 51 ++++++++++-------- 5 files changed, 47 insertions(+), 41 deletions(-) create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/anchorButton.imageset/Contents.json create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/anchorButton.imageset/anchorButton.pdf diff --git a/ALCameraViewController/CameraViewAssets.xcassets/anchorButton.imageset/Contents.json b/ALCameraViewController/CameraViewAssets.xcassets/anchorButton.imageset/Contents.json new file mode 100644 index 00000000..414f8fb3 --- /dev/null +++ b/ALCameraViewController/CameraViewAssets.xcassets/anchorButton.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "anchorButton.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ALCameraViewController/CameraViewAssets.xcassets/anchorButton.imageset/anchorButton.pdf b/ALCameraViewController/CameraViewAssets.xcassets/anchorButton.imageset/anchorButton.pdf new file mode 100644 index 0000000000000000000000000000000000000000..873f2f7b986389ab8b965985a2f3977617f413f2 GIT binary patch literal 4177 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 - - - - - + + + + @@ -134,18 +128,17 @@ + + - - - diff --git a/ALCameraViewController/Views/OverlayView.swift b/ALCameraViewController/Views/OverlayView.swift index a5c3e6e5..6cb904f0 100644 --- a/ALCameraViewController/Views/OverlayView.swift +++ b/ALCameraViewController/Views/OverlayView.swift @@ -12,32 +12,27 @@ import UIKit.UIGestureRecognizerSubclass class OverlayView: UIView { lazy var topLeftButton: UIView = { - let btn = UIView() - btn.backgroundColor = UIColor.blue - btn.bounds = CGRect(origin: CGPoint.zero, size: CGSize(width: 10, height: 10)) + let btn = UIImageView(image: #imageLiteral(resourceName: "anchorButton")) + btn.bounds = CGRect(origin: CGPoint.zero, size: CGSize(width: 28, height: 28)) return btn }() lazy var topRightButton: UIView = { - let btn = UIView() - btn.backgroundColor = UIColor.blue - btn.bounds = CGRect(origin: CGPoint.zero, size: CGSize(width: 10, height: 10)) + let btn = UIImageView(image: #imageLiteral(resourceName: "anchorButton")) + btn.bounds = CGRect(origin: CGPoint.zero, size: CGSize(width: 28, height: 28)) return btn }() lazy var bottomLeftButton: UIView = { - let btn = UIView() - btn.backgroundColor = UIColor.blue - btn.bounds = CGRect(origin: CGPoint.zero, size: CGSize(width: 10, height: 10)) + let btn = UIImageView(image: #imageLiteral(resourceName: "anchorButton")) + btn.bounds = CGRect(origin: CGPoint.zero, size: CGSize(width: 28, height: 28)) return btn }() lazy var bottomRightButton: UIView = { - let btn = UIView() - btn.backgroundColor = UIColor.blue - btn.bounds = CGRect(origin: CGPoint.zero, size: CGSize(width: 10, height: 10)) - btn.isUserInteractionEnabled = true + let btn = UIImageView(image: #imageLiteral(resourceName: "anchorButton")) + btn.bounds = CGRect(origin: CGPoint.zero, size: CGSize(width: 28, height: 28)) return btn }() @@ -45,11 +40,15 @@ class OverlayView: UIView { override init(frame: CGRect) { super.init(frame: frame) setupButtons() + + self.backgroundColor = #colorLiteral(red: 0.1803921569, green: 0.2039215686, blue: 0.2392156863, alpha: 0.5) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) setupButtons() + + self.backgroundColor = #colorLiteral(red: 0.1803921569, green: 0.2039215686, blue: 0.2392156863, alpha: 0.5) } override func layoutSubviews() { @@ -131,27 +130,35 @@ class OverlayView: UIView { } override func draw(_ rect: CGRect) { - super.draw(rect) + self.backgroundColor?.setFill() + UIRectFillUsingBlendMode(rect, .hardLight) // connect buttons via straight lines - - let lineWidth:CGFloat = 3.0 - let path = UIBezierPath() - path.lineWidth = lineWidth - path.move(to: topLeftButton.center) path.addLine(to: topRightButton.center) path.addLine(to: bottomRightButton.center) path.addLine(to: bottomLeftButton.center) + path.close() + + let context = UIGraphicsGetCurrentContext()! - //set the stroke color - #colorLiteral(red: 0, green: 0.9810667634, blue: 0.5736914277, alpha: 0.3).setFill() + context.saveGState() + context.setBlendMode(.destinationOut) - //draw the stroke + //set fill color + UIColor.white.setFill() + //draw the fill and stroke path.fill() + context.restoreGState() + + let lineWidth:CGFloat = 1.5 + path.lineWidth = lineWidth + UIColor.white.setStroke() + path.stroke() + } func parentPan(_ sender: UIPanViewGestureRecognizer) { From ccafae256450d1d8e1f1d77d7a1a5752485e798f Mon Sep 17 00:00:00 2001 From: Wallace Wu Date: Wed, 30 Aug 2017 16:27:59 -0400 Subject: [PATCH 13/24] Autolayout for different devices --- .../ViewController/CameraViewController.xib | 77 +++++++++++++----- .../ViewController/ConfirmViewController.xib | 21 ++--- .../ViewController/CropViewController.swift | 5 +- .../ViewController/CropViewController.xib | 81 +++++++------------ 4 files changed, 100 insertions(+), 84 deletions(-) diff --git a/ALCameraViewController/ViewController/CameraViewController.xib b/ALCameraViewController/ViewController/CameraViewController.xib index 385de714..98d8e706 100644 --- a/ALCameraViewController/ViewController/CameraViewController.xib +++ b/ALCameraViewController/ViewController/CameraViewController.xib @@ -1,6 +1,6 @@ - + @@ -22,66 +22,99 @@ - + - - + + - - + + + + + + - + - + - - + + - - - + + + + + + + + + + + + diff --git a/ALCameraViewController/ViewController/ConfirmViewController.xib b/ALCameraViewController/ViewController/ConfirmViewController.xib index 8e14c3ce..d8c6f76e 100644 --- a/ALCameraViewController/ViewController/ConfirmViewController.xib +++ b/ALCameraViewController/ViewController/ConfirmViewController.xib @@ -1,6 +1,6 @@ - + @@ -18,15 +18,14 @@ - + - + - + + - + - + - + - + - + - + @@ -57,17 +57,17 @@ - + - + - + - + @@ -109,16 +109,17 @@ - + - + + From 1c499bd063069cf9c7f38def4c5dfd1d0e7e225c Mon Sep 17 00:00:00 2001 From: Wallace Wu Date: Fri, 1 Sep 2017 14:56:10 -0400 Subject: [PATCH 15/24] fix image loading crash --- ALCameraViewController/Views/OverlayView.swift | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/ALCameraViewController/Views/OverlayView.swift b/ALCameraViewController/Views/OverlayView.swift index 6cb904f0..fae57bff 100644 --- a/ALCameraViewController/Views/OverlayView.swift +++ b/ALCameraViewController/Views/OverlayView.swift @@ -12,26 +12,34 @@ import UIKit.UIGestureRecognizerSubclass class OverlayView: UIView { lazy var topLeftButton: UIView = { - let btn = UIImageView(image: #imageLiteral(resourceName: "anchorButton")) + let btn = UIImageView(image: UIImage(named: "anchorButton", + in: CameraGlobals.shared.bundle, + compatibleWith: nil)) btn.bounds = CGRect(origin: CGPoint.zero, size: CGSize(width: 28, height: 28)) return btn }() lazy var topRightButton: UIView = { - let btn = UIImageView(image: #imageLiteral(resourceName: "anchorButton")) + let btn = UIImageView(image: UIImage(named: "anchorButton", + in: CameraGlobals.shared.bundle, + compatibleWith: nil)) btn.bounds = CGRect(origin: CGPoint.zero, size: CGSize(width: 28, height: 28)) return btn }() lazy var bottomLeftButton: UIView = { - let btn = UIImageView(image: #imageLiteral(resourceName: "anchorButton")) + let btn = UIImageView(image: UIImage(named: "anchorButton", + in: CameraGlobals.shared.bundle, + compatibleWith: nil)) btn.bounds = CGRect(origin: CGPoint.zero, size: CGSize(width: 28, height: 28)) return btn }() lazy var bottomRightButton: UIView = { - let btn = UIImageView(image: #imageLiteral(resourceName: "anchorButton")) + let btn = UIImageView(image: UIImage(named: "anchorButton", + in: CameraGlobals.shared.bundle, + compatibleWith: nil)) btn.bounds = CGRect(origin: CGPoint.zero, size: CGSize(width: 28, height: 28)) return btn }() From 6a997dc66df9a7d9f68326301023de207a6e5917 Mon Sep 17 00:00:00 2001 From: vinxcentzhang Date: Thu, 7 Sep 2017 16:53:18 +0800 Subject: [PATCH 16/24] FIX - Add Chinese translation. --- .../project.pbxproj | 50 +++++-- .../{ => en.lproj}/ConfirmViewController.xib | 0 .../{ => en.lproj}/CropViewController.xib | 0 .../ConfirmViewController.strings | 9 ++ .../zh-Hans.lproj/CropViewController.xib | 123 ++++++++++++++++++ 5 files changed, 170 insertions(+), 12 deletions(-) rename ALCameraViewController/ViewController/{ => en.lproj}/ConfirmViewController.xib (100%) rename ALCameraViewController/ViewController/{ => en.lproj}/CropViewController.xib (100%) create mode 100644 ALCameraViewController/ViewController/zh-Hans.lproj/ConfirmViewController.strings create mode 100644 ALCameraViewController/ViewController/zh-Hans.lproj/CropViewController.xib diff --git a/ALCameraViewController.xcodeproj/project.pbxproj b/ALCameraViewController.xcodeproj/project.pbxproj index 4980d631..c532bf3d 100644 --- a/ALCameraViewController.xcodeproj/project.pbxproj +++ b/ALCameraViewController.xcodeproj/project.pbxproj @@ -7,12 +7,14 @@ objects = { /* Begin PBXBuildFile section */ + BF5861F31F613FB800B406F6 /* CropViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BF5861F61F613FB800B406F6 /* CropViewController.xib */; }; + BF5861F41F613FB800B406F6 /* CropViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BF5861F61F613FB800B406F6 /* CropViewController.xib */; }; + BF5861F81F61404C00B406F6 /* ConfirmViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BF5861FB1F61404C00B406F6 /* ConfirmViewController.xib */; }; + BF5861F91F61404C00B406F6 /* ConfirmViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BF5861FB1F61404C00B406F6 /* ConfirmViewController.xib */; }; C40665441C73A47C00EB9751 /* SingleImageSaver.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40665431C73A47C00EB9751 /* SingleImageSaver.swift */; }; C40665461C73A94100EB9751 /* CameraGlobals.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40665451C73A94100EB9751 /* CameraGlobals.swift */; }; C40665481C73B72D00EB9751 /* SingleImageFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40665471C73B72D00EB9751 /* SingleImageFetcher.swift */; }; C44543211CA68DDE00644380 /* VolumeControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = C44543201CA68DDE00644380 /* VolumeControl.swift */; }; - C4768C001CAF2EA100A084F8 /* CropViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C4768BFF1CAF2EA100A084F8 /* CropViewController.xib */; }; - C4768C011CAF2EAA00A084F8 /* CropViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C4768BFF1CAF2EA100A084F8 /* CropViewController.xib */; }; C482A0031CAEB18D00541D08 /* ImageFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAB50BF01B413E8C009905B9 /* ImageFetcher.swift */; }; C482A0041CAEB18D00541D08 /* SingleImageSaver.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40665431C73A47C00EB9751 /* SingleImageSaver.swift */; }; C482A0051CAEB18D00541D08 /* SingleImageFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40665471C73B72D00EB9751 /* SingleImageFetcher.swift */; }; @@ -51,8 +53,6 @@ E35A240D1F509FFC001047FD /* CGPointExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35A240B1F509FFC001047FD /* CGPointExtensions.swift */; }; E35A240F1F50B49A001047FD /* ConfirmViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35A240E1F50B49A001047FD /* ConfirmViewController.swift */; }; E35A24101F50B49A001047FD /* ConfirmViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35A240E1F50B49A001047FD /* ConfirmViewController.swift */; }; - E35A24121F50B4A7001047FD /* ConfirmViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35A24111F50B4A7001047FD /* ConfirmViewController.xib */; }; - E35A24131F50B4A7001047FD /* ConfirmViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35A24111F50B4A7001047FD /* ConfirmViewController.xib */; }; EBFE097D1CAF1D1A00A8C637 /* UIViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBFE097C1CAF1D1A00A8C637 /* UIViewExtensions.swift */; }; FA52EE0B1B44129B00E16B6F /* ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = FA52EE0A1B44129B00E16B6F /* ViewController.xib */; }; FA5FA3431B3AFA2B00497C62 /* PermissionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA5FA3421B3AFA2B00497C62 /* PermissionsView.swift */; }; @@ -74,11 +74,14 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + BF5861F51F613FB800B406F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/CropViewController.xib; sourceTree = ""; }; + BF5861F71F613FC500B406F6 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "zh-Hans"; path = "zh-Hans.lproj/CropViewController.xib"; sourceTree = ""; }; + BF5861FA1F61404C00B406F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/ConfirmViewController.xib; sourceTree = ""; }; + BF5861FD1F61405000B406F6 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/ConfirmViewController.strings"; sourceTree = ""; }; C40665431C73A47C00EB9751 /* SingleImageSaver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleImageSaver.swift; sourceTree = ""; }; C40665451C73A94100EB9751 /* CameraGlobals.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CameraGlobals.swift; sourceTree = ""; }; C40665471C73B72D00EB9751 /* SingleImageFetcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleImageFetcher.swift; sourceTree = ""; }; C44543201CA68DDE00644380 /* VolumeControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VolumeControl.swift; sourceTree = ""; }; - C4768BFF1CAF2EA100A084F8 /* CropViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CropViewController.xib; sourceTree = ""; }; C4829FFB1CAEB16C00541D08 /* CameraViewController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CameraViewController.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C4829FFD1CAEB16C00541D08 /* CameraViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CameraViewController.h; sourceTree = ""; }; C4829FFF1CAEB16C00541D08 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -94,7 +97,6 @@ E35A24081F509FBD001047FD /* CGRectExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CGRectExtensions.swift; sourceTree = ""; }; E35A240B1F509FFC001047FD /* CGPointExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CGPointExtensions.swift; sourceTree = ""; }; E35A240E1F50B49A001047FD /* ConfirmViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfirmViewController.swift; sourceTree = ""; }; - E35A24111F50B4A7001047FD /* ConfirmViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ConfirmViewController.xib; sourceTree = ""; }; EBFE097C1CAF1D1A00A8C637 /* UIViewExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIViewExtensions.swift; sourceTree = ""; }; FA52EE0A1B44129B00E16B6F /* ViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ViewController.xib; sourceTree = ""; }; FA5FA3421B3AFA2B00497C62 /* PermissionsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PermissionsView.swift; sourceTree = ""; }; @@ -152,9 +154,9 @@ FAF058651B316695008E5592 /* CameraViewController.swift */, E35A24011F4FE3A8001047FD /* CameraViewController.xib */, FA7E6B9A1B429012000E1B14 /* CropViewController.swift */, - C4768BFF1CAF2EA100A084F8 /* CropViewController.xib */, + BF5861F61F613FB800B406F6 /* CropViewController.xib */, E35A240E1F50B49A001047FD /* ConfirmViewController.swift */, - E35A24111F50B4A7001047FD /* ConfirmViewController.xib */, + BF5861FB1F61404C00B406F6 /* ConfirmViewController.xib */, ); path = ViewController; sourceTree = ""; @@ -327,6 +329,7 @@ knownRegions = ( en, Base, + "zh-Hans", ); mainGroup = FAF058361B31618D008E5592; productRefGroup = FAF058401B31618D008E5592 /* Products */; @@ -346,9 +349,9 @@ files = ( C482A0141CAEB1B100541D08 /* CameraView.strings in Resources */, E35A24031F4FE3AD001047FD /* CameraViewController.xib in Resources */, - E35A24131F50B4A7001047FD /* ConfirmViewController.xib in Resources */, + BF5861F91F61404C00B406F6 /* ConfirmViewController.xib in Resources */, C482A0151CAEB1B100541D08 /* CameraViewAssets.xcassets in Resources */, - C4768C011CAF2EAA00A084F8 /* CropViewController.xib in Resources */, + BF5861F41F613FB800B406F6 /* CropViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -362,8 +365,8 @@ FA5FA3451B3AFEB300497C62 /* CameraViewAssets.xcassets in Resources */, FAF0584C1B31618D008E5592 /* Images.xcassets in Resources */, FA778A411B8319D8005807E7 /* image.jpg in Resources */, - C4768C001CAF2EA100A084F8 /* CropViewController.xib in Resources */, - E35A24121F50B4A7001047FD /* ConfirmViewController.xib in Resources */, + BF5861F31F613FB800B406F6 /* CropViewController.xib in Resources */, + BF5861F81F61404C00B406F6 /* ConfirmViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -434,6 +437,27 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXVariantGroup section */ + BF5861F61F613FB800B406F6 /* CropViewController.xib */ = { + isa = PBXVariantGroup; + children = ( + BF5861F51F613FB800B406F6 /* en */, + BF5861F71F613FC500B406F6 /* zh-Hans */, + ); + name = CropViewController.xib; + sourceTree = ""; + }; + BF5861FB1F61404C00B406F6 /* ConfirmViewController.xib */ = { + isa = PBXVariantGroup; + children = ( + BF5861FA1F61404C00B406F6 /* en */, + BF5861FD1F61405000B406F6 /* zh-Hans */, + ); + name = ConfirmViewController.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + /* Begin XCBuildConfiguration section */ C482A0011CAEB16C00541D08 /* Debug */ = { isa = XCBuildConfiguration; @@ -489,6 +513,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -537,6 +562,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; diff --git a/ALCameraViewController/ViewController/ConfirmViewController.xib b/ALCameraViewController/ViewController/en.lproj/ConfirmViewController.xib similarity index 100% rename from ALCameraViewController/ViewController/ConfirmViewController.xib rename to ALCameraViewController/ViewController/en.lproj/ConfirmViewController.xib diff --git a/ALCameraViewController/ViewController/CropViewController.xib b/ALCameraViewController/ViewController/en.lproj/CropViewController.xib similarity index 100% rename from ALCameraViewController/ViewController/CropViewController.xib rename to ALCameraViewController/ViewController/en.lproj/CropViewController.xib diff --git a/ALCameraViewController/ViewController/zh-Hans.lproj/ConfirmViewController.strings b/ALCameraViewController/ViewController/zh-Hans.lproj/ConfirmViewController.strings new file mode 100644 index 00000000..d9764271 --- /dev/null +++ b/ALCameraViewController/ViewController/zh-Hans.lproj/ConfirmViewController.strings @@ -0,0 +1,9 @@ + +/* Class = "UIButton"; normalTitle = "Back"; ObjectID = "Cqb-xM-psR"; */ +"Cqb-xM-psR.normalTitle" = "后退"; + +/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "Qmn-Qj-BLU"; */ +"Qmn-Qj-BLU.normalTitle" = "完成"; + +/* Class = "UILabel"; text = "Confirm"; ObjectID = "l6r-RK-gpT"; */ +"l6r-RK-gpT.text" = "确认"; diff --git a/ALCameraViewController/ViewController/zh-Hans.lproj/CropViewController.xib b/ALCameraViewController/ViewController/zh-Hans.lproj/CropViewController.xib new file mode 100644 index 00000000..8ddc69ba --- /dev/null +++ b/ALCameraViewController/ViewController/zh-Hans.lproj/CropViewController.xib @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 082b200cf8df61d10304a9810880cfd1175830b9 Mon Sep 17 00:00:00 2001 From: vinxcentzhang Date: Fri, 8 Sep 2017 17:06:54 +0800 Subject: [PATCH 17/24] Localization - Add the missing translation. --- .../project.pbxproj | 26 ++++-- .../ViewController/CropViewController.swift | 5 +- .../ConfirmViewController.strings | 9 -- .../zh-Hans.lproj/ConfirmViewController.xib | 88 +++++++++++++++++++ .../{ => en.lproj}/CameraView.strings | 6 +- .../zh-Hans.lproj/CameraView.strings | 20 +++++ 6 files changed, 133 insertions(+), 21 deletions(-) delete mode 100644 ALCameraViewController/ViewController/zh-Hans.lproj/ConfirmViewController.strings create mode 100644 ALCameraViewController/ViewController/zh-Hans.lproj/ConfirmViewController.xib rename ALCameraViewController/{ => en.lproj}/CameraView.strings (87%) create mode 100644 ALCameraViewController/zh-Hans.lproj/CameraView.strings diff --git a/ALCameraViewController.xcodeproj/project.pbxproj b/ALCameraViewController.xcodeproj/project.pbxproj index c532bf3d..c8168201 100644 --- a/ALCameraViewController.xcodeproj/project.pbxproj +++ b/ALCameraViewController.xcodeproj/project.pbxproj @@ -11,6 +11,8 @@ BF5861F41F613FB800B406F6 /* CropViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BF5861F61F613FB800B406F6 /* CropViewController.xib */; }; BF5861F81F61404C00B406F6 /* ConfirmViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BF5861FB1F61404C00B406F6 /* ConfirmViewController.xib */; }; BF5861F91F61404C00B406F6 /* ConfirmViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BF5861FB1F61404C00B406F6 /* ConfirmViewController.xib */; }; + BF5861FE1F625D0F00B406F6 /* CameraView.strings in Resources */ = {isa = PBXBuildFile; fileRef = BF5862011F625D0F00B406F6 /* CameraView.strings */; }; + BF5861FF1F625D0F00B406F6 /* CameraView.strings in Resources */ = {isa = PBXBuildFile; fileRef = BF5862011F625D0F00B406F6 /* CameraView.strings */; }; C40665441C73A47C00EB9751 /* SingleImageSaver.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40665431C73A47C00EB9751 /* SingleImageSaver.swift */; }; C40665461C73A94100EB9751 /* CameraGlobals.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40665451C73A94100EB9751 /* CameraGlobals.swift */; }; C40665481C73B72D00EB9751 /* SingleImageFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = C40665471C73B72D00EB9751 /* SingleImageFetcher.swift */; }; @@ -31,7 +33,6 @@ C482A0101CAEB18D00541D08 /* PermissionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA5FA3421B3AFA2B00497C62 /* PermissionsView.swift */; }; C482A0111CAEB18D00541D08 /* CameraView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAF058671B3175C5008E5592 /* CameraView.swift */; }; C482A0121CAEB18D00541D08 /* CropOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA787F1B1B4326F100B6B86E /* CropOverlay.swift */; }; - C482A0141CAEB1B100541D08 /* CameraView.strings in Resources */ = {isa = PBXBuildFile; fileRef = FA8231371B3BF8F700A837BE /* CameraView.strings */; }; C482A0151CAEB1B100541D08 /* CameraViewAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FA5FA3441B3AFEB300497C62 /* CameraViewAssets.xcassets */; }; C484580B1D0AA44400ECDB15 /* UIViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBFE097C1CAF1D1A00A8C637 /* UIViewExtensions.swift */; }; C4D9BA451CA7224B004F70F7 /* PhotoLibraryAuthorizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D9BA441CA7224B004F70F7 /* PhotoLibraryAuthorizer.swift */; }; @@ -60,7 +61,6 @@ FA778A411B8319D8005807E7 /* image.jpg in Resources */ = {isa = PBXBuildFile; fileRef = FA778A401B8319D8005807E7 /* image.jpg */; }; FA787F1C1B4326F100B6B86E /* CropOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA787F1B1B4326F100B6B86E /* CropOverlay.swift */; }; FA7E6B9B1B429012000E1B14 /* CropViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA7E6B9A1B429012000E1B14 /* CropViewController.swift */; }; - FA8231381B3BF8F700A837BE /* CameraView.strings in Resources */ = {isa = PBXBuildFile; fileRef = FA8231371B3BF8F700A837BE /* CameraView.strings */; }; FA82313A1B3C296C00A837BE /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA8231391B3C296C00A837BE /* Utilities.swift */; }; FAB50BFB1B413E8C009905B9 /* ImageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAB50BEE1B413E8C009905B9 /* ImageCell.swift */; }; FAB50BFC1B413E8C009905B9 /* ImageFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAB50BF01B413E8C009905B9 /* ImageFetcher.swift */; }; @@ -74,10 +74,12 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + BF1EE87A1F628BF50009F5A6 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "zh-Hans"; path = "zh-Hans.lproj/ConfirmViewController.xib"; sourceTree = ""; }; BF5861F51F613FB800B406F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/CropViewController.xib; sourceTree = ""; }; BF5861F71F613FC500B406F6 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "zh-Hans"; path = "zh-Hans.lproj/CropViewController.xib"; sourceTree = ""; }; BF5861FA1F61404C00B406F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/ConfirmViewController.xib; sourceTree = ""; }; - BF5861FD1F61405000B406F6 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/ConfirmViewController.strings"; sourceTree = ""; }; + BF5862001F625D0F00B406F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/CameraView.strings; sourceTree = ""; }; + BF5862021F625D1200B406F6 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/CameraView.strings"; sourceTree = ""; }; C40665431C73A47C00EB9751 /* SingleImageSaver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleImageSaver.swift; sourceTree = ""; }; C40665451C73A94100EB9751 /* CameraGlobals.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CameraGlobals.swift; sourceTree = ""; }; C40665471C73B72D00EB9751 /* SingleImageFetcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleImageFetcher.swift; sourceTree = ""; }; @@ -104,7 +106,6 @@ FA778A401B8319D8005807E7 /* image.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = image.jpg; sourceTree = ""; }; FA787F1B1B4326F100B6B86E /* CropOverlay.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CropOverlay.swift; sourceTree = ""; }; FA7E6B9A1B429012000E1B14 /* CropViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CropViewController.swift; sourceTree = ""; }; - FA8231371B3BF8F700A837BE /* CameraView.strings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; path = CameraView.strings; sourceTree = ""; }; FA8231391B3C296C00A837BE /* Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; tabWidth = 4; }; FAB50BEE1B413E8C009905B9 /* ImageCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = ImageCell.swift; sourceTree = ""; tabWidth = 4; }; FAB50BF01B413E8C009905B9 /* ImageFetcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageFetcher.swift; sourceTree = ""; }; @@ -221,7 +222,7 @@ FAB50C021B4140AB009905B9 /* Utilities */, FAB50BEA1B413E41009905B9 /* ViewController */, FAB50BEB1B413E4E009905B9 /* Views */, - FA8231371B3BF8F700A837BE /* CameraView.strings */, + BF5862011F625D0F00B406F6 /* CameraView.strings */, FA5FA3441B3AFEB300497C62 /* CameraViewAssets.xcassets */, ); path = ALCameraViewController; @@ -347,7 +348,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - C482A0141CAEB1B100541D08 /* CameraView.strings in Resources */, + BF5861FF1F625D0F00B406F6 /* CameraView.strings in Resources */, E35A24031F4FE3AD001047FD /* CameraViewController.xib in Resources */, BF5861F91F61404C00B406F6 /* ConfirmViewController.xib in Resources */, C482A0151CAEB1B100541D08 /* CameraViewAssets.xcassets in Resources */, @@ -361,7 +362,7 @@ files = ( E35A24041F4FEB0B001047FD /* CameraViewController.xib in Resources */, FA52EE0B1B44129B00E16B6F /* ViewController.xib in Resources */, - FA8231381B3BF8F700A837BE /* CameraView.strings in Resources */, + BF5861FE1F625D0F00B406F6 /* CameraView.strings in Resources */, FA5FA3451B3AFEB300497C62 /* CameraViewAssets.xcassets in Resources */, FAF0584C1B31618D008E5592 /* Images.xcassets in Resources */, FA778A411B8319D8005807E7 /* image.jpg in Resources */, @@ -451,11 +452,20 @@ isa = PBXVariantGroup; children = ( BF5861FA1F61404C00B406F6 /* en */, - BF5861FD1F61405000B406F6 /* zh-Hans */, + BF1EE87A1F628BF50009F5A6 /* zh-Hans */, ); name = ConfirmViewController.xib; sourceTree = ""; }; + BF5862011F625D0F00B406F6 /* CameraView.strings */ = { + isa = PBXVariantGroup; + children = ( + BF5862001F625D0F00B406F6 /* en */, + BF5862021F625D1200B406F6 /* zh-Hans */, + ); + name = CameraView.strings; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ diff --git a/ALCameraViewController/ViewController/CropViewController.swift b/ALCameraViewController/ViewController/CropViewController.swift index 91178404..49fbe90a 100644 --- a/ALCameraViewController/ViewController/CropViewController.swift +++ b/ALCameraViewController/ViewController/CropViewController.swift @@ -244,14 +244,13 @@ public class CropViewController: UIViewController, UIScrollViewDelegate { else { print("no borders") } - borderDetectionButton.setTitle("Select All", for: .normal) + borderDetectionButton.setTitle(localizedString("crop.selectAll"), for: .normal) borderDetectionButton.action = { [weak self] in self?.selectAllBorders() } } func selectAllBorders() { cropOverlay.layoutButtons() - - borderDetectionButton.setTitle("Find Borders", for: .normal) + borderDetectionButton.setTitle(localizedString("crop.borders"), for: .normal) borderDetectionButton.action = { [weak self] in self?.detectBorders() } } diff --git a/ALCameraViewController/ViewController/zh-Hans.lproj/ConfirmViewController.strings b/ALCameraViewController/ViewController/zh-Hans.lproj/ConfirmViewController.strings deleted file mode 100644 index d9764271..00000000 --- a/ALCameraViewController/ViewController/zh-Hans.lproj/ConfirmViewController.strings +++ /dev/null @@ -1,9 +0,0 @@ - -/* Class = "UIButton"; normalTitle = "Back"; ObjectID = "Cqb-xM-psR"; */ -"Cqb-xM-psR.normalTitle" = "后退"; - -/* Class = "UIButton"; normalTitle = "Done"; ObjectID = "Qmn-Qj-BLU"; */ -"Qmn-Qj-BLU.normalTitle" = "完成"; - -/* Class = "UILabel"; text = "Confirm"; ObjectID = "l6r-RK-gpT"; */ -"l6r-RK-gpT.text" = "确认"; diff --git a/ALCameraViewController/ViewController/zh-Hans.lproj/ConfirmViewController.xib b/ALCameraViewController/ViewController/zh-Hans.lproj/ConfirmViewController.xib new file mode 100644 index 00000000..17fb38fb --- /dev/null +++ b/ALCameraViewController/ViewController/zh-Hans.lproj/ConfirmViewController.xib @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ALCameraViewController/CameraView.strings b/ALCameraViewController/en.lproj/CameraView.strings similarity index 87% rename from ALCameraViewController/CameraView.strings rename to ALCameraViewController/en.lproj/CameraView.strings index cd6d136f..d4a1092e 100644 --- a/ALCameraViewController/CameraView.strings +++ b/ALCameraViewController/en.lproj/CameraView.strings @@ -15,4 +15,8 @@ "permissions.settings" = "Settings"; "error.cant-fetch-photo" = "Unable to fetch image"; -"error.cant-fetch-photo.description" = "Please check your network settings"; \ No newline at end of file +"error.cant-fetch-photo.description" = "Please check your network settings"; + +"crop.borders" = "Find Borders"; +"crop.selectAll" = "Select All"; + diff --git a/ALCameraViewController/zh-Hans.lproj/CameraView.strings b/ALCameraViewController/zh-Hans.lproj/CameraView.strings new file mode 100644 index 00000000..56ace2c1 --- /dev/null +++ b/ALCameraViewController/zh-Hans.lproj/CameraView.strings @@ -0,0 +1,20 @@ +/* + ALCameraView.strings + ALCameraViewController + + Created by Alex Littlejohn on 2015/06/25. + Copyright (c) 2015 zero. All rights reserved. +*/ +"permissions.title" = "没有相机访问权限"; +"permissions.description" = "请在隐私设定中打开相机访问权限"; + +"permissions.library.title" = "没有相册访问权限"; +"permissions.library.description" = "请在隐私设定中打开相册访问权限"; + +"permissions.settings" = "设置"; + +"error.cant-fetch-photo" = "无法获取图片"; +"error.cant-fetch-photo.description" = "请检查你的网络设置"; + +"crop.borders" = "查找边缘"; +"crop.selectAll" = "全部选择"; From 5c1c4c43ece0a280ce7ffce8c19be0e0424c405b Mon Sep 17 00:00:00 2001 From: Wallace Wu Date: Fri, 8 Sep 2017 14:21:15 -0400 Subject: [PATCH 18/24] Fix positioning of activity view --- ALCameraViewController/ViewController/CameraViewController.swift | 1 + ALCameraViewController/ViewController/CropViewController.swift | 1 + 2 files changed, 2 insertions(+) diff --git a/ALCameraViewController/ViewController/CameraViewController.swift b/ALCameraViewController/ViewController/CameraViewController.swift index 3f026e94..5ffb36b1 100644 --- a/ALCameraViewController/ViewController/CameraViewController.swift +++ b/ALCameraViewController/ViewController/CameraViewController.swift @@ -612,6 +612,7 @@ open class CameraViewController: UIViewController { let spinner = UIActivityIndicatorView() spinner.activityIndicatorViewStyle = .white spinner.center = view.center + spinner.autoresizingMask = [.flexibleLeftMargin, .flexibleRightMargin] spinner.startAnimating() view.addSubview(spinner) diff --git a/ALCameraViewController/ViewController/CropViewController.swift b/ALCameraViewController/ViewController/CropViewController.swift index 49fbe90a..69358f76 100644 --- a/ALCameraViewController/ViewController/CropViewController.swift +++ b/ALCameraViewController/ViewController/CropViewController.swift @@ -319,6 +319,7 @@ public class CropViewController: UIViewController, UIScrollViewDelegate { let spinner = UIActivityIndicatorView() spinner.activityIndicatorViewStyle = .whiteLarge spinner.center = view.center + spinner.autoresizingMask = [.flexibleLeftMargin, .flexibleRightMargin] spinner.startAnimating() spinner.sizeToFit() From b905c7357e12f441a80ae76c933254142e4133c3 Mon Sep 17 00:00:00 2001 From: Wallace Wu Date: Thu, 5 Oct 2017 17:28:19 -0400 Subject: [PATCH 19/24] Added more selection modes during cropping --- .../project.pbxproj | 4 +- .../Contents.json | 12 + .../crop_a4_paper_normal.pdf | Bin 0 -> 4294 bytes .../Contents.json | 12 + .../crop_detect_border_normal.pdf | Bin 0 -> 30755 bytes .../Contents.json | 12 + .../crop_full_image_normal.pdf | Bin 0 -> 4166 bytes .../Contents.json | 12 + .../crop_no_statusbar_normal.pdf | Bin 0 -> 4504 bytes .../crop_square_normal.imageset/Contents.json | 12 + .../crop_square_normal.pdf | Bin 0 -> 4250 bytes .../ViewController/CropViewController.swift | 37 ++- .../en.lproj/CropViewController.xib | 269 ++++++++++++++---- .../zh-Hans.lproj/CropViewController.strings | 12 + .../zh-Hans.lproj/CropViewController.xib | 123 -------- .../Views/OverlayView.swift | 11 +- 16 files changed, 324 insertions(+), 192 deletions(-) create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/crop_a4_paper_normal.imageset/Contents.json create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/crop_a4_paper_normal.imageset/crop_a4_paper_normal.pdf create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/crop_detect_border_normal.imageset/Contents.json create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/crop_detect_border_normal.imageset/crop_detect_border_normal.pdf create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/crop_full_image_normal.imageset/Contents.json create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/crop_full_image_normal.imageset/crop_full_image_normal.pdf create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/crop_no_statusbar_normal.imageset/Contents.json create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/crop_no_statusbar_normal.imageset/crop_no_statusbar_normal.pdf create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/crop_square_normal.imageset/Contents.json create mode 100644 ALCameraViewController/CameraViewAssets.xcassets/crop_square_normal.imageset/crop_square_normal.pdf create mode 100644 ALCameraViewController/ViewController/zh-Hans.lproj/CropViewController.strings delete mode 100644 ALCameraViewController/ViewController/zh-Hans.lproj/CropViewController.xib diff --git a/ALCameraViewController.xcodeproj/project.pbxproj b/ALCameraViewController.xcodeproj/project.pbxproj index c8168201..b2666ebb 100644 --- a/ALCameraViewController.xcodeproj/project.pbxproj +++ b/ALCameraViewController.xcodeproj/project.pbxproj @@ -76,7 +76,6 @@ /* Begin PBXFileReference section */ BF1EE87A1F628BF50009F5A6 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "zh-Hans"; path = "zh-Hans.lproj/ConfirmViewController.xib"; sourceTree = ""; }; BF5861F51F613FB800B406F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/CropViewController.xib; sourceTree = ""; }; - BF5861F71F613FC500B406F6 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "zh-Hans"; path = "zh-Hans.lproj/CropViewController.xib"; sourceTree = ""; }; BF5861FA1F61404C00B406F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/ConfirmViewController.xib; sourceTree = ""; }; BF5862001F625D0F00B406F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/CameraView.strings; sourceTree = ""; }; BF5862021F625D1200B406F6 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/CameraView.strings"; sourceTree = ""; }; @@ -99,6 +98,7 @@ E35A24081F509FBD001047FD /* CGRectExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CGRectExtensions.swift; sourceTree = ""; }; E35A240B1F509FFC001047FD /* CGPointExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CGPointExtensions.swift; sourceTree = ""; }; E35A240E1F50B49A001047FD /* ConfirmViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfirmViewController.swift; sourceTree = ""; }; + E3E9FED31F86CF480096CF5A /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/CropViewController.strings"; sourceTree = ""; }; EBFE097C1CAF1D1A00A8C637 /* UIViewExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIViewExtensions.swift; sourceTree = ""; }; FA52EE0A1B44129B00E16B6F /* ViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ViewController.xib; sourceTree = ""; }; FA5FA3421B3AFA2B00497C62 /* PermissionsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PermissionsView.swift; sourceTree = ""; }; @@ -443,7 +443,7 @@ isa = PBXVariantGroup; children = ( BF5861F51F613FB800B406F6 /* en */, - BF5861F71F613FC500B406F6 /* zh-Hans */, + E3E9FED31F86CF480096CF5A /* zh-Hans */, ); name = CropViewController.xib; sourceTree = ""; diff --git a/ALCameraViewController/CameraViewAssets.xcassets/crop_a4_paper_normal.imageset/Contents.json b/ALCameraViewController/CameraViewAssets.xcassets/crop_a4_paper_normal.imageset/Contents.json new file mode 100644 index 00000000..65ff9f64 --- /dev/null +++ b/ALCameraViewController/CameraViewAssets.xcassets/crop_a4_paper_normal.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "crop_a4_paper_normal.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ALCameraViewController/CameraViewAssets.xcassets/crop_a4_paper_normal.imageset/crop_a4_paper_normal.pdf b/ALCameraViewController/CameraViewAssets.xcassets/crop_a4_paper_normal.imageset/crop_a4_paper_normal.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9c6e09644a8f6ae296d1d58fd123283a18d22841 GIT binary patch literal 4294 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 literal 0 HcmV?d00001 diff --git a/ALCameraViewController/CameraViewAssets.xcassets/crop_full_image_normal.imageset/Contents.json b/ALCameraViewController/CameraViewAssets.xcassets/crop_full_image_normal.imageset/Contents.json new file mode 100644 index 00000000..cca57a84 --- /dev/null +++ b/ALCameraViewController/CameraViewAssets.xcassets/crop_full_image_normal.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "crop_full_image_normal.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ALCameraViewController/CameraViewAssets.xcassets/crop_full_image_normal.imageset/crop_full_image_normal.pdf b/ALCameraViewController/CameraViewAssets.xcassets/crop_full_image_normal.imageset/crop_full_image_normal.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d908367d5561aaa3f348309449bb2212e69178cb GIT binary patch literal 4166 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 literal 0 HcmV?d00001 diff --git a/ALCameraViewController/CameraViewAssets.xcassets/crop_no_statusbar_normal.imageset/Contents.json b/ALCameraViewController/CameraViewAssets.xcassets/crop_no_statusbar_normal.imageset/Contents.json new file mode 100644 index 00000000..d7058db2 --- /dev/null +++ b/ALCameraViewController/CameraViewAssets.xcassets/crop_no_statusbar_normal.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "crop_no_statusbar_normal.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ALCameraViewController/CameraViewAssets.xcassets/crop_no_statusbar_normal.imageset/crop_no_statusbar_normal.pdf b/ALCameraViewController/CameraViewAssets.xcassets/crop_no_statusbar_normal.imageset/crop_no_statusbar_normal.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f9be609cf815a43252e989c58c10d981556198f7 GIT binary patch literal 4504 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 d6~O;@`Mcb_yve2U<;6K%x!T$gN literal 0 HcmV?d00001 diff --git a/ALCameraViewController/CameraViewAssets.xcassets/crop_square_normal.imageset/Contents.json b/ALCameraViewController/CameraViewAssets.xcassets/crop_square_normal.imageset/Contents.json new file mode 100644 index 00000000..a0fd1984 --- /dev/null +++ b/ALCameraViewController/CameraViewAssets.xcassets/crop_square_normal.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "crop_square_normal.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ALCameraViewController/CameraViewAssets.xcassets/crop_square_normal.imageset/crop_square_normal.pdf b/ALCameraViewController/CameraViewAssets.xcassets/crop_square_normal.imageset/crop_square_normal.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e5211469ba96fb56f653a988db6af2a7e3dce34a GIT binary patch literal 4250 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 gK!_Od{|@@ - + - + + - - - + + + + + + + @@ -25,85 +30,231 @@ - - - - - - - - - - - - - + - + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + - + + + + + + + - - + - - - - + + + - + + @@ -118,6 +269,12 @@ - + + + + + + + diff --git a/ALCameraViewController/ViewController/zh-Hans.lproj/CropViewController.strings b/ALCameraViewController/ViewController/zh-Hans.lproj/CropViewController.strings new file mode 100644 index 00000000..0a37f663 --- /dev/null +++ b/ALCameraViewController/ViewController/zh-Hans.lproj/CropViewController.strings @@ -0,0 +1,12 @@ + +/* Class = "UILabel"; text = "裁剪"; ObjectID = "9bz-3X-8gW"; */ +"9bz-3X-8gW.text" = "裁剪"; + +/* Class = "UIButton"; normalTitle = "下一步"; ObjectID = "ASf-ZD-cIs"; */ +"ASf-ZD-cIs.normalTitle" = "下一步"; + +/* Class = "UIButton"; normalTitle = "查找边缘"; ObjectID = "d2B-xS-nCO"; */ +"d2B-xS-nCO.normalTitle" = "查找边缘"; + +/* Class = "UIButton"; normalTitle = "重拍"; ObjectID = "yRi-ES-LfN"; */ +"yRi-ES-LfN.normalTitle" = "重拍"; diff --git a/ALCameraViewController/ViewController/zh-Hans.lproj/CropViewController.xib b/ALCameraViewController/ViewController/zh-Hans.lproj/CropViewController.xib deleted file mode 100644 index 8ddc69ba..00000000 --- a/ALCameraViewController/ViewController/zh-Hans.lproj/CropViewController.xib +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ALCameraViewController/Views/OverlayView.swift b/ALCameraViewController/Views/OverlayView.swift index fae57bff..cc75eaf9 100644 --- a/ALCameraViewController/Views/OverlayView.swift +++ b/ALCameraViewController/Views/OverlayView.swift @@ -95,12 +95,11 @@ class OverlayView: UIView { return false } - func layoutButtons() { - let margin:CGFloat = 10.0 - topLeftButton.center = self.bounds.topLeft.translate(margin, dy: margin) - topRightButton.center = self.bounds.topRight.translate(-margin, dy: margin) - bottomLeftButton.center = self.bounds.bottomLeft.translate(margin, dy: -margin) - bottomRightButton.center = self.bounds.bottomRight.translate(-margin, dy: -margin) + func layoutButtons(_ edgeInset: UIEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)) { + topLeftButton.center = self.bounds.topLeft.translate(edgeInset.left, dy: edgeInset.top) + topRightButton.center = self.bounds.topRight.translate(-edgeInset.right, dy: edgeInset.top) + bottomLeftButton.center = self.bounds.bottomLeft.translate(edgeInset.left, dy: -edgeInset.bottom) + bottomRightButton.center = self.bounds.bottomRight.translate(-edgeInset.right, dy: -edgeInset.bottom) setNeedsDisplay() } From 0ca3e0c239a6a9d0974663515ca09ebe764cc6f7 Mon Sep 17 00:00:00 2001 From: Wallace Wu Date: Thu, 5 Oct 2017 18:14:56 -0400 Subject: [PATCH 20/24] give a bit top margin for cropping view fixed initial cropping position --- .../ViewController/CropViewController.swift | 4 +++- .../ViewController/en.lproj/CropViewController.xib | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/ALCameraViewController/ViewController/CropViewController.swift b/ALCameraViewController/ViewController/CropViewController.swift index ae031997..0b3855ff 100644 --- a/ALCameraViewController/ViewController/CropViewController.swift +++ b/ALCameraViewController/ViewController/CropViewController.swift @@ -98,7 +98,7 @@ public class CropViewController: UIViewController, UIScrollViewDelegate { enable() } } - + public override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() let scale = calculateMinimumScale(scrollView.frame.size) @@ -163,6 +163,8 @@ public class CropViewController: UIViewController, UIScrollViewDelegate { imageView.image = image imageView.sizeToFit() view.setNeedsLayout() + view.layoutIfNeeded() + self.selectAllBorders() } private func calculateMinimumScale(_ size: CGSize) -> CGFloat { diff --git a/ALCameraViewController/ViewController/en.lproj/CropViewController.xib b/ALCameraViewController/ViewController/en.lproj/CropViewController.xib index dd0f28e8..acff01ef 100644 --- a/ALCameraViewController/ViewController/en.lproj/CropViewController.xib +++ b/ALCameraViewController/ViewController/en.lproj/CropViewController.xib @@ -31,13 +31,13 @@ - + - + @@ -245,7 +245,7 @@ - + From e139771f13a6b189090895e1e17a4f111b275014 Mon Sep 17 00:00:00 2001 From: Wallace Wu Date: Tue, 17 Oct 2017 14:39:12 -0400 Subject: [PATCH 21/24] Update localization --- .../project.pbxproj | 38 +++++--- .../{ => Base.lproj}/CameraViewController.xib | 0 .../ConfirmViewController.xib | 0 .../CropViewController.xib | 14 +-- .../CameraViewController.strings | 1 + .../ConfirmViewController.strings | 9 ++ .../zh-Hans.lproj/ConfirmViewController.xib | 88 ------------------- .../zh-Hans.lproj/CropViewController.strings | 22 +++-- 8 files changed, 55 insertions(+), 117 deletions(-) rename ALCameraViewController/ViewController/{ => Base.lproj}/CameraViewController.xib (100%) rename ALCameraViewController/ViewController/{en.lproj => Base.lproj}/ConfirmViewController.xib (100%) rename ALCameraViewController/ViewController/{en.lproj => Base.lproj}/CropViewController.xib (98%) create mode 100644 ALCameraViewController/ViewController/zh-Hans.lproj/CameraViewController.strings create mode 100644 ALCameraViewController/ViewController/zh-Hans.lproj/ConfirmViewController.strings delete mode 100644 ALCameraViewController/ViewController/zh-Hans.lproj/ConfirmViewController.xib diff --git a/ALCameraViewController.xcodeproj/project.pbxproj b/ALCameraViewController.xcodeproj/project.pbxproj index b2666ebb..a7a71cde 100644 --- a/ALCameraViewController.xcodeproj/project.pbxproj +++ b/ALCameraViewController.xcodeproj/project.pbxproj @@ -44,8 +44,6 @@ E33BE7281F546920005842DC /* IRLRectangleFeature+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = E33BE7261F546920005842DC /* IRLRectangleFeature+Extensions.m */; }; E33BE7291F546920005842DC /* IRLRectangleFeature+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = E33BE7261F546920005842DC /* IRLRectangleFeature+Extensions.m */; }; E33BE72E1F5494EC005842DC /* CameraViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = C4829FFD1CAEB16C00541D08 /* CameraViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E35A24031F4FE3AD001047FD /* CameraViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35A24011F4FE3A8001047FD /* CameraViewController.xib */; }; - E35A24041F4FEB0B001047FD /* CameraViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E35A24011F4FE3A8001047FD /* CameraViewController.xib */; }; E35A24061F509CDC001047FD /* OverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35A24051F509CDC001047FD /* OverlayView.swift */; }; E35A24071F509CDC001047FD /* OverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35A24051F509CDC001047FD /* OverlayView.swift */; }; E35A24091F509FBD001047FD /* CGRectExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35A24081F509FBD001047FD /* CGRectExtensions.swift */; }; @@ -54,6 +52,8 @@ E35A240D1F509FFC001047FD /* CGPointExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35A240B1F509FFC001047FD /* CGPointExtensions.swift */; }; E35A240F1F50B49A001047FD /* ConfirmViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35A240E1F50B49A001047FD /* ConfirmViewController.swift */; }; E35A24101F50B49A001047FD /* ConfirmViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35A240E1F50B49A001047FD /* ConfirmViewController.swift */; }; + E3669CC11F96848D00CCDD01 /* CameraViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E3669CC41F96848D00CCDD01 /* CameraViewController.xib */; }; + E3669CC21F96848D00CCDD01 /* CameraViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E3669CC41F96848D00CCDD01 /* CameraViewController.xib */; }; EBFE097D1CAF1D1A00A8C637 /* UIViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBFE097C1CAF1D1A00A8C637 /* UIViewExtensions.swift */; }; FA52EE0B1B44129B00E16B6F /* ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = FA52EE0A1B44129B00E16B6F /* ViewController.xib */; }; FA5FA3431B3AFA2B00497C62 /* PermissionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA5FA3421B3AFA2B00497C62 /* PermissionsView.swift */; }; @@ -74,9 +74,6 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - BF1EE87A1F628BF50009F5A6 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "zh-Hans"; path = "zh-Hans.lproj/ConfirmViewController.xib"; sourceTree = ""; }; - BF5861F51F613FB800B406F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/CropViewController.xib; sourceTree = ""; }; - BF5861FA1F61404C00B406F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/ConfirmViewController.xib; sourceTree = ""; }; BF5862001F625D0F00B406F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/CameraView.strings; sourceTree = ""; }; BF5862021F625D1200B406F6 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/CameraView.strings"; sourceTree = ""; }; C40665431C73A47C00EB9751 /* SingleImageSaver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleImageSaver.swift; sourceTree = ""; }; @@ -93,12 +90,16 @@ E33BE7251F546920005842DC /* IRLRectangleFeature+Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "IRLRectangleFeature+Extensions.h"; sourceTree = ""; }; E33BE7261F546920005842DC /* IRLRectangleFeature+Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "IRLRectangleFeature+Extensions.m"; sourceTree = ""; }; E33BE72F1F54955E005842DC /* CameraViewController-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CameraViewController-Bridging-Header.h"; sourceTree = ""; }; - E35A24011F4FE3A8001047FD /* CameraViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CameraViewController.xib; sourceTree = ""; }; E35A24051F509CDC001047FD /* OverlayView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OverlayView.swift; sourceTree = ""; }; E35A24081F509FBD001047FD /* CGRectExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CGRectExtensions.swift; sourceTree = ""; }; E35A240B1F509FFC001047FD /* CGPointExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CGPointExtensions.swift; sourceTree = ""; }; E35A240E1F50B49A001047FD /* ConfirmViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfirmViewController.swift; sourceTree = ""; }; - E3E9FED31F86CF480096CF5A /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/CropViewController.strings"; sourceTree = ""; }; + E3669CC01F96847E00CCDD01 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/CropViewController.xib; sourceTree = ""; }; + E3669CC31F96848D00CCDD01 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/CameraViewController.xib; sourceTree = ""; }; + E3669CC61F96849700CCDD01 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ConfirmViewController.xib; sourceTree = ""; }; + E3669CC91F96855500CCDD01 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/CropViewController.strings"; sourceTree = ""; }; + E3669CCB1F96859000CCDD01 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/CameraViewController.strings"; sourceTree = ""; }; + E3669CCD1F96859A00CCDD01 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/ConfirmViewController.strings"; sourceTree = ""; }; EBFE097C1CAF1D1A00A8C637 /* UIViewExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIViewExtensions.swift; sourceTree = ""; }; FA52EE0A1B44129B00E16B6F /* ViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ViewController.xib; sourceTree = ""; }; FA5FA3421B3AFA2B00497C62 /* PermissionsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PermissionsView.swift; sourceTree = ""; }; @@ -153,7 +154,7 @@ children = ( FAB50BF91B413E8C009905B9 /* PhotoLibraryViewController.swift */, FAF058651B316695008E5592 /* CameraViewController.swift */, - E35A24011F4FE3A8001047FD /* CameraViewController.xib */, + E3669CC41F96848D00CCDD01 /* CameraViewController.xib */, FA7E6B9A1B429012000E1B14 /* CropViewController.swift */, BF5861F61F613FB800B406F6 /* CropViewController.xib */, E35A240E1F50B49A001047FD /* ConfirmViewController.swift */, @@ -349,7 +350,7 @@ buildActionMask = 2147483647; files = ( BF5861FF1F625D0F00B406F6 /* CameraView.strings in Resources */, - E35A24031F4FE3AD001047FD /* CameraViewController.xib in Resources */, + E3669CC21F96848D00CCDD01 /* CameraViewController.xib in Resources */, BF5861F91F61404C00B406F6 /* ConfirmViewController.xib in Resources */, C482A0151CAEB1B100541D08 /* CameraViewAssets.xcassets in Resources */, BF5861F41F613FB800B406F6 /* CropViewController.xib in Resources */, @@ -360,7 +361,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - E35A24041F4FEB0B001047FD /* CameraViewController.xib in Resources */, + E3669CC11F96848D00CCDD01 /* CameraViewController.xib in Resources */, FA52EE0B1B44129B00E16B6F /* ViewController.xib in Resources */, BF5861FE1F625D0F00B406F6 /* CameraView.strings in Resources */, FA5FA3451B3AFEB300497C62 /* CameraViewAssets.xcassets in Resources */, @@ -442,8 +443,8 @@ BF5861F61F613FB800B406F6 /* CropViewController.xib */ = { isa = PBXVariantGroup; children = ( - BF5861F51F613FB800B406F6 /* en */, - E3E9FED31F86CF480096CF5A /* zh-Hans */, + E3669CC01F96847E00CCDD01 /* Base */, + E3669CC91F96855500CCDD01 /* zh-Hans */, ); name = CropViewController.xib; sourceTree = ""; @@ -451,8 +452,8 @@ BF5861FB1F61404C00B406F6 /* ConfirmViewController.xib */ = { isa = PBXVariantGroup; children = ( - BF5861FA1F61404C00B406F6 /* en */, - BF1EE87A1F628BF50009F5A6 /* zh-Hans */, + E3669CC61F96849700CCDD01 /* Base */, + E3669CCD1F96859A00CCDD01 /* zh-Hans */, ); name = ConfirmViewController.xib; sourceTree = ""; @@ -466,6 +467,15 @@ name = CameraView.strings; sourceTree = ""; }; + E3669CC41F96848D00CCDD01 /* CameraViewController.xib */ = { + isa = PBXVariantGroup; + children = ( + E3669CC31F96848D00CCDD01 /* Base */, + E3669CCB1F96859000CCDD01 /* zh-Hans */, + ); + name = CameraViewController.xib; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ diff --git a/ALCameraViewController/ViewController/CameraViewController.xib b/ALCameraViewController/ViewController/Base.lproj/CameraViewController.xib similarity index 100% rename from ALCameraViewController/ViewController/CameraViewController.xib rename to ALCameraViewController/ViewController/Base.lproj/CameraViewController.xib diff --git a/ALCameraViewController/ViewController/en.lproj/ConfirmViewController.xib b/ALCameraViewController/ViewController/Base.lproj/ConfirmViewController.xib similarity index 100% rename from ALCameraViewController/ViewController/en.lproj/ConfirmViewController.xib rename to ALCameraViewController/ViewController/Base.lproj/ConfirmViewController.xib diff --git a/ALCameraViewController/ViewController/en.lproj/CropViewController.xib b/ALCameraViewController/ViewController/Base.lproj/CropViewController.xib similarity index 98% rename from ALCameraViewController/ViewController/en.lproj/CropViewController.xib rename to ALCameraViewController/ViewController/Base.lproj/CropViewController.xib index acff01ef..e440e040 100644 --- a/ALCameraViewController/ViewController/en.lproj/CropViewController.xib +++ b/ALCameraViewController/ViewController/Base.lproj/CropViewController.xib @@ -5,7 +5,7 @@ - + @@ -61,7 +61,7 @@