From 461700e3c4d9f45220fb2eb4fe99cd4a5bb9ca84 Mon Sep 17 00:00:00 2001 From: Aditya Ayyakad Date: Mon, 19 Sep 2016 18:14:48 -0400 Subject: [PATCH 1/2] Made it swift-y --- MotionKit.xcodeproj/project.pbxproj | 8 + MotionKit/MotionKit.swift | 299 ++++++++++++++-------------- MotionKitTests/MotionKitTests.swift | 2 +- 3 files changed, 156 insertions(+), 153 deletions(-) diff --git a/MotionKit.xcodeproj/project.pbxproj b/MotionKit.xcodeproj/project.pbxproj index f9980c2..835c615 100644 --- a/MotionKit.xcodeproj/project.pbxproj +++ b/MotionKit.xcodeproj/project.pbxproj @@ -166,9 +166,11 @@ TargetAttributes = { 75FDED541A9541F800283A97 = { CreatedOnToolsVersion = 6.1.1; + LastSwiftMigration = 0800; }; 75FDED5F1A9541F800283A97 = { CreatedOnToolsVersion = 6.1.1; + LastSwiftMigration = 0800; }; }; }; @@ -332,6 +334,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -347,6 +350,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; }; name = Release; }; @@ -364,6 +368,7 @@ INFOPLIST_FILE = MotionKitTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -377,6 +382,7 @@ INFOPLIST_FILE = MotionKitTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Release; }; @@ -399,6 +405,7 @@ 75FDED6D1A9541F800283A97 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 75FDED6E1A9541F800283A97 /* Build configuration list for PBXNativeTarget "MotionKitTests" */ = { isa = XCConfigurationList; @@ -407,6 +414,7 @@ 75FDED701A9541F800283A97 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/MotionKit/MotionKit.swift b/MotionKit/MotionKit.swift index eb0860c..b1d1504 100644 --- a/MotionKit/MotionKit.swift +++ b/MotionKit/MotionKit.swift @@ -15,20 +15,20 @@ import CoreMotion //_______________________________________________________________________________________________________________ // this helps retrieve values from the sensors. @objc protocol MotionKitDelegate { - optional func retrieveAccelerometerValues (x: Double, y:Double, z:Double, absoluteValue: Double) - optional func retrieveGyroscopeValues (x: Double, y:Double, z:Double, absoluteValue: Double) - optional func retrieveDeviceMotionObject (deviceMotion: CMDeviceMotion) - optional func retrieveMagnetometerValues (x: Double, y:Double, z:Double, absoluteValue: Double) - - optional func getAccelerationValFromDeviceMotion (x: Double, y:Double, z:Double) - optional func getGravityAccelerationValFromDeviceMotion (x: Double, y:Double, z:Double) - optional func getRotationRateFromDeviceMotion (x: Double, y:Double, z:Double) - optional func getMagneticFieldFromDeviceMotion (x: Double, y:Double, z:Double) - optional func getAttitudeFromDeviceMotion (attitude: CMAttitude) + @objc optional func retrieveAccelerometerValues (_ x: Double, y:Double, z:Double, absoluteValue: Double) + @objc optional func retrieveGyroscopeValues (_ x: Double, y:Double, z:Double, absoluteValue: Double) + @objc optional func retrieveDeviceMotionObject (_ deviceMotion: CMDeviceMotion) + @objc optional func retrieveMagnetometerValues (_ x: Double, y:Double, z:Double, absoluteValue: Double) + + @objc optional func getAccelerationValFromDeviceMotion (_ x: Double, y:Double, z:Double) + @objc optional func getGravityAccelerationValFromDeviceMotion (_ x: Double, y:Double, z:Double) + @objc optional func getRotationRateFromDeviceMotion (_ x: Double, y:Double, z:Double) + @objc optional func getMagneticFieldFromDeviceMotion (_ x: Double, y:Double, z:Double) + @objc optional func getAttitudeFromDeviceMotion (_ attitude: CMAttitude) } -@objc(MotionKit) public class MotionKit :NSObject{ +@objc(MotionKit) open class MotionKit :NSObject{ let manager = CMMotionManager() var delegate: MotionKitDelegate? @@ -52,27 +52,29 @@ import CoreMotion * given NSOperationQueue will be cancelled. You can access the retrieved values either by a * Trailing Closure or through a Delgate. */ - public func getAccelerometerValues (interval: NSTimeInterval = 0.1, values: ((x: Double, y: Double, z: Double) -> ())? ){ - var valX: Double! - var valY: Double! - var valZ: Double! - if manager.accelerometerAvailable { + open func getAccelerometerValues (_ interval: TimeInterval = 0.1, values: ((_ x: Double, _ y: Double, _ z: Double) -> ())? ){ + + if manager.isAccelerometerAvailable { manager.accelerometerUpdateInterval = interval - manager.startAccelerometerUpdatesToQueue(NSOperationQueue(), withHandler: { - (data, error) in + manager.startAccelerometerUpdates(to: OperationQueue(), withHandler: { + (accelerationData, error) in if let isError = error { - NSLog("Error: %@", isError) + NSLog("Error: \(isError)") } - valX = data!.acceleration.x - valY = data!.acceleration.y - valZ = data!.acceleration.z - if values != nil{ - values!(x: valX,y: valY,z: valZ) + guard let data = accelerationData else { + return } - let absoluteVal = sqrt(valX * valX + valY * valY + valZ * valZ) - self.delegate?.retrieveAccelerometerValues!(valX, y: valY, z: valZ, absoluteValue: absoluteVal) + + let valX = data.acceleration.x + let valY = data.acceleration.y + let valZ = data.acceleration.z + + values?(valX,valY,valZ) + + let absoluteVal = sqrt((valX * valX) + (valY * valY) + (valZ * valZ)) + self.delegate?.retrieveAccelerometerValues?(valX, y: valY, z: valZ, absoluteValue: absoluteVal) }) } else { NSLog("The Accelerometer is not available") @@ -88,27 +90,28 @@ import CoreMotion * given NSOperationQueue will be cancelled. You can access the retrieved values either by a * Trailing Closure or through a Delegate. */ - public func getGyroValues (interval: NSTimeInterval = 0.1, values: ((x: Double, y: Double, z:Double) -> ())? ) { + open func getGyroValues (_ interval: TimeInterval = 0.1, values: ((_ x: Double, _ y: Double, _ z:Double) -> ())? ) { - var valX: Double! - var valY: Double! - var valZ: Double! - if manager.gyroAvailable{ + if manager.isGyroAvailable{ manager.gyroUpdateInterval = interval - manager.startGyroUpdatesToQueue(NSOperationQueue(), withHandler: { - (data, error) in + manager.startGyroUpdates(to: OperationQueue(), withHandler: { + (rotationRateData, error) in if let isError = error{ - NSLog("Error: %@", isError) + NSLog("Error: \(isError)") } - valX = data!.rotationRate.x - valY = data!.rotationRate.y - valZ = data!.rotationRate.z - if values != nil{ - values!(x: valX, y: valY, z: valZ) + guard let data = rotationRateData else { + return } - let absoluteVal = sqrt(valX * valX + valY * valY + valZ * valZ) + + let valX = data.rotationRate.x + let valY = data.rotationRate.y + let valZ = data.rotationRate.z + + values?(valX, valY, valZ) + + let absoluteVal = sqrt((valX * valX) + (valY * valY) + (valZ * valZ)) self.delegate?.retrieveGyroscopeValues!(valX, y: valY, z: valZ, absoluteValue: absoluteVal) }) @@ -124,29 +127,30 @@ import CoreMotion * Starts magnetometer updates, providing data to the given handler through the given queue. * You can access the retrieved values either by a Trailing Closure or through a Delegate. */ - @available(iOS, introduced=5.0) - public func getMagnetometerValues (interval: NSTimeInterval = 0.1, values: ((x: Double, y:Double, z:Double) -> ())? ){ + @available(iOS, introduced: 5.0) + open func getMagnetometerValues (_ interval: TimeInterval = 0.1, values: ((_ x: Double, _ y:Double, _ z:Double) -> ())? ){ - var valX: Double! - var valY: Double! - var valZ: Double! - if manager.magnetometerAvailable { + if manager.isMagnetometerAvailable { manager.magnetometerUpdateInterval = interval - manager.startMagnetometerUpdatesToQueue(NSOperationQueue()){ - (data, error) in + manager.startMagnetometerUpdates(to: OperationQueue()){ + (magneticFieldData, error) in if let isError = error{ - NSLog("Error: %@", isError) + NSLog("Error: \(isError)") } - valX = data!.magneticField.x - valY = data!.magneticField.y - valZ = data!.magneticField.z - if values != nil{ - values!(x: valX, y: valY, z: valZ) + guard let data = magneticFieldData else { + return } - let absoluteVal = sqrt(valX * valX + valY * valY + valZ * valZ) - self.delegate?.retrieveMagnetometerValues!(valX, y: valY, z: valZ, absoluteValue: absoluteVal) + + let valX = data.magneticField.x + let valY = data.magneticField.y + let valZ = data.magneticField.z + + values?(valX, valY, valZ) + + let absoluteVal = sqrt((valX * valX) + (valY * valY) + (valZ * valZ)) + self.delegate?.retrieveMagnetometerValues?(valX, y: valY, z: valZ, absoluteValue: absoluteVal) } } else { @@ -165,20 +169,24 @@ import CoreMotion * attitudeReferenceFrame to determine this. You can access the retrieved values either by a * Trailing Closure or through a Delegate. */ - public func getDeviceMotionObject (interval: NSTimeInterval = 0.1, values: ((deviceMotion: CMDeviceMotion) -> ())? ) { + open func getDeviceMotionObject (_ interval: TimeInterval = 0.1, values: ((_ deviceMotion: CMDeviceMotion) -> ())? ) { - if manager.deviceMotionAvailable{ + if manager.isDeviceMotionAvailable{ manager.deviceMotionUpdateInterval = interval - manager.startDeviceMotionUpdatesToQueue(NSOperationQueue()){ - (data, error) in - + manager.startDeviceMotionUpdates(to: OperationQueue()){ + (objectData, error) in + if let isError = error{ - NSLog("Error: %@", isError) + NSLog("Error: \(isError)") } - if values != nil{ - values!(deviceMotion: data!) + + guard let data = objectData else { + return } - self.delegate?.retrieveDeviceMotionObject!(data!) + + values?(data) + + self.delegate?.retrieveDeviceMotionObject?(data) } } else { @@ -191,28 +199,24 @@ import CoreMotion * getAccelerationFromDeviceMotion:interval:values: * You can retrieve the processed user accelaration data from the device motion from this method. */ - public func getAccelerationFromDeviceMotion (interval: NSTimeInterval = 0.1, values: ((x:Double, y:Double, z:Double) -> ())? ) { - - var valX: Double! - var valY: Double! - var valZ: Double! - if manager.deviceMotionAvailable{ + open func getAccelerationFromDeviceMotion (_ interval: TimeInterval = 0.1, values: ((_ x:Double, _ y:Double, _ z:Double) -> ())? ) { + + if manager.isDeviceMotionAvailable{ manager.deviceMotionUpdateInterval = interval - manager.startDeviceMotionUpdatesToQueue(NSOperationQueue()){ + manager.startDeviceMotionUpdates(to: OperationQueue()){ (data, error) in if let isError = error{ - NSLog("Error: %@", isError) + NSLog("Error: \(isError)") } - valX = data!.userAcceleration.x - valY = data!.userAcceleration.y - valZ = data!.userAcceleration.z + + let valX = data!.userAcceleration.x + let valY = data!.userAcceleration.y + let valZ = data!.userAcceleration.z - if values != nil{ - values!(x: valX, y: valY, z: valZ) - } + values?(valX, valY, valZ) - self.delegate?.getAccelerationValFromDeviceMotion!(valX, y: valY, z: valZ) + self.delegate?.getAccelerationValFromDeviceMotion?(valX, y: valY, z: valZ) } } else { @@ -225,29 +229,23 @@ import CoreMotion * You can retrieve the processed gravitational accelaration data from the device motion from this * method. */ - public func getGravityAccelerationFromDeviceMotion (interval: NSTimeInterval = 0.1, values: ((x:Double, y:Double, z:Double) -> ())? ) { - - var valX: Double! - var valY: Double! - var valZ: Double! - if manager.deviceMotionAvailable{ + open func getGravityAccelerationFromDeviceMotion (_ interval: TimeInterval = 0.1, values: ((_ x:Double, _ y:Double, _ z:Double) -> ())? ) { + + if manager.isDeviceMotionAvailable{ manager.deviceMotionUpdateInterval = interval - manager.startDeviceMotionUpdatesToQueue(NSOperationQueue()){ + manager.startDeviceMotionUpdates(to: OperationQueue()){ (data, error) in if let isError = error{ - NSLog("Error: %@", isError) - } - valX = data!.gravity.x - valY = data!.gravity.y - valZ = data!.gravity.z - - if values != nil{ - values!(x: valX, y: valY, z: valZ) + NSLog("Error: \(isError)") } + let valX = data!.gravity.x + let valY = data!.gravity.y + let valZ = data!.gravity.z - let absoluteVal = sqrt(valX * valX + valY * valY + valZ * valZ) - self.delegate?.getGravityAccelerationValFromDeviceMotion!(valX, y: valY, z: valZ) + values?(valX, valY, valZ) + + self.delegate?.getGravityAccelerationValFromDeviceMotion?(valX, y: valY, z: valZ) } } else { @@ -261,21 +259,20 @@ import CoreMotion * You can retrieve the processed attitude data from the device motion from this * method. */ - public func getAttitudeFromDeviceMotion (interval: NSTimeInterval = 0.1, values: ((attitude: CMAttitude) -> ())? ) { + open func getAttitudeFromDeviceMotion (_ interval: TimeInterval = 0.1, values: ((_ attitude: CMAttitude) -> ())? ) { - if manager.deviceMotionAvailable{ + if manager.isDeviceMotionAvailable{ manager.deviceMotionUpdateInterval = interval - manager.startDeviceMotionUpdatesToQueue(NSOperationQueue()){ + manager.startDeviceMotionUpdates(to: OperationQueue()){ (data, error) in if let isError = error{ - NSLog("Error: %@", isError) - } - if values != nil{ - values!(attitude: data!.attitude) + NSLog("Error: \(isError)") } + + values?(data!.attitude) - self.delegate?.getAttitudeFromDeviceMotion!(data!.attitude) + self.delegate?.getAttitudeFromDeviceMotion?(data!.attitude) } } else { @@ -288,29 +285,28 @@ import CoreMotion * You can retrieve the processed rotation data from the device motion from this * method. */ - public func getRotationRateFromDeviceMotion (interval: NSTimeInterval = 0.1, values: ((x:Double, y:Double, z:Double) -> ())? ) { - - var valX: Double! - var valY: Double! - var valZ: Double! - if manager.deviceMotionAvailable{ + open func getRotationRateFromDeviceMotion (_ interval: TimeInterval = 0.1, values: ((_ x:Double, _ y:Double, _ z:Double) -> ())? ) { + + if manager.isDeviceMotionAvailable{ manager.deviceMotionUpdateInterval = interval - manager.startDeviceMotionUpdatesToQueue(NSOperationQueue()){ - (data, error) in + manager.startDeviceMotionUpdates(to: OperationQueue()){ + (rotationRateData, error) in if let isError = error{ - NSLog("Error: %@", isError) + NSLog("Error: \(isError)") } - valX = data!.rotationRate.x - valY = data!.rotationRate.y - valZ = data!.rotationRate.z - if values != nil{ - values!(x: valX, y: valY, z: valZ) + guard let data = rotationRateData else { + return } - let absoluteVal = sqrt(valX * valX + valY * valY + valZ * valZ) - self.delegate?.getRotationRateFromDeviceMotion!(valX, y: valY, z: valZ) + let valX = data.rotationRate.x + let valY = data.rotationRate.y + let valZ = data.rotationRate.z + + values?(valX, valY, valZ) + + self.delegate?.getRotationRateFromDeviceMotion?(valX, y: valY, z: valZ) } } else { @@ -324,30 +320,29 @@ import CoreMotion * You can retrieve the processed magnetic field data from the device motion from this * method. */ - public func getMagneticFieldFromDeviceMotion (interval: NSTimeInterval = 0.1, values: ((x:Double, y:Double, z:Double, accuracy: Int32) -> ())? ) { + open func getMagneticFieldFromDeviceMotion (_ interval: TimeInterval = 0.1, values: ((_ x:Double, _ y:Double, _ z:Double, _ accuracy: Int32) -> ())? ) { - var valX: Double! - var valY: Double! - var valZ: Double! - var valAccuracy: Int32! - if manager.deviceMotionAvailable{ + if manager.isDeviceMotionAvailable{ manager.deviceMotionUpdateInterval = interval - manager.startDeviceMotionUpdatesToQueue(NSOperationQueue()){ - (data, error) in + manager.startDeviceMotionUpdates(to: OperationQueue()){ + (magneticFieldData, error) in if let isError = error{ - NSLog("Error: %@", isError) + NSLog("Error: \(isError)") } - valX = data!.magneticField.field.x - valY = data!.magneticField.field.y - valZ = data!.magneticField.field.z - valAccuracy = data!.magneticField.accuracy.rawValue - if values != nil{ - values!(x: valX, y: valY, z: valZ, accuracy: valAccuracy) + guard let data = magneticFieldData else { + return } - self.delegate?.getMagneticFieldFromDeviceMotion!(valX, y: valY, z: valZ) + let valX = data.magneticField.field.x + let valY = data.magneticField.field.y + let valZ = data.magneticField.field.z + let valAccuracy = data.magneticField.accuracy.rawValue + + values?(valX, valY, valZ, valAccuracy) + + self.delegate?.getMagneticFieldFromDeviceMotion?(valX, y: valY, z: valZ) } } else { @@ -365,38 +360,38 @@ import CoreMotion /* MARK :- INSTANTANIOUS METHODS START HERE */ - public func getAccelerationAtCurrentInstant (values: (x:Double, y:Double, z:Double) -> ()){ + open func getAccelerationAtCurrentInstant (_ values: @escaping (_ x:Double, _ y:Double, _ z:Double) -> ()){ self.getAccelerationFromDeviceMotion(0.5) { (x, y, z) -> () in - values(x: x,y: y,z: z) + values(x,y,z) self.stopDeviceMotionUpdates() } } - public func getGravitationalAccelerationAtCurrentInstant (values: (x:Double, y:Double, z:Double) -> ()){ + open func getGravitationalAccelerationAtCurrentInstant (_ values: @escaping (_ x:Double, _ y:Double, _ z:Double) -> ()){ self.getGravityAccelerationFromDeviceMotion(0.5) { (x, y, z) -> () in - values(x: x,y: y,z: z) + values(x,y,z) self.stopDeviceMotionUpdates() } } - public func getAttitudeAtCurrentInstant (values: (attitude: CMAttitude) -> ()){ + open func getAttitudeAtCurrentInstant (_ values: @escaping (_ attitude: CMAttitude) -> ()){ self.getAttitudeFromDeviceMotion(0.5) { (attitude) -> () in - values(attitude: attitude) + values(attitude) self.stopDeviceMotionUpdates() } } - public func getMageticFieldAtCurrentInstant (values: (x:Double, y:Double, z:Double) -> ()){ + open func getMageticFieldAtCurrentInstant (_ values: @escaping (_ x:Double, _ y:Double, _ z:Double) -> ()){ self.getMagneticFieldFromDeviceMotion(0.5) { (x, y, z, accuracy) -> () in - values(x: x,y: y,z: z) + values(x,y,z) self.stopDeviceMotionUpdates() } } - public func getGyroValuesAtCurrentInstant (values: (x:Double, y:Double, z:Double) -> ()){ + open func getGyroValuesAtCurrentInstant (_ values: @escaping (_ x:Double, _ y:Double, _ z:Double) -> ()){ self.getRotationRateFromDeviceMotion(0.5) { (x, y, z) -> () in - values(x: x,y: y,z: z) + values(x,y,z) self.stopDeviceMotionUpdates() } } @@ -411,7 +406,7 @@ import CoreMotion * Discussion: * Stop accelerometer updates. */ - public func stopAccelerometerUpdates(){ + open func stopAccelerometerUpdates(){ self.manager.stopAccelerometerUpdates() NSLog("Accelaration Updates Status - Stopped") } @@ -422,7 +417,7 @@ import CoreMotion * Discussion: * Stops gyro updates. */ - public func stopGyroUpdates(){ + open func stopGyroUpdates(){ self.manager.stopGyroUpdates() NSLog("Gyroscope Updates Status - Stopped") } @@ -433,7 +428,7 @@ import CoreMotion * Discussion: * Stops device motion updates. */ - public func stopDeviceMotionUpdates() { + open func stopDeviceMotionUpdates() { self.manager.stopDeviceMotionUpdates() NSLog("Device Motion Updates Status - Stopped") } @@ -444,8 +439,8 @@ import CoreMotion * Discussion: * Stops magnetometer updates. */ - @available(iOS, introduced=5.0) - public func stopmagnetometerUpdates() { + @available(iOS, introduced: 5.0) + open func stopmagnetometerUpdates() { self.manager.stopMagnetometerUpdates() NSLog("Magnetometer Updates Status - Stopped") } diff --git a/MotionKitTests/MotionKitTests.swift b/MotionKitTests/MotionKitTests.swift index d78e1e7..0d36021 100644 --- a/MotionKitTests/MotionKitTests.swift +++ b/MotionKitTests/MotionKitTests.swift @@ -28,7 +28,7 @@ class MotionKitTests: XCTestCase { func testPerformanceExample() { // This is an example of a performance test case. - self.measureBlock() { + self.measure() { // Put the code you want to measure the time of here. } } From c0a1993392367d803f29f2d95a45e7c32f7b3544 Mon Sep 17 00:00:00 2001 From: Aditya Ayyakad Date: Mon, 19 Sep 2016 18:15:56 -0400 Subject: [PATCH 2/2] Added files --- .../UserInterfaceState.xcuserstate | Bin 0 -> 12394 bytes .../xcschemes/MotionKit.xcscheme | 99 ++++++++++++++++++ .../xcschemes/xcschememanagement.plist | 27 +++++ 3 files changed, 126 insertions(+) create mode 100644 MotionKit.xcodeproj/project.xcworkspace/xcuserdata/Adi.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 MotionKit.xcodeproj/xcuserdata/Adi.xcuserdatad/xcschemes/MotionKit.xcscheme create mode 100644 MotionKit.xcodeproj/xcuserdata/Adi.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/MotionKit.xcodeproj/project.xcworkspace/xcuserdata/Adi.xcuserdatad/UserInterfaceState.xcuserstate b/MotionKit.xcodeproj/project.xcworkspace/xcuserdata/Adi.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..9a23c97b5ed9437923b16ebbbffee87531e11fd0 GIT binary patch literal 12394 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 literal 0 HcmV?d00001 diff --git a/MotionKit.xcodeproj/xcuserdata/Adi.xcuserdatad/xcschemes/MotionKit.xcscheme b/MotionKit.xcodeproj/xcuserdata/Adi.xcuserdatad/xcschemes/MotionKit.xcscheme new file mode 100644 index 0000000..36348d9 --- /dev/null +++ b/MotionKit.xcodeproj/xcuserdata/Adi.xcuserdatad/xcschemes/MotionKit.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MotionKit.xcodeproj/xcuserdata/Adi.xcuserdatad/xcschemes/xcschememanagement.plist b/MotionKit.xcodeproj/xcuserdata/Adi.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..d78602b --- /dev/null +++ b/MotionKit.xcodeproj/xcuserdata/Adi.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,27 @@ + + + + + SchemeUserState + + MotionKit.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 75FDED541A9541F800283A97 + + primary + + + 75FDED5F1A9541F800283A97 + + primary + + + + +