Fixed app inconsistencies between iOS and Android. Introduced a new way to manage translations.

This commit is contained in:
Raimund Wege committed 2016-07-29 17:38:26 +02:00
1 parent 1376f663e5
commit 6056613514
34 files changed
+1340 -802

No files matched your search

@@ -282,14 +282,12 @@
7F4D2F541A1C8EE50038E7D1 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7F4D2F531A1C8EE50038E7D1 /* Images.xcassets */; };
7F83F15619F154F000C53328 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F83F15519F154F000C53328 /* AppDelegate.swift */; };
7F83F15819F154F000C53328 /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F83F15719F154F000C53328 /* HomeViewController.swift */; };
7F83F15B19F154F000C53328 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7F83F15919F154F000C53328 /* Main.storyboard */; };
7F83F16C19F154F000C53328 /* SAPTrackerAPITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F83F16B19F154F000C53328 /* SAPTrackerAPITests.swift */; };
7F83F17619F1574700C53328 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F83F17519F1574700C53328 /* CoreLocation.framework */; };
7F87CAA11A2CCE8B0076C617 /* OpenSans-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7F87CA9D1A2CCE8B0076C617 /* OpenSans-Bold.ttf */; };
7F87CAA21A2CCE8B0076C617 /* OpenSans-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7F87CA9E1A2CCE8B0076C617 /* OpenSans-Light.ttf */; };
7F87CAA31A2CCE8B0076C617 /* OpenSans-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7F87CA9F1A2CCE8B0076C617 /* OpenSans-Regular.ttf */; };
7F87CAA41A2CCE8B0076C617 /* OpenSans-Semibold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7F87CAA01A2CCE8B0076C617 /* OpenSans-Semibold.ttf */; };
7F87DDDB1A97339300704AC4 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7F87DDDD1A97339300704AC4 /* Localizable.strings */; };
7F87DDE01A973C7400704AC4 /* eula-ios.html in Resources */ = {isa = PBXBuildFile; fileRef = 7F87DDE21A973C7400704AC4 /* eula-ios.html */; };
7F8B8D3F1A37356C00C34B88 /* TrackingPageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F8B8D3E1A37356C00C34B88 /* TrackingPageViewController.swift */; };
7F8B8D411A373B0200C34B88 /* SpeedViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F8B8D401A373B0200C34B88 /* SpeedViewController.swift */; };
@@ -310,6 +308,7 @@
9ECBDDAE1C9C4F0300F76AEB /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9ECBDDAD1C9C4F0300F76AEB /* LaunchScreen.storyboard */; };
C84936181D40D295000F30E8 /* GPSFixController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C84936171D40D295000F30E8 /* GPSFixController.swift */; };
C84936291D47645F000F30E8 /* HomeViewRegattaTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C84936281D47645F000F30E8 /* HomeViewRegattaTableViewCell.swift */; };
C852914F1D48FB91009E9A9D /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C85291511D48FB91009E9A9D /* Localizable.strings */; };
C852BAA21CF5E1EA0093B0C5 /* RequestManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C852BAA11CF5E1EA0093B0C5 /* RequestManager.swift */; };
C852BAAB1CF736680093B0C5 /* Preferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = C852BAAA1CF736680093B0C5 /* Preferences.swift */; };
C8603D511C52892A002B2F28 /* Acknowledgements.markdown in Resources */ = {isa = PBXBuildFile; fileRef = C8603D491C528832002B2F28 /* Acknowledgements.markdown */; };
@@ -330,12 +329,14 @@
C8739E181D2BF2DC00A89F3C /* BaseData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8739E171D2BF2DC00A89F3C /* BaseData.swift */; };
C8739E1C1D2D5F1700A89F3C /* LocationData.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8739E1B1D2D5F1700A89F3C /* LocationData.swift */; };
C89C5FC51D06A289002AAAD2 /* GradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C89C5FC41D06A289002AAAD2 /* GradientView.swift */; };
C89C5FCA1D06CECD002AAAD2 /* StatusTrackingTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C89C5FC91D06CECD002AAAD2 /* StatusTrackingTableViewCell.swift */; };
C89C5FCC1D06CF0C002AAAD2 /* GPSAccuracyTrackingTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C89C5FCB1D06CF0C002AAAD2 /* GPSAccuracyTrackingTableViewCell.swift */; };
C89C5FCE1D06CF26002AAAD2 /* CachedFixesTrackingTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C89C5FCD1D06CF26002AAAD2 /* CachedFixesTrackingTableViewCell.swift */; };
C89C5FD01D06CF46002AAAD2 /* ModeTrackingTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C89C5FCF1D06CF46002AAAD2 /* ModeTrackingTableViewCell.swift */; };
C89C5FCA1D06CECD002AAAD2 /* TrackingViewStatusCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C89C5FC91D06CECD002AAAD2 /* TrackingViewStatusCell.swift */; };
C89C5FCC1D06CF0C002AAAD2 /* TrackingViewGPSAccuracyCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C89C5FCB1D06CF0C002AAAD2 /* TrackingViewGPSAccuracyCell.swift */; };
C89C5FCE1D06CF26002AAAD2 /* TrackingViewGPSFixesCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C89C5FCD1D06CF26002AAAD2 /* TrackingViewGPSFixesCell.swift */; };
C89C5FD01D06CF46002AAAD2 /* TrackingViewModeCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C89C5FCF1D06CF46002AAAD2 /* TrackingViewModeCell.swift */; };
C8A4400B1C18153600DF70A0 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = C8A4400A1C18153600DF70A0 /* Settings.bundle */; };
C8BBAC791C52649E004CA551 /* LicenseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8BBAC781C52649E004CA551 /* LicenseViewController.swift */; };
C8D5E81D1D479FA800DA0D61 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C8D5E81C1D479FA800DA0D61 /* Main.storyboard */; };
C8F1B1E11D488B6D004C3379 /* Translation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8F1B1E01D488B6D004C3379 /* Translation.swift */; };
EEB2FC8E79793611ABC022B9 /* libPods-SAPTrackerTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CDE153BDE8C83E9A084A24F1 /* libPods-SAPTrackerTests.a */; };
/* End PBXBuildFile section */
@@ -673,7 +674,6 @@
7F83F15419F154F000C53328 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
7F83F15519F154F000C53328 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7F83F15719F154F000C53328 /* HomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = "<group>"; };
7F83F15A19F154F000C53328 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
7F83F16519F154F000C53328 /* SAPTrackerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SAPTrackerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
7F83F16A19F154F000C53328 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
7F83F16B19F154F000C53328 /* SAPTrackerAPITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SAPTrackerAPITests.swift; sourceTree = "<group>"; };
@@ -682,8 +682,6 @@
7F87CA9E1A2CCE8B0076C617 /* OpenSans-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "OpenSans-Light.ttf"; sourceTree = "<group>"; };
7F87CA9F1A2CCE8B0076C617 /* OpenSans-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "OpenSans-Regular.ttf"; sourceTree = "<group>"; };
7F87CAA01A2CCE8B0076C617 /* OpenSans-Semibold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "OpenSans-Semibold.ttf"; sourceTree = "<group>"; };
7F87DDDC1A97339300704AC4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = "<group>"; };
7F87DDDF1A9733B200704AC4 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = "<group>"; };
7F87DDE11A973C7400704AC4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = Base; path = "Base.lproj/eula-ios.html"; sourceTree = "<group>"; };
7F87DDE31A973C7900704AC4 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = de; path = "de.lproj/eula-ios.html"; sourceTree = "<group>"; };
7F8B8D3E1A37356C00C34B88 /* TrackingPageViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrackingPageViewController.swift; sourceTree = "<group>"; };
@@ -705,10 +703,10 @@
B1229BB88872CD20C0AE25DE /* libPods-SAPTracker.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SAPTracker.a"; sourceTree = BUILT_PRODUCTS_DIR; };
C84936171D40D295000F30E8 /* GPSFixController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GPSFixController.swift; sourceTree = "<group>"; };
C84936281D47645F000F30E8 /* HomeViewRegattaTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeViewRegattaTableViewCell.swift; sourceTree = "<group>"; };
C85291501D48FB91009E9A9D /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = "<group>"; };
C852BAA11CF5E1EA0093B0C5 /* RequestManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequestManager.swift; sourceTree = "<group>"; };
C852BAAA1CF736680093B0C5 /* Preferences.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Preferences.swift; sourceTree = "<group>"; };
C8603D491C528832002B2F28 /* Acknowledgements.markdown */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = Acknowledgements.markdown; sourceTree = "<group>"; };
C8739D891D21276B00A89F3C /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Main.strings; sourceTree = "<group>"; };
C8739D9A1D25317100A89F3C /* CoreData 2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "CoreData 2.xcdatamodel"; sourceTree = "<group>"; };
C8739DFA1D2AA2A500A89F3C /* Regatta+CoreDataProperties.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Regatta+CoreDataProperties.swift"; sourceTree = "<group>"; };
C8739DFB1D2AA2A500A89F3C /* Regatta.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Regatta.swift; sourceTree = "<group>"; };
@@ -727,13 +725,15 @@
C8739E171D2BF2DC00A89F3C /* BaseData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseData.swift; sourceTree = "<group>"; };
C8739E1B1D2D5F1700A89F3C /* LocationData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocationData.swift; sourceTree = "<group>"; };
C89C5FC41D06A289002AAAD2 /* GradientView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GradientView.swift; sourceTree = "<group>"; };
C89C5FC91D06CECD002AAAD2 /* StatusTrackingTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusTrackingTableViewCell.swift; sourceTree = "<group>"; };
C89C5FCB1D06CF0C002AAAD2 /* GPSAccuracyTrackingTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GPSAccuracyTrackingTableViewCell.swift; sourceTree = "<group>"; };
C89C5FCD1D06CF26002AAAD2 /* CachedFixesTrackingTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachedFixesTrackingTableViewCell.swift; sourceTree = "<group>"; };
C89C5FCF1D06CF46002AAAD2 /* ModeTrackingTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ModeTrackingTableViewCell.swift; sourceTree = "<group>"; };
C89C5FC91D06CECD002AAAD2 /* TrackingViewStatusCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrackingViewStatusCell.swift; sourceTree = "<group>"; };
C89C5FCB1D06CF0C002AAAD2 /* TrackingViewGPSAccuracyCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrackingViewGPSAccuracyCell.swift; sourceTree = "<group>"; };
C89C5FCD1D06CF26002AAAD2 /* TrackingViewGPSFixesCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrackingViewGPSFixesCell.swift; sourceTree = "<group>"; };
C89C5FCF1D06CF46002AAAD2 /* TrackingViewModeCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrackingViewModeCell.swift; sourceTree = "<group>"; };
C8A4400A1C18153600DF70A0 /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; };
C8B31F771B68DAD400C8A809 /* Pods.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Pods.xcodeproj; path = Pods/Pods.xcodeproj; sourceTree = "<group>"; };
C8BBAC781C52649E004CA551 /* LicenseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LicenseViewController.swift; sourceTree = "<group>"; };
C8D5E81C1D479FA800DA0D61 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = "<group>"; };
C8F1B1E01D488B6D004C3379 /* Translation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Translation.swift; sourceTree = "<group>"; };
CDE153BDE8C83E9A084A24F1 /* libPods-SAPTrackerTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-SAPTrackerTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
@@ -1122,16 +1122,17 @@
7F83F15319F154F000C53328 /* Supporting Files */ = {
isa = PBXGroup;
children = (
C85291511D48FB91009E9A9D /* Localizable.strings */,
C8D5E81C1D479FA800DA0D61 /* Main.storyboard */,
9ECBDDAD1C9C4F0300F76AEB /* LaunchScreen.storyboard */,
7F83F15919F154F000C53328 /* Main.storyboard */,
7F4D2F531A1C8EE50038E7D1 /* Images.xcassets */,
7F87DDDD1A97339300704AC4 /* Localizable.strings */,
7FD9D3021A1236080058FEAD /* Extensions.swift */,
9E95C3D51C723AB30016632B /* Constants.swift */,
C8603D491C528832002B2F28 /* Acknowledgements.markdown */,
7F83F15419F154F000C53328 /* Info.plist */,
7F03FD3F19FA4D7400FA1327 /* bridge.h */,
C8A4400A1C18153600DF70A0 /* Settings.bundle */,
C8F1B1E01D488B6D004C3379 /* Translation.swift */,
);
name = "Supporting Files";
sourceTree = "<group>";
@@ -1260,10 +1261,10 @@
C89C5FC81D06CEA0002AAAD2 /* Cells */ = {
isa = PBXGroup;
children = (
C89C5FC91D06CECD002AAAD2 /* StatusTrackingTableViewCell.swift */,
C89C5FCB1D06CF0C002AAAD2 /* GPSAccuracyTrackingTableViewCell.swift */,
C89C5FCD1D06CF26002AAAD2 /* CachedFixesTrackingTableViewCell.swift */,
C89C5FCF1D06CF46002AAAD2 /* ModeTrackingTableViewCell.swift */,
C89C5FC91D06CECD002AAAD2 /* TrackingViewStatusCell.swift */,
C89C5FCB1D06CF0C002AAAD2 /* TrackingViewGPSAccuracyCell.swift */,
C89C5FCD1D06CF26002AAAD2 /* TrackingViewGPSFixesCell.swift */,
C89C5FCF1D06CF46002AAAD2 /* TrackingViewModeCell.swift */,
);
name = Cells;
sourceTree = "<group>";
@@ -1368,6 +1369,7 @@
TargetAttributes = {
7F83F14F19F154F000C53328 = {
CreatedOnToolsVersion = 6.0.1;
DevelopmentTeam = RRE8EFVCE3;
};
7F83F16419F154F000C53328 = {
CreatedOnToolsVersion = 6.0.1;
@@ -1529,7 +1531,6 @@
7F14A15E1A13B9A6001C1ECB /* ER.png in Resources */,
7F14A12F1A13B9A6001C1ECB /* BB.png in Resources */,
7F14A13B1A13B9A6001C1ECB /* BR.png in Resources */,
7F83F15B19F154F000C53328 /* Main.storyboard in Resources */,
7F14A1E01A13B9A6001C1ECB /* SH.png in Resources */,
7F14A1261A13B9A6001C1ECB /* AQ.png in Resources */,
7F14A1A41A13B9A6001C1ECB /* MA.png in Resources */,
@@ -1538,7 +1539,6 @@
7F14A1351A13B9A6001C1ECB /* BI.png in Resources */,
7F14A1BB1A13B9A6001C1ECB /* NA.png in Resources */,
7F14A1B71A13B9A6001C1ECB /* MW.png in Resources */,
7F87DDDB1A97339300704AC4 /* Localizable.strings in Resources */,
7F14A1711A13B9A6001C1ECB /* GN.png in Resources */,
7F14A19C1A13B9A6001C1ECB /* LICENSE.txt in Resources */,
7F14A18C1A13B9A6001C1ECB /* JP.png in Resources */,
@@ -1603,6 +1603,7 @@
7F14A1561A13B9A6001C1ECB /* DK.png in Resources */,
7F14A18B1A13B9A6001C1ECB /* JO.png in Resources */,
7F14A1441A13B9A6001C1ECB /* CF.png in Resources */,
C852914F1D48FB91009E9A9D /* Localizable.strings in Resources */,
7F14A1BC1A13B9A6001C1ECB /* NC.png in Resources */,
7F14A1FA1A13B9A6001C1ECB /* TV.png in Resources */,
7F14A1EA1A13B9A6001C1ECB /* SV.png in Resources */,
@@ -1641,6 +1642,7 @@
7F14A1FC1A13B9A6001C1ECB /* TZ.png in Resources */,
7F14A1A91A13B9A6001C1ECB /* MG.png in Resources */,
7F4D2F541A1C8EE50038E7D1 /* Images.xcassets in Resources */,
C8D5E81D1D479FA800DA0D61 /* Main.storyboard in Resources */,
7F14A1D51A13B9A6001C1ECB /* QA.png in Resources */,
7F14A10A1A13B9A6001C1ECB /* _abkhazia.png in Resources */,
7F14A1851A13B9A6001C1ECB /* IQ.png in Resources */,
@@ -1863,7 +1865,7 @@
C8739E0C1D2AA2A500A89F3C /* Event+CoreDataProperties.swift in Sources */,
C8739E071D2AA2A500A89F3C /* GPSFix.swift in Sources */,
7F44095B19F65B5B0021BF22 /* CoreData.xcdatamodeld in Sources */,
C89C5FD01D06CF46002AAAD2 /* ModeTrackingTableViewCell.swift in Sources */,
C89C5FD01D06CF46002AAAD2 /* TrackingViewModeCell.swift in Sources */,
7F1B66F91A0CDCF600904A41 /* BatteryManager.swift in Sources */,
7FA6551A19F6661900A1B92D /* CoreDataManager.swift in Sources */,
C852BAA21CF5E1EA0093B0C5 /* RequestManager.swift in Sources */,
@@ -1871,9 +1873,9 @@
7F23F0881A1A3DEF00F03F1C /* CheckInController.swift in Sources */,
C84936291D47645F000F30E8 /* HomeViewRegattaTableViewCell.swift in Sources */,
7F2C605A19F160E400C32D93 /* LocationManager.swift in Sources */,
C89C5FCC1D06CF0C002AAAD2 /* GPSAccuracyTrackingTableViewCell.swift in Sources */,
C89C5FCC1D06CF0C002AAAD2 /* TrackingViewGPSAccuracyCell.swift in Sources */,
C8739E041D2AA2A500A89F3C /* Regatta+CoreDataProperties.swift in Sources */,
C89C5FCA1D06CECD002AAAD2 /* StatusTrackingTableViewCell.swift in Sources */,
C89C5FCA1D06CECD002AAAD2 /* TrackingViewStatusCell.swift in Sources */,
C8739E051D2AA2A500A89F3C /* Regatta.swift in Sources */,
7F8B8D3F1A37356C00C34B88 /* TrackingPageViewController.swift in Sources */,
C84936181D40D295000F30E8 /* GPSFixController.swift in Sources */,
@@ -1888,12 +1890,13 @@
C89C5FC51D06A289002AAAD2 /* GradientView.swift in Sources */,
C852BAAB1CF736680093B0C5 /* Preferences.swift in Sources */,
7F0658FD19F7D6700077FF95 /* ScanViewController.swift in Sources */,
C8F1B1E11D488B6D004C3379 /* Translation.swift in Sources */,
C8739E061D2AA2A500A89F3C /* GPSFix+CoreDataProperties.swift in Sources */,
7F193A8F1A39ACF500D71773 /* TimerViewController.swift in Sources */,
C8739E181D2BF2DC00A89F3C /* BaseData.swift in Sources */,
7F83F15619F154F000C53328 /* AppDelegate.swift in Sources */,
7F950A911A35E967003C8C5C /* LeaderboardViewController.swift in Sources */,
C89C5FCE1D06CF26002AAAD2 /* CachedFixesTrackingTableViewCell.swift in Sources */,
C89C5FCE1D06CF26002AAAD2 /* TrackingViewGPSFixesCell.swift in Sources */,
C8739E0B1D2AA2A500A89F3C /* Competitor.swift in Sources */,
7F0658FF19F7EE910077FF95 /* RegattaData.swift in Sources */,
7F193A911A39E54600D71773 /* GPSAccuracyView.swift in Sources */,
@@ -1919,24 +1922,6 @@
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
7F83F15919F154F000C53328 /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
7F83F15A19F154F000C53328 /* Base */,
C8739D891D21276B00A89F3C /* de */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
7F87DDDD1A97339300704AC4 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
7F87DDDC1A97339300704AC4 /* Base */,
7F87DDDF1A9733B200704AC4 /* de */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
7F87DDE21A973C7400704AC4 /* eula-ios.html */ = {
isa = PBXVariantGroup;
children = (
@@ -1946,6 +1931,14 @@
name = "eula-ios.html";
sourceTree = "<group>";
};
C85291511D48FB91009E9A9D /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
C85291501D48FB91009E9A9D /* Base */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
@@ -10,28 +10,42 @@ import Foundation
class AboutViewController: UIViewController {
@IBOutlet weak var textView: UITextView!
@IBOutlet weak var versionDescriptionLabel: UILabel!
@IBOutlet weak var partnershipTextView: UITextView!
@IBOutlet weak var licenseInformationButton: UIButton!
@IBOutlet weak var termsButton: UIButton!
@IBOutlet weak var versionTitleLabel: UILabel!
@IBOutlet weak var versionLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad();
super.viewDidLoad()
setup()
}
override func viewDidLayoutSubviews() {
partnershipTextView.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: false)
}
// MARK: - Setup
private func setup() {
setupLocalization()
setupNavigationBar()
setupVersion()
}
override func viewDidLayoutSubviews() {
textView.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: false)
private func setupLocalization() {
navigationItem.title = Translation.AboutView.Title.String
partnershipTextView.text = Translation.AboutView.PartnershipTextView.Text.String
licenseInformationButton.setTitle(Translation.LicenseView.Title.String, forState: .Normal)
termsButton.setTitle(Translation.AboutView.TermsButton.Title.String, forState: .Normal)
versionTitleLabel.text = Translation.AboutView.VersionTitleLabel.Text.String
}
// MARK: - Setups
private func setupNavigationBar() {
navigationItem.leftBarButtonItem = UIBarButtonItem(customView: UIImageView(image: UIImage(named: "sap_logo")))
}
private func setupVersion() {
versionDescriptionLabel.text = NSLocalizedString("Version", comment: "")
versionLabel.text = NSBundle.mainBundle().infoDictionary?["CFBundleVersion"] as? String ?? "-"
}
@@ -18,11 +18,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
// Initialize core data, migrate database if needed, or delete if migration needed but not possible
CoreDataManager.sharedManager
// Setup
setupAFNetworking()
setupNavigationBarApperance()
setupPageControlApperance()
setup()
return true
}
@@ -55,7 +51,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
CoreDataManager.sharedManager.saveContext()
}
// MARK: - Setups
// MARK: - Setup
private func setup() {
setupAFNetworking()
setupNavigationBarApperance()
setupPageControlApperance()
}
private func setupAFNetworking() {
AFNetworkActivityIndicatorManager.sharedManager().enabled = true
@@ -14,6 +14,11 @@ class BatteryManager: NSObject {
static let Min: Float = 0.2
}
struct SendingInterval {
static let Normal: NSTimeInterval = 3
static let BatterySaving: NSTimeInterval = 30
}
private let device: UIDevice!
class var sharedManager: BatteryManager {
@@ -26,11 +31,15 @@ class BatteryManager: NSObject {
override init() {
device = UIDevice.currentDevice()
super.init()
setupDevice()
setup()
}
// MARK: - Setup
private func setup() {
setupDevice()
}
private func setupDevice() {
device.batteryMonitoringEnabled = true
}
@@ -39,6 +48,8 @@ class BatteryManager: NSObject {
var batterySaving: Bool { get { return Preferences.batterySaving || forceBatterySaving() } }
var sendingPeriod: NSTimeInterval { get { return batterySaving ? SendingInterval.BatterySaving : SendingInterval.Normal } }
// MARK: - Helper
private func forceBatterySaving() -> Bool {
@@ -40,13 +40,14 @@ class CheckInController : NSObject {
}
private func checkInSuccess(regattaData: RegattaData, completion: (withSuccess: Bool) -> Void) {
let alertController = UIAlertController(title: regattaData.welcomeString, message: nil, preferredStyle: .Alert)
let okTitle = NSLocalizedString("OK", comment: "")
let okAction = UIAlertAction(title: okTitle, style: .Default) { (action) in
let alertController = UIAlertController(title: String(format: Translation.CheckInController.WelcomeAlert.Title.String, regattaData.competitorData.name),
message: String(format: Translation.CheckInController.WelcomeAlert.Message.String, regattaData.competitorData.sailID),
preferredStyle: .Alert
)
let okAction = UIAlertAction(title: Translation.Common.OK.String, style: .Default) { (action) in
self.postCheckIn(regattaData, completion: completion)
}
let cancelTitle = NSLocalizedString("Cancel", comment: "")
let cancelAction = UIAlertAction(title: cancelTitle, style: .Cancel) { (action) in
let cancelAction = UIAlertAction(title: Translation.CheckInController.WelcomeAlert.CancelAction.Title.String, style: .Cancel) { (action) in
self.checkInDidFinish(withSuccess: false, completion: completion)
}
alertController.addAction(okAction)
@@ -56,8 +57,7 @@ class CheckInController : NSObject {
private func checkInFailure(title: String, error: NSError, completion: (withSuccess: Bool) -> Void) {
let alertController = UIAlertController(title: title, message: error.localizedDescription, preferredStyle: .Alert)
let cancelTitle = NSLocalizedString("Cancel", comment: "")
let cancelAction = UIAlertAction(title: cancelTitle, style: .Cancel) { (action) in
let cancelAction = UIAlertAction(title: Translation.Common.Cancel.String, style: .Cancel) { (action) in
self.checkInDidFinish(withSuccess: false, completion: completion)
}
alertController.addAction(cancelAction)
@@ -95,10 +95,11 @@ class CheckInController : NSObject {
}
private func postCheckInFailure(regattaData: RegattaData, error: AnyObject, completion: (withSuccess: Bool) -> Void) {
let alertTitle = String(format:NSLocalizedString("Couldn't check-in to %@", comment: ""), regattaData.leaderboardName)
let alertController = UIAlertController(title: alertTitle, message: error.localizedDescription, preferredStyle: .Alert)
let cancelTitle = NSLocalizedString("Cancel", comment: "")
let cancelAction = UIAlertAction(title: cancelTitle, style: .Cancel) { (action) in
let alertController = UIAlertController(title: Translation.Common.Error.String,
message: Translation.CheckInController.PostCheckInFailureAlert.Message.String,
preferredStyle: .Alert
)
let cancelAction = UIAlertAction(title: Translation.Common.Cancel.String, style: .Cancel) { (action) in
self.checkInDidFinish(withSuccess: false, completion: completion)
}
alertController.addAction(cancelAction)
@@ -8,6 +8,10 @@
import Foundation
struct Application {
static let Title = "SAP Sail InSight"
}
struct URLs {
static let EULA = NSURL(string: "http://www.sapsailing.com/EULA_iOS_SailingBoatTracker.html")!
}
@@ -12,22 +12,32 @@ class CourseViewController: UIViewController {
private let defaultCourseText = "- °"
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var courseLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
self.setupCourseLabel(-1.0)
self.subscribeForNotifications()
setup()
subscribeForNotifications()
}
deinit {
self.unsubscribeFromNotifications()
unsubscribeFromNotifications()
}
// MARK: - Setups
// MARK: - Setup
private func setup() {
setupCourseLabel(-1.0)
setupLocalization()
}
private func setupCourseLabel(course: Double) {
self.courseLabel.text = course < 0 ? defaultCourseText : String(format: "%.0f °", course)
courseLabel.text = course < 0 ? defaultCourseText : String(format: "%.0f °", course)
}
private func setupLocalization() {
titleLabel.text = Translation.CourseView.TitleLabel.Text.String
}
// MARK: - Notifications
@@ -47,14 +57,14 @@ class CourseViewController: UIViewController {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
func locationManagerUpdated(notification: NSNotification) {
@objc private func locationManagerUpdated(notification: NSNotification) {
dispatch_async(dispatch_get_main_queue(), {
guard let locationData = notification.userInfo?[LocationManager.UserInfo.LocationData] as? LocationData else { return }
self.setupCourseLabel(locationData.location.course)
})
}
func locationManagerFailed(notification: NSNotification) {
@objc private func locationManagerFailed(notification: NSNotification) {
dispatch_async(dispatch_get_main_queue(), {
self.setupCourseLabel(-1.0)
})
@@ -29,7 +29,7 @@ class GPSAccuracyView : UIView {
}
private func initialize() {
setups()
setup()
subscribeForNotifications()
}
@@ -37,9 +37,9 @@ class GPSAccuracyView : UIView {
unsubscribeFromNotifications()
}
// MARK: - Setups
// MARK: - Setup
private func setups() {
private func setup() {
setupBarView()
setupBackroundColor()
}
@@ -72,14 +72,14 @@ class GPSAccuracyView : UIView {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
func locationManagerUpdated(notification: NSNotification) {
@objc private func locationManagerUpdated(notification: NSNotification) {
dispatch_async(dispatch_get_main_queue(), {
guard let locationData = notification.userInfo?[LocationManager.UserInfo.LocationData] as? LocationData else { return }
self.drawBar(locationData.location.horizontalAccuracy)
})
}
func locationManagerFailed(notification: NSNotification) {
@objc private func locationManagerFailed(notification: NSNotification) {
dispatch_async(dispatch_get_main_queue(), {
self.drawBar(-1.0)
})
@@ -19,21 +19,20 @@ class GPSFixController: NSObject {
}
struct GPSFixSending {
// FIXME: - Change me back to 1000
static let SliceSize = 10
static let SliceSize = 1000
}
enum Mode: String {
case BatterySaving
case Error
case Online
case Offline
case Online
var description: String {
switch self {
case .BatterySaving: return NSLocalizedString("Battery Saving", comment: "")
case .Error: return NSLocalizedString("Error", comment: "")
case .Offline: return NSLocalizedString("Offline", comment: "")
case .Online: return NSLocalizedString("Online", comment: "")
case .BatterySaving: return Translation.GPSFixController.Mode.BatterySaving.String
case .Error: return Translation.GPSFixController.Mode.Error.String
case .Offline: return Translation.GPSFixController.Mode.Offline.String
case .Online: return Translation.GPSFixController.Mode.Online.String
}
}
}
@@ -11,6 +11,12 @@ import CoreData
class HomeViewController: UIViewController {
private struct Segue {
static let About = "About"
static let Scan = "Scan"
static let Settings = "Settings"
}
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var scanCodeButton: UIButton!
@@ -19,7 +25,7 @@ class HomeViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setups()
setup()
}
override func viewDidAppear(animated: Bool) {
@@ -33,11 +39,11 @@ class HomeViewController: UIViewController {
unsubscribeFromNewCheckInURLNotifications()
}
// MARK: - Setups
// MARK: - Setup
private func setups() {
private func setup() {
setupButtons()
setupLanguage()
setupLocalization()
setupNavigationBar()
setupTableView()
setupTableViewDataSource()
@@ -48,12 +54,12 @@ class HomeViewController: UIViewController {
noCodeButton.setBackgroundImage(Images.GrayHighlighted, forState: .Highlighted)
}
private func setupLanguage() {
navigationItem.title = NSLocalizedString("Header", comment: "")
titleLabel.text = NSLocalizedString("Your Regattas", comment: "")
scanCodeButton.setTitle(NSLocalizedString("Scan Code", comment: ""), forState: .Normal)
noCodeButton.setTitle(NSLocalizedString("No Code", comment: ""), forState: .Normal)
infoCodeLabel.text = NSLocalizedString("QR found", comment: "")
private func setupLocalization() {
navigationItem.title = Application.Title
titleLabel.text = Translation.HomeView.TableView.Title.String
scanCodeButton.setTitle(Translation.ScanView.Title.String, forState: .Normal)
noCodeButton.setTitle(Translation.HomeView.NoCodeAlert.Title.String, forState: .Normal)
infoCodeLabel.text = Translation.HomeView.InfoCodeLabel.Text.String
}
private func setupNavigationBar() {
@@ -91,21 +97,20 @@ class HomeViewController: UIViewController {
private func reviewTerms(completion: () -> Void) {
guard Preferences.termsAccepted == false else { completion(); return }
let alertTitle = NSLocalizedString("EULA_title", comment: "")
let alertMessage = NSLocalizedString("EULA_content", comment: "")
let alertController = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: .Alert)
let viewTitle = NSLocalizedString("EULA_view", comment: "")
let viewAction = UIAlertAction(title: viewTitle, style: .Cancel, handler: { action in
let alertController = UIAlertController(title: Translation.HomeView.TermsAlert.Title.String,
message: Translation.HomeView.TermsAlert.Message.String,
preferredStyle: .Alert
)
let showTermsAction = UIAlertAction(title: Translation.HomeView.TermsAlert.ShowTermsAction.Title.String, style: .Cancel) { action in
UIApplication.sharedApplication().openURL(URLs.EULA)
self.reviewTerms(completion) // Review terms until user accepted terms
})
let confirmTitle = NSLocalizedString("EULA_confirm", comment: "")
let confirmAction = UIAlertAction(title: confirmTitle, style: .Default, handler: { action in
}
let acceptTermsAction = UIAlertAction(title: Translation.HomeView.TermsAlert.AcceptTermsAction.Title.String, style: .Default) { action in
Preferences.termsAccepted = true
completion() // Terms accepted
})
alertController.addAction(viewAction)
alertController.addAction(confirmAction)
}
alertController.addAction(showTermsAction)
alertController.addAction(acceptTermsAction)
presentViewController(alertController, animated: true, completion: nil)
}
@@ -169,42 +174,54 @@ class HomeViewController: UIViewController {
// MARK: - Actions
@IBAction func optionButtonTap(sender: AnyObject) {
@IBAction func optionButtonTapped(sender: AnyObject) {
let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet)
if let popoverController = alertController.popoverPresentationController {
popoverController.barButtonItem = sender as? UIBarButtonItem
}
let settingsAction = UIAlertAction(title: NSLocalizedString("Settings", comment: ""), style: .Default) { (action) -> Void in
self.performSegueWithIdentifier("SettingsFromHome", sender: alertController)
let settingsAction = UIAlertAction(title: Translation.SettingsView.Title.String, style: .Default) { (action) -> Void in
self.performSegueWithIdentifier(Segue.Settings, sender: alertController)
}
let aboutAction = UIAlertAction(title: NSLocalizedString("About", comment: ""), style: .Default) { (action) -> Void in
self.performSegueWithIdentifier("AboutFromHome", sender: alertController)
let aboutAction = UIAlertAction(title: Translation.AboutView.Title.String, style: .Default) { (action) -> Void in
self.performSegueWithIdentifier(Segue.About, sender: alertController)
}
let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .Cancel, handler: nil)
let cancelAction = UIAlertAction(title: Translation.Common.Cancel.String, style: .Cancel, handler: nil)
alertController.addAction(settingsAction)
alertController.addAction(aboutAction)
alertController.addAction(cancelAction)
presentViewController(alertController, animated: true, completion: nil)
}
@IBAction func scanButtonTap(sender: AnyObject) {
@IBAction func scanButtonTapped(sender: AnyObject) {
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera) {
performSegueWithIdentifier("Scan", sender: sender)
performSegueWithIdentifier(Segue.Scan, sender: sender)
} else {
let alertTitle = NSLocalizedString("No camera available.", comment: "")
let alertController = UIAlertController(title: alertTitle, message: nil, preferredStyle: .Alert)
let cancelTitle = NSLocalizedString("Cancel", comment: "")
let cancelAction = UIAlertAction(title: cancelTitle, style: .Cancel, handler: nil)
alertController.addAction(cancelAction)
presentViewController(alertController, animated: true, completion: nil)
showNoCameraAlert()
}
}
@IBAction func noCodeButtonTap(sender: AnyObject) {
let alertTitle = NSLocalizedString("In order to use this app you need to check-in via QR code or email link. Please contact the racing committee if you need either.", comment: "")
let alertController = UIAlertController(title: alertTitle, message: nil, preferredStyle: .Alert)
let cancelTitle = NSLocalizedString("Cancel", comment: "")
let cancelAction = UIAlertAction(title: cancelTitle, style: .Cancel, handler: nil)
@IBAction func noCodeButtonTapped(sender: AnyObject) {
showNoCodeAlert()
}
// MARK: - Alerts
private func showNoCameraAlert() {
let alertController = UIAlertController(title: Translation.Common.Error.String,
message: Translation.HomeView.NoCameraAlert.Message.String,
preferredStyle: .Alert
)
let cancelAction = UIAlertAction(title: Translation.Common.Cancel.String, style: .Cancel, handler: nil)
alertController.addAction(cancelAction)
presentViewController(alertController, animated: true, completion: nil)
}
private func showNoCodeAlert() {
let alertController = UIAlertController(title: Translation.HomeView.NoCodeAlert.Title.String,
message: Translation.HomeView.NoCodeAlert.Message.String,
preferredStyle: .Alert
)
let cancelAction = UIAlertAction(title: Translation.Common.OK.String, style: .Cancel, handler: nil)
alertController.addAction(cancelAction)
presentViewController(alertController, animated: true, completion: nil)
}
@@ -30,7 +30,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>37</string>
<string>2.0.0-rc0</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>
@@ -17,10 +17,19 @@ class LeaderboardViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setup()
}
// MARK: - Setup
private func setup() {
setupLocalization()
setupWebView()
}
// MARK: - Setups
private func setupLocalization() {
navigationItem.title = Translation.LeaderboardView.Title.String
}
private func setupWebView() {
guard let url = regatta.leaderboardURL() else { return }
@@ -45,11 +54,8 @@ extension LeaderboardViewController: UIWebViewDelegate {
func webView(webView: UIWebView, didFailLoadWithError error: NSError?) {
activityIndicator.stopAnimating()
// FIXME: - Translation
let alertTitle = NSLocalizedString("Couldn't load leaderboard view", comment: "")
let alertController = UIAlertController(title: alertTitle, message: nil, preferredStyle: .Alert)
let okTitle = NSLocalizedString("OK", comment: "")
let okAction = UIAlertAction(title: okTitle, style: .Default) { (action) in
let alertController = UIAlertController(title: error?.localizedDescription, message: nil, preferredStyle: .Alert)
let okAction = UIAlertAction(title: Translation.Common.OK.String, style: .Default) { (action) in
self.presentingViewController!.dismissViewControllerAnimated(true, completion: nil)
}
alertController.addAction(okAction)
@@ -14,6 +14,7 @@ class LicenseViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.title = Translation.LicenseView.Title.String
if let file = NSBundle.mainBundle().pathForResource("Acknowledgements", ofType: "markdown") {
let license = try? NSString(contentsOfFile: file, encoding: NSUTF8StringEncoding)
if (license != nil) {
@@ -21,15 +21,27 @@ class LocationManager: NSObject {
struct UserInfo {
static let Error = "NSError"
static let LocationData = "LocationData"
static let Status = "Status"
}
enum Status: String {
case Tracking
case NotTracking
var description: String {
switch self {
case .Tracking: return Translation.LocationManager.Status.Tracking.String
case .NotTracking: return Translation.LocationManager.Status.NotTracking.String
}
}
}
enum LocationManagerError: ErrorType {
case LocationServicesDisabled
case LocationServicesDenied
case LocationServicesDisabled
var description: String {
switch self {
case .LocationServicesDenied: return NSLocalizedString("Please enable location services for this app.", comment: "")
case .LocationServicesDisabled: return NSLocalizedString("Please enable location services.", comment: "")
case .LocationServicesDenied: return Translation.LocationManager.LocationServicesDeniedError.String
case .LocationServicesDisabled: return Translation.LocationManager.LocationServicesDisabledError.String
}
}
}
@@ -47,10 +59,14 @@ class LocationManager: NSObject {
override init() {
locationManager = CLLocationManager()
super.init()
setupLocationManager()
setup()
}
// MARK: - Setups
// MARK: - Setup
private func setup() {
setupLocationManager()
}
private func setupLocationManager() {
locationManager.pausesLocationUpdatesAutomatically = false;
@@ -12,6 +12,7 @@
<string>OpenSans-Bold</string>
<string>OpenSans-Bold</string>
<string>OpenSans-Bold</string>
<string>OpenSans-Bold</string>
</mutableArray>
<mutableArray key="OpenSans-Light.ttf">
<string>OpenSans-Light</string>
@@ -51,7 +52,6 @@
<string>OpenSans</string>
<string>OpenSans</string>
<string>OpenSans</string>
<string>OpenSans</string>
</mutableArray>
<mutableArray key="OpenSans-Semibold.ttf">
<string>OpenSans-Semibold</string>
@@ -82,7 +82,7 @@
<rect key="frame" x="0.0" y="0.0" width="600" height="52"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="lc2-1P-oDt">
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Title Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="lc2-1P-oDt">
<rect key="frame" x="20" y="0.0" width="580" height="52"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="18"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
@@ -114,20 +114,26 @@
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="252" text="Event Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4Xi-He-o21">
<rect key="frame" x="20" y="8" width="140.5" height="25"/>
<fontDescription key="fontDescription" name="OpenSans-Bold" family="Open Sans" pointSize="18"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
<variation key="heightClass=compact-widthClass=compact" ambiguous="YES">
<rect key="frame" x="20" y="8" width="104" height="25"/>
</variation>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Competitor Label" textAlignment="right" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sNr-Dr-sM5">
<rect key="frame" x="168" y="8" width="411.5" height="64.5"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="16"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Leaderboard Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yqN-BN-c2a">
<rect key="frame" x="20" y="41" width="140.5" height="31"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="16"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
<variation key="heightClass=compact-widthClass=compact" ambiguous="YES">
<rect key="frame" x="20" y="41" width="104" height="31"/>
</variation>
</label>
</subviews>
<constraints>
@@ -148,7 +154,7 @@
<outlet property="competitorLabel" destination="sNr-Dr-sM5" id="XjN-ac-0yL"/>
<outlet property="eventLabel" destination="4Xi-He-o21" id="W7y-Nr-cR6"/>
<outlet property="leaderboardLabel" destination="yqN-BN-c2a" id="nGQ-81-E6W"/>
<segue destination="G3a-SV-Maf" kind="show" id="XWZ-NP-fiD"/>
<segue destination="G3a-SV-Maf" kind="show" identifier="Regatta" id="XWZ-NP-fiD"/>
</connections>
</tableViewCell>
</prototypes>
@@ -163,12 +169,11 @@
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Ieu-ch-jeI">
<rect key="frame" x="20" y="20" width="560" height="82"/>
<color key="backgroundColor" red="0.0" green="0.61568627450980395" blue="0.8784313725490196" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" label="Scan QR Code"/>
<constraints>
<constraint firstAttribute="height" constant="82" id="1Rc-1w-BvQ"/>
</constraints>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="21"/>
<state key="normal" title="Scan QR Code">
<state key="normal" title="Scan QR Code Button">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
<userDefinedRuntimeAttributes>
@@ -183,7 +188,7 @@
</mask>
</variation>
<connections>
<action selector="scanButtonTap:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="NTk-Cf-y9I"/>
<action selector="scanButtonTapped:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="TG3-39-clp"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Fp0-61-7he">
@@ -194,7 +199,7 @@
<constraint firstAttribute="height" constant="48" id="cof-oZ-s1l"/>
</constraints>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="18"/>
<state key="normal" title="Don't have a QR Code?">
<state key="normal" title="No QR Code Button">
<color key="titleColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
</state>
<userDefinedRuntimeAttributes>
@@ -210,12 +215,11 @@
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="noCodeButtonTap:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="B8s-ZV-ADJ"/>
<action selector="noCodeButtonTapped:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="zSS-Gl-jbg"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="You can find your QR code on your registration confirmation" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" adjustsLetterSpacingToFitWidth="YES" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="OqX-q3-43s">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Info Code Label" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" adjustsLetterSpacingToFitWidth="YES" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="OqX-q3-43s">
<rect key="frame" x="20" y="166" width="560" height="19.5"/>
<accessibility key="accessibilityConfiguration" label="You can find your QR code on your registration confirmation"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="14"/>
<nil key="highlightedColor"/>
<variation key="heightClass=compact" misplaced="YES">
@@ -306,11 +310,11 @@
</variation>
</view>
<toolbarItems/>
<navigationItem key="navigationItem" title="Tracker" id="lqI-5f-PEI">
<navigationItem key="navigationItem" id="lqI-5f-PEI">
<barButtonItem key="backBarButtonItem" title="Home" id="ASu-3l-KjT"/>
<barButtonItem key="rightBarButtonItem" image="settings" id="1wU-M4-Vaw">
<connections>
<action selector="optionButtonTap:" destination="vXZ-lx-hvc" id="UjO-AO-mEo"/>
<action selector="optionButtonTapped:" destination="vXZ-lx-hvc" id="xo4-xU-O5a"/>
</connections>
</barButtonItem>
</navigationItem>
@@ -321,8 +325,8 @@
<outlet property="tableView" destination="OXU-ft-TXZ" id="1BA-dy-00A"/>
<outlet property="titleLabel" destination="lc2-1P-oDt" id="BJe-wC-1Xz"/>
<segue destination="plm-Uw-c62" kind="show" identifier="Scan" id="U8l-If-CrF"/>
<segue destination="4Fb-v3-mkB" kind="presentation" identifier="SettingsFromHome" id="Xxn-jp-xEB"/>
<segue destination="dfN-Ch-vpm" kind="presentation" identifier="AboutFromHome" id="QMa-LQ-D8c"/>
<segue destination="4Fb-v3-mkB" kind="presentation" identifier="Settings" id="Xxn-jp-xEB"/>
<segue destination="dfN-Ch-vpm" kind="presentation" identifier="About" id="QMa-LQ-D8c"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="x5A-6p-PRh" sceneMemberID="firstResponder"/>
@@ -345,7 +349,7 @@
</objects>
<point key="canvasLocation" x="436" y="-307"/>
</scene>
<!--Scan QR Code-->
<!--Scan View Controller-->
<scene sceneID="k9g-QH-Z7I">
<objects>
<viewController id="plm-Uw-c62" customClass="ScanViewController" customModule="SAPTracker" customModuleProvider="target" sceneMemberID="viewController">
@@ -379,7 +383,7 @@
<constraint firstItem="ttp-CB-QaR" firstAttribute="leading" secondItem="pUL-en-Wee" secondAttribute="leading" id="tda-yG-hJZ"/>
</constraints>
</view>
<navigationItem key="navigationItem" title="Scan QR Code" id="LQ4-39-f6l"/>
<navigationItem key="navigationItem" id="LQ4-39-f6l"/>
<connections>
<outlet property="previewView" destination="ttp-CB-QaR" id="D7j-aT-pIK"/>
<outlet property="targetImageView" destination="doL-JD-57p" id="55W-0c-5YO"/>
@@ -389,7 +393,7 @@
</objects>
<point key="canvasLocation" x="1971" y="-1116"/>
</scene>
<!--Regatta-->
<!--Regatta View Controller-->
<scene sceneID="kcD-1R-9q1">
<objects>
<viewController id="G3a-SV-Maf" customClass="RegattaViewController" customModule="SAPTracker" customModuleProvider="target" sceneMemberID="viewController">
@@ -411,29 +415,29 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="2UK-je-59c" userLabel="Competitor View">
<rect key="frame" x="0.0" y="204.5" width="600" height="38"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="GER 17" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="iIf-9z-7fe">
<rect key="frame" x="526" y="8" width="54" height="22"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Sail ID Label" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="iIf-9z-7fe">
<rect key="frame" x="483" y="8" width="97" height="22"/>
<fontDescription key="fontDescription" name="OpenSans-Bold" family="Open Sans" pointSize="16"/>
<nil key="highlightedColor"/>
<variation key="heightClass=compact" misplaced="YES">
<variation key="heightClass=compact" ambiguous="YES" misplaced="YES">
<rect key="frame" x="224.5" y="9.5" width="55.5" height="19"/>
</variation>
</label>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="DE.png" translatesAutoresizingMaskIntoConstraints="NO" id="szG-Mg-huO">
<rect key="frame" x="494" y="7" width="24" height="24"/>
<rect key="frame" x="451" y="7" width="24" height="24"/>
<constraints>
<constraint firstAttribute="width" constant="24" id="Ina-uK-atY"/>
<constraint firstAttribute="height" constant="24" id="TVX-WF-dOi"/>
</constraints>
<variation key="heightClass=compact" misplaced="YES">
<variation key="heightClass=compact" ambiguous="YES" misplaced="YES">
<rect key="frame" x="192.5" y="7" width="24" height="24"/>
</variation>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Max Mustermann" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="oJS-dM-2B6" userLabel="Name Label">
<rect key="frame" x="20" y="8" width="142" height="22"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Competitor Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="oJS-dM-2B6" userLabel="Name Label">
<rect key="frame" x="20" y="8" width="139" height="22"/>
<fontDescription key="fontDescription" name="OpenSans-Bold" family="Open Sans" pointSize="16"/>
<nil key="highlightedColor"/>
<variation key="heightClass=compact" misplaced="YES">
<variation key="heightClass=compact" ambiguous="YES" misplaced="YES">
<rect key="frame" x="20" y="9.5" width="125.5" height="19"/>
</variation>
</label>
@@ -461,11 +465,10 @@
<constraint firstAttribute="width" constant="260" id="5jL-oY-VM2"/>
<constraint firstAttribute="height" constant="33" id="ZOg-nP-2k3"/>
</constraints>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="13"/>
<fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="18"/>
<inset key="imageEdgeInsets" minX="5" minY="5" maxX="20" maxY="5"/>
<state key="normal" title="Error during upload. Tap to retry." image="retry">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
@@ -492,7 +495,7 @@
</constraints>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="13"/>
<inset key="imageEdgeInsets" minX="5" minY="5" maxX="20" maxY="5"/>
<state key="normal" title="Your Team Photo" image="camera">
<state key="normal" title="Add Team Photo" image="camera">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
@@ -557,7 +560,7 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="7BF-a5-Yua" userLabel="Event View" customClass="GradientView" customModule="SAPTracker" customModuleProvider="target">
<rect key="frame" x="0.0" y="242" width="600" height="293.5"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Regatta starts in" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumFontSize="12" adjustsLetterSpacingToFitWidth="YES" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="ft9-jD-C5m">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Regatta Start Label" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumFontSize="12" adjustsLetterSpacingToFitWidth="YES" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="ft9-jD-C5m">
<rect key="frame" x="20" y="8" width="560" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="VsR-HR-dm0"/>
@@ -567,21 +570,21 @@
<nil key="highlightedColor"/>
</label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6rV-hv-c3D" userLabel="Countdown View">
<rect key="frame" x="186" y="38" width="229" height="50"/>
<rect key="frame" x="119.5" y="38" width="362.5" height="50"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="pjH-rV-MGI" userLabel="Days View">
<rect key="frame" x="0.0" y="0.0" width="76.5" height="50"/>
<rect key="frame" x="0.0" y="0.0" width="121" height="50"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="356" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="sGD-0U-P4b">
<rect key="frame" x="8" y="0.0" width="59" height="29"/>
<rect key="frame" x="8" y="0.0" width="103.5" height="29"/>
<fontDescription key="fontDescription" name="OpenSans-Semibold" family="Open Sans" pointSize="21"/>
<nil key="highlightedColor"/>
<variation key="heightClass=compact" misplaced="YES">
<rect key="frame" x="8" y="0.0" width="55.5" height="24.5"/>
</variation>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Days" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="l8F-Sg-cUb" userLabel="Days Description Label">
<rect key="frame" x="8" y="28" width="59" height="22"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Days Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="l8F-Sg-cUb" userLabel="Days Description Label">
<rect key="frame" x="8" y="28" width="103.5" height="22"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="16"/>
<color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
@@ -590,7 +593,7 @@
</variation>
</label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="joW-cG-ai8" userLabel="Separator View">
<rect key="frame" x="75" y="10" width="1" height="30"/>
<rect key="frame" x="119.5" y="10" width="1" height="30"/>
<color key="backgroundColor" red="0.81960784313725488" green="0.82745098039215681" blue="0.83137254901960778" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="height" constant="30" id="Jj2-tX-SU9"/>
@@ -616,18 +619,18 @@
</variation>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5is-0I-Kv3" userLabel="Hours View">
<rect key="frame" x="76" y="0.0" width="76.5" height="50"/>
<rect key="frame" x="120.5" y="0.0" width="121" height="50"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="24" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="gaG-Iv-Xyq">
<rect key="frame" x="8" y="0.0" width="60.5" height="29"/>
<rect key="frame" x="8" y="0.0" width="105" height="29"/>
<fontDescription key="fontDescription" name="OpenSans-Semibold" family="Open Sans" pointSize="21"/>
<nil key="highlightedColor"/>
<variation key="heightClass=compact" misplaced="YES">
<rect key="frame" x="8" y="0.0" width="57" height="24.5"/>
</variation>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Hours" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="c2J-Uj-KEg" userLabel="Hours Description Label">
<rect key="frame" x="8" y="28" width="60.5" height="22"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Hours Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="c2J-Uj-KEg" userLabel="Hours Description Label">
<rect key="frame" x="8" y="28" width="105" height="22"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="16"/>
<color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
@@ -636,7 +639,7 @@
</variation>
</label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="JBv-xm-KUq" userLabel="Separator View">
<rect key="frame" x="75" y="10" width="1" height="30"/>
<rect key="frame" x="119.5" y="10" width="1" height="30"/>
<color key="backgroundColor" red="0.81960784313725488" green="0.82745098039215681" blue="0.83137254901960778" alpha="1" colorSpace="calibratedRGB"/>
<constraints>
<constraint firstAttribute="width" constant="1" id="Gck-dw-et7"/>
@@ -662,18 +665,18 @@
</variation>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="tvc-eS-Us6" userLabel="Minutes View">
<rect key="frame" x="152" y="0.0" width="76.5" height="50"/>
<rect key="frame" x="241" y="0.0" width="121" height="50"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="59" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Txm-uf-MP4">
<rect key="frame" x="8" y="0.0" width="60.5" height="29"/>
<rect key="frame" x="8" y="0.0" width="105" height="29"/>
<fontDescription key="fontDescription" name="OpenSans-Semibold" family="Open Sans" pointSize="21"/>
<nil key="highlightedColor"/>
<variation key="heightClass=compact" misplaced="YES">
<rect key="frame" x="8" y="0.0" width="57" height="24.5"/>
</variation>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Minutes" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="EES-a9-qxv" userLabel="Minutes Description Label">
<rect key="frame" x="8" y="28" width="60.5" height="22"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Minutes Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="EES-a9-qxv" userLabel="Minutes Description Label">
<rect key="frame" x="8" y="28" width="105" height="22"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="16"/>
<color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
@@ -731,7 +734,7 @@
</constraint>
</constraints>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="16"/>
<state key="normal" title="Zum Event">
<state key="normal" title="Event Button">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
<userDefinedRuntimeAttributes>
@@ -751,7 +754,7 @@
<rect key="frame" x="304" y="96" width="276" height="48"/>
<color key="backgroundColor" red="0.0" green="0.61568627450980395" blue="0.8784313725490196" alpha="1" colorSpace="calibratedRGB"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="16"/>
<state key="normal" title="Leader Board">
<state key="normal" title="Leaderboard Button">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
<userDefinedRuntimeAttributes>
@@ -776,7 +779,7 @@
</constraint>
</constraints>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="21"/>
<state key="normal" title="Start Tracking">
<state key="normal" title="Start Tracking Button">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
<userDefinedRuntimeAttributes>
@@ -789,7 +792,7 @@
<action selector="startTrackingButtonTapped:" destination="G3a-SV-Maf" eventType="touchUpInside" id="x7w-dz-qiZ"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Please listen to announcements" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" adjustsLetterSpacingToFitWidth="YES" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="8aO-2n-aG5">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Announcement Label" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" adjustsLetterSpacingToFitWidth="YES" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="8aO-2n-aG5">
<rect key="frame" x="20" y="254" width="560" height="19.5"/>
<accessibility key="accessibilityConfiguration" label="You can find your QR code on your registration confirmation"/>
<constraints>
@@ -877,21 +880,24 @@
</variation>
</view>
<toolbarItems/>
<navigationItem key="navigationItem" title="Regatta" id="BjQ-Fx-PEX">
<navigationItem key="navigationItem" id="BjQ-Fx-PEX">
<barButtonItem key="rightBarButtonItem" image="settings" id="Zdh-kJ-UMg">
<connections>
<action selector="showMenuActionSheet:" destination="G3a-SV-Maf" id="eCP-ZE-AS5"/>
<action selector="optionButtonTapped:" destination="G3a-SV-Maf" id="OAP-xo-5LR"/>
</connections>
</barButtonItem>
</navigationItem>
<connections>
<outlet property="announcementsLabel" destination="8aO-2n-aG5" id="5h3-tn-BGD"/>
<outlet property="announcementLabel" destination="8aO-2n-aG5" id="hTU-Qr-71I"/>
<outlet property="competitorFlagImageView" destination="szG-Mg-huO" id="icC-yT-XVH"/>
<outlet property="competitorNameLabel" destination="oJS-dM-2B6" id="ASy-VF-D0A"/>
<outlet property="competitorSailLabel" destination="iIf-9z-7fe" id="o0a-iC-YDq"/>
<outlet property="countdownDaysLabel" destination="sGD-0U-P4b" id="yCj-mJ-ZcS"/>
<outlet property="countdownDaysTitleLabel" destination="l8F-Sg-cUb" id="dIl-Tm-bcF"/>
<outlet property="countdownHoursLabel" destination="gaG-Iv-Xyq" id="8Mk-Zj-8HT"/>
<outlet property="countdownHoursTitleLabel" destination="c2J-Uj-KEg" id="6EE-Lj-MNE"/>
<outlet property="countdownMinutesLabel" destination="Txm-uf-MP4" id="Nj1-Bs-f92"/>
<outlet property="countdownMinutesTitleLabel" destination="EES-a9-qxv" id="3Bp-ug-k0e"/>
<outlet property="countdownView" destination="6rV-hv-c3D" id="u1R-m4-2O0"/>
<outlet property="countdownViewHeight" destination="Fcc-aN-a7a" id="a7t-8p-aED"/>
<outlet property="eventButton" destination="Lzv-E6-gsr" id="RSn-dh-P2i"/>
@@ -970,7 +976,7 @@
<constraint firstAttribute="height" constant="82" id="gUJ-QB-hg7"/>
</constraints>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="21"/>
<state key="normal" title="Stop Tracking">
<state key="normal" title="Stop tracking">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
@@ -1015,15 +1021,15 @@
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</view>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="StatusCell" id="mxc-vv-0mg" customClass="StatusTrackingTableViewCell" customModule="SAPTracker" customModuleProvider="target">
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="StatusCell" id="mxc-vv-0mg" customClass="TrackingViewStatusCell" customModule="SAPTracker" customModuleProvider="target">
<rect key="frame" x="0.0" y="28" width="600" height="52"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="mxc-vv-0mg" id="oaH-ID-v9H">
<rect key="frame" x="0.0" y="0.0" width="600" height="51.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Status" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="r6d-OU-cRI">
<rect key="frame" x="20" y="14" width="50" height="24"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Status Title Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="r6d-OU-cRI">
<rect key="frame" x="20" y="14" width="134.5" height="24"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@@ -1034,8 +1040,8 @@
<rect key="frame" x="20" y="35.5" width="49" height="20"/>
</variation>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Tracking Running" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="5Xu-6g-tqP">
<rect key="frame" x="444" y="14" width="136" height="24"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Status Label" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="5Xu-6g-tqP">
<rect key="frame" x="483" y="14" width="96.5" height="24"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="17"/>
<nil key="highlightedColor"/>
<variation key="heightClass=compact" misplaced="YES">
@@ -1056,17 +1062,18 @@
<color key="backgroundColor" red="0.96470588235294119" green="0.98431372549019602" blue="0.98431372549019602" alpha="1" colorSpace="calibratedRGB"/>
<connections>
<outlet property="statusLabel" destination="5Xu-6g-tqP" id="cbN-9Z-2FH"/>
<outlet property="statusTitleLabel" destination="r6d-OU-cRI" id="aHl-3R-Em6"/>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="ModeCell" id="Mzr-tT-IgD" customClass="ModeTrackingTableViewCell" customModule="SAPTracker" customModuleProvider="target">
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="ModeCell" id="Mzr-tT-IgD" customClass="TrackingViewModeCell" customModule="SAPTracker" customModuleProvider="target">
<rect key="frame" x="0.0" y="80" width="600" height="52"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Mzr-tT-IgD" id="CcA-KI-ug9">
<rect key="frame" x="0.0" y="0.0" width="600" height="51.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Mode" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="Xww-rc-pOA">
<rect key="frame" x="20" y="14" width="46" height="24"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Mode Title Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="Xww-rc-pOA">
<rect key="frame" x="20" y="14" width="131" height="24"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@@ -1077,8 +1084,8 @@
<rect key="frame" x="20" y="96" width="44" height="20"/>
</variation>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Online" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="tJY-RR-vpe">
<rect key="frame" x="527.5" y="14" width="52.5" height="23.5"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Mode Label" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="tJY-RR-vpe">
<rect key="frame" x="487" y="14" width="93" height="23.5"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="17"/>
<nil key="highlightedColor"/>
<variation key="heightClass=compact" misplaced="YES">
@@ -1099,17 +1106,18 @@
<color key="backgroundColor" red="0.96470588235294119" green="0.98431372549019602" blue="0.98431372549019602" alpha="1" colorSpace="calibratedRGB"/>
<connections>
<outlet property="modeLabel" destination="tJY-RR-vpe" id="Zez-hT-FyT"/>
<outlet property="modeTitleLabel" destination="Xww-rc-pOA" id="014-63-ZwI"/>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="CachedFixesCell" id="CIE-At-9HG" customClass="CachedFixesTrackingTableViewCell" customModule="SAPTracker" customModuleProvider="target">
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="CachedFixesCell" id="CIE-At-9HG" userLabel="GPSFixesCell" customClass="TrackingViewGPSFixesCell" customModule="SAPTracker" customModuleProvider="target">
<rect key="frame" x="0.0" y="132" width="600" height="52"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="CIE-At-9HG" id="4JB-TV-aZK">
<rect key="frame" x="0.0" y="0.0" width="600" height="51.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Cached Fixes" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="Ujw-jg-ilY">
<rect key="frame" x="20" y="14" width="102" height="24"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="GPS Fixes Title Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="Ujw-jg-ilY">
<rect key="frame" x="20" y="14" width="161" height="24"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@@ -1120,8 +1128,8 @@
<rect key="frame" x="20" y="64" width="104" height="24"/>
</variation>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="dz3-w7-CCh">
<rect key="frame" x="570" y="14" width="10" height="24"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="GPS Fixes Label" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="dz3-w7-CCh">
<rect key="frame" x="456.5" y="14" width="123" height="24"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="17"/>
<nil key="highlightedColor"/>
<variation key="heightClass=compact" misplaced="YES">
@@ -1141,18 +1149,19 @@
</tableViewCellContentView>
<color key="backgroundColor" red="0.96470588235294119" green="0.98431372549019602" blue="0.98431372549019602" alpha="1" colorSpace="calibratedRGB"/>
<connections>
<outlet property="cachedFixesLabel" destination="dz3-w7-CCh" id="e1Z-IG-TBr"/>
<outlet property="gpsFixesLabel" destination="dz3-w7-CCh" id="Drm-Zt-CFK"/>
<outlet property="gpsFixesTitleLabel" destination="Ujw-jg-ilY" id="ilP-Oi-DOl"/>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="GPSAccuracyCell" id="JjT-rE-RVR" customClass="GPSAccuracyTrackingTableViewCell" customModule="SAPTracker" customModuleProvider="target">
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="GPSAccuracyCell" id="JjT-rE-RVR" customClass="TrackingViewGPSAccuracyCell" customModule="SAPTracker" customModuleProvider="target">
<rect key="frame" x="0.0" y="184" width="600" height="52"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="JjT-rE-RVR" id="o3U-rk-dBz">
<rect key="frame" x="0.0" y="0.0" width="600" height="51.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="GPS Accuracy" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="Z1d-5I-pbj">
<rect key="frame" x="20" y="14" width="106.5" height="23.5"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="GPS Accuracy Title Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="Z1d-5I-pbj">
<rect key="frame" x="20" y="14" width="192" height="24"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@@ -1163,8 +1172,8 @@
<rect key="frame" x="20" y="8" width="111" height="20"/>
</variation>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="no GPS" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DiM-MR-SGV">
<rect key="frame" x="502" y="14" width="58" height="24"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="GPS Accuracy Label" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DiM-MR-SGV">
<rect key="frame" x="406" y="14" width="153.5" height="24"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@@ -1198,7 +1207,8 @@
</tableViewCellContentView>
<color key="backgroundColor" red="0.96470588235294119" green="0.98431372549019602" blue="0.98431372549019602" alpha="1" colorSpace="calibratedRGB"/>
<connections>
<outlet property="gpsAccuracyLabel" destination="DiM-MR-SGV" id="1DR-ko-P1P"/>
<outlet property="gpsAccuracyLabel" destination="DiM-MR-SGV" id="vk1-IW-KAW"/>
<outlet property="gpsAccuracyTitleLabel" destination="Z1d-5I-pbj" id="Df9-ZL-AmR"/>
<outlet property="gpsAccuracyView" destination="BFc-m8-XKV" id="LkK-AD-vHl"/>
</connections>
</tableViewCell>
@@ -1248,10 +1258,10 @@
</mask>
</variation>
</view>
<navigationItem key="navigationItem" title="Tracking" id="qfB-FT-Ysz">
<navigationItem key="navigationItem" id="qfB-FT-Ysz">
<barButtonItem key="rightBarButtonItem" image="settings" id="mAh-dw-JIF">
<connections>
<segue destination="4Fb-v3-mkB" kind="presentation" id="HaH-Jc-FNR"/>
<segue destination="4Fb-v3-mkB" kind="presentation" identifier="Settings" id="HaH-Jc-FNR"/>
</connections>
</barButtonItem>
</navigationItem>
@@ -1277,8 +1287,8 @@
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Tracking Time" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="IeZ-JM-OWw" userLabel="Tracking Time Description Label">
<rect key="frame" x="20" y="8" width="109.5" height="24"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Title Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="IeZ-JM-OWw">
<rect key="frame" x="20" y="8" width="80.5" height="24"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@@ -1289,8 +1299,8 @@
<rect key="frame" x="20" y="0.0" width="106" height="24"/>
</variation>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="00:00.00" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="48" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="mUm-EE-6Is">
<rect key="frame" x="20" y="210.5" width="560" height="98.5"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Value Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="48" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="mUm-EE-6Is" userLabel="Time Label">
<rect key="frame" x="115" y="210" width="369" height="98.5"/>
<fontDescription key="fontDescription" name="OpenSans-Light" family="Open Sans" pointSize="72"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@@ -1305,15 +1315,14 @@
<constraints>
<constraint firstAttribute="centerX" secondItem="mUm-EE-6Is" secondAttribute="centerX" id="8mv-fJ-KnI"/>
<constraint firstItem="IeZ-JM-OWw" firstAttribute="top" secondItem="mP6-V4-QPK" secondAttribute="top" constant="8" id="IZk-R3-x2F"/>
<constraint firstAttribute="trailing" secondItem="mUm-EE-6Is" secondAttribute="trailing" constant="20" symbolic="YES" id="ZKy-Zc-RiE"/>
<constraint firstItem="mUm-EE-6Is" firstAttribute="centerY" secondItem="mP6-V4-QPK" secondAttribute="centerY" constant="-41" id="buG-GE-x2S"/>
<constraint firstItem="IeZ-JM-OWw" firstAttribute="leading" secondItem="mP6-V4-QPK" secondAttribute="leading" constant="20" id="eYA-zH-AXy"/>
<constraint firstItem="mUm-EE-6Is" firstAttribute="leading" secondItem="mP6-V4-QPK" secondAttribute="leading" constant="20" symbolic="YES" id="lbB-rJ-KNj"/>
</constraints>
</view>
<navigationItem key="navigationItem" title="Tracking" id="fyS-rY-bYp"/>
<connections>
<outlet property="trackingTimeLabel" destination="mUm-EE-6Is" id="Cfy-RY-HGv"/>
<outlet property="timeLabel" destination="mUm-EE-6Is" id="Vqf-jg-1Jk"/>
<outlet property="titleLabel" destination="IeZ-JM-OWw" id="tTL-LY-thG"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="GLm-so-ieU" userLabel="First Responder" sceneMemberID="firstResponder"/>
@@ -1332,8 +1341,8 @@
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Speed" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="V9h-qX-rao" userLabel="Speed Description Label">
<rect key="frame" x="20" y="8" width="49.5" height="23.5"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Title Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="V9h-qX-rao">
<rect key="frame" x="20" y="8" width="80.5" height="24"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@@ -1341,8 +1350,8 @@
<rect key="frame" x="20" y="8" width="49.5" height="20"/>
</variation>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0.0 kn" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="l5u-i3-029">
<rect key="frame" x="203" y="210" width="195.5" height="98.5"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Value Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="l5u-i3-029">
<rect key="frame" x="115" y="210" width="369" height="98.5"/>
<fontDescription key="fontDescription" name="OpenSans-Light" family="Open Sans" pointSize="72"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@@ -1363,16 +1372,17 @@
</view>
<connections>
<outlet property="speedLabel" destination="l5u-i3-029" id="PUZ-2d-SiJ"/>
<outlet property="titleLabel" destination="V9h-qX-rao" id="sZD-bZ-pEO"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="kik-tb-HMn" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="4902" y="-308"/>
</scene>
<!--Heading-->
<!--Course-->
<scene sceneID="o4R-6Y-BiR">
<objects>
<viewController storyboardIdentifier="Heading" title="Heading" id="pzM-XJ-vUZ" customClass="CourseViewController" customModule="SAPTracker" customModuleProvider="target" sceneMemberID="viewController">
<viewController storyboardIdentifier="Course" title="Heading" id="pzM-XJ-vUZ" userLabel="Course" customClass="CourseViewController" customModule="SAPTracker" customModuleProvider="target" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="1lt-tc-EGw"/>
<viewControllerLayoutGuide type="bottom" id="E5B-M7-7Np"/>
@@ -1381,8 +1391,8 @@
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="COG" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsLetterSpacingToFitWidth="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1Tn-6d-NlO" userLabel="Course Description Label">
<rect key="frame" x="20" y="8" width="36.5" height="23.5"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Title Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsLetterSpacingToFitWidth="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1Tn-6d-NlO">
<rect key="frame" x="20" y="8" width="80.5" height="24"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@@ -1393,8 +1403,8 @@
<rect key="frame" x="20" y="0.0" width="38.5" height="20"/>
</variation>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0 °" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sGK-xV-9a0">
<rect key="frame" x="255" y="210" width="91" height="98.5"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Value Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sGK-xV-9a0">
<rect key="frame" x="116" y="210" width="369" height="98.5"/>
<fontDescription key="fontDescription" name="OpenSans-Light" family="Open Sans" pointSize="72"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@@ -1415,13 +1425,14 @@
</view>
<connections>
<outlet property="courseLabel" destination="sGK-xV-9a0" id="JxC-4B-v4s"/>
<outlet property="titleLabel" destination="1Tn-6d-NlO" id="8dP-1e-h35"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="2c7-d1-yoX" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="4902" y="542"/>
</scene>
<!--About-->
<!--About View Controller-->
<scene sceneID="GmT-NU-h1e">
<objects>
<viewController id="WMr-pC-C12" customClass="AboutViewController" customModule="SAPTracker" customModuleProvider="target" sceneMemberID="viewController">
@@ -1440,131 +1451,7 @@
<rect key="frame" x="20" y="20" width="560" height="256"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<attributedString key="attributedText">
<fragment>
<string key="content">The SAP Sail InSight app supports live tracking of race boats by leveraging mobile phone technology, allowing the ability for friends and fans to follow racing whether onsite or online through live leader boards and 2D visualization. Following racing sailors can replay their races allowing the opportunity to review performance and optimize strategies all available at: </string>
<attributes>
<color key="NSColor" red="0.094117647058823528" green="0.21568627450980393" blue="0.41568627450980394" alpha="1" colorSpace="calibratedRGB"/>
<font key="NSFont" metaFont="system" size="16"/>
<real key="NSKern" value="0.0"/>
<paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="leftToRight" defaultTabInterval="36" tighteningFactorForTruncation="0.0" allowsDefaultTighteningForTruncation="NO">
<tabStops/>
</paragraphStyle>
<color key="NSStrokeColor" red="0.094117647058823528" green="0.21568627450980393" blue="0.41568627450980394" alpha="1" colorSpace="calibratedRGB"/>
</attributes>
</fragment>
<fragment content="sapsailing.com">
<attributes>
<color key="NSColor" red="0.2196078431372549" green="0.43137254901960786" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<font key="NSFont" metaFont="system" size="16"/>
<real key="NSKern" value="0.0"/>
<url key="NSLink" string="http://sapsailing.com/"/>
<paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="leftToRight" defaultTabInterval="36" tighteningFactorForTruncation="0.0" allowsDefaultTighteningForTruncation="NO">
<tabStops/>
</paragraphStyle>
<color key="NSStrokeColor" red="0.2196078431372549" green="0.43137254901960786" blue="1" alpha="1" colorSpace="calibratedRGB"/>
<integer key="NSUnderline" value="1"/>
<color key="NSUnderlineColor" red="0.2196078431372549" green="0.43137254901960786" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</attributes>
</fragment>
<fragment content="   ">
<attributes>
<color key="NSColor" red="0.094117647058823528" green="0.21568627450980393" blue="0.41568627450980394" alpha="1" colorSpace="calibratedRGB"/>
<font key="NSFont" metaFont="system" size="16"/>
<real key="NSKern" value="0.0"/>
<paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="leftToRight" defaultTabInterval="36" tighteningFactorForTruncation="0.0" allowsDefaultTighteningForTruncation="NO">
<tabStops/>
</paragraphStyle>
<color key="NSStrokeColor" red="0.094117647058823528" green="0.21568627450980393" blue="0.41568627450980394" alpha="1" colorSpace="calibratedRGB"/>
</attributes>
</fragment>
<fragment>
<string key="content" base64-UTF8="YES">
Cg
</string>
<attributes>
<font key="NSFont" size="16" name="TimesNewRomanPSMT"/>
<real key="NSKern" value="0.0"/>
<paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="leftToRight" defaultTabInterval="36" tighteningFactorForTruncation="0.0" allowsDefaultTighteningForTruncation="NO">
<tabStops/>
</paragraphStyle>
<color key="NSStrokeColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
</attributes>
</fragment>
<fragment content=" ">
<attributes>
<color key="NSColor" red="0.094117647058823528" green="0.21568627450980393" blue="0.41568627450980394" alpha="1" colorSpace="calibratedRGB"/>
<font key="NSFont" metaFont="system" size="16"/>
<real key="NSKern" value="0.0"/>
<paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="leftToRight" defaultTabInterval="36" tighteningFactorForTruncation="0.0" allowsDefaultTighteningForTruncation="NO">
<tabStops/>
</paragraphStyle>
<color key="NSStrokeColor" red="0.094117647058823528" green="0.21568627450980393" blue="0.41568627450980394" alpha="1" colorSpace="calibratedRGB"/>
</attributes>
</fragment>
<fragment>
<string key="content" base64-UTF8="YES">
Cg
</string>
<attributes>
<font key="NSFont" size="16" name="TimesNewRomanPSMT"/>
<real key="NSKern" value="0.0"/>
<paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="leftToRight" defaultTabInterval="36" tighteningFactorForTruncation="0.0" allowsDefaultTighteningForTruncation="NO">
<tabStops/>
</paragraphStyle>
<color key="NSStrokeColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
</attributes>
</fragment>
<fragment>
<string key="content">SAP supports US Sailing through the implementation of a range of innovative technology solutions, delivering analytics to help teams and sailors improve performance whilst also providing applications to help sailing operations run more efficiently.</string>
<attributes>
<color key="NSColor" red="0.094117647058823528" green="0.21568627450980393" blue="0.41568627450980394" alpha="1" colorSpace="calibratedRGB"/>
<font key="NSFont" metaFont="system" size="16"/>
<real key="NSKern" value="0.0"/>
<paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="leftToRight" defaultTabInterval="36" tighteningFactorForTruncation="0.0" allowsDefaultTighteningForTruncation="NO">
<tabStops/>
</paragraphStyle>
<color key="NSStrokeColor" red="0.094117647058823528" green="0.21568627450980393" blue="0.41568627450980394" alpha="1" colorSpace="calibratedRGB"/>
</attributes>
</fragment>
<fragment>
<string key="content" base64-UTF8="YES">
Cg
</string>
<attributes>
<font key="NSFont" size="16" name="TimesNewRomanPSMT"/>
<real key="NSKern" value="0.0"/>
<paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="leftToRight" defaultTabInterval="36" tighteningFactorForTruncation="0.0" allowsDefaultTighteningForTruncation="NO">
<tabStops/>
</paragraphStyle>
<color key="NSStrokeColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
</attributes>
</fragment>
<fragment content=" ">
<attributes>
<color key="NSColor" red="0.094117647058823528" green="0.21568627450980393" blue="0.41568627450980394" alpha="1" colorSpace="calibratedRGB"/>
<font key="NSFont" metaFont="system" size="16"/>
<real key="NSKern" value="0.0"/>
<paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="leftToRight" defaultTabInterval="36" tighteningFactorForTruncation="0.0" allowsDefaultTighteningForTruncation="NO">
<tabStops/>
</paragraphStyle>
<color key="NSStrokeColor" red="0.094117647058823528" green="0.21568627450980393" blue="0.41568627450980394" alpha="1" colorSpace="calibratedRGB"/>
</attributes>
</fragment>
<fragment>
<string key="content" base64-UTF8="YES">
Cg
</string>
<attributes>
<font key="NSFont" size="16" name="TimesNewRomanPSMT"/>
<real key="NSKern" value="0.0"/>
<paragraphStyle key="NSParagraphStyle" alignment="left" lineBreakMode="wordWrapping" baseWritingDirection="leftToRight" defaultTabInterval="36" tighteningFactorForTruncation="0.0" allowsDefaultTighteningForTruncation="NO">
<tabStops/>
</paragraphStyle>
<color key="NSStrokeColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
</attributes>
</fragment>
<fragment>
<string key="content">As the national governing body for sailing, US Sailing provides leadership, integrity and growth for the sport including training and education programs for instructors and race officials alongside administration and oversight of competitive sailing across the country.</string>
<fragment content="Partnership Text View">
<attributes>
<color key="NSColor" red="0.094117647058823528" green="0.21568627450980393" blue="0.41568627450980394" alpha="1" colorSpace="calibratedRGB"/>
<font key="NSFont" metaFont="system" size="16"/>
@@ -1601,7 +1488,7 @@ Cg
<constraint firstAttribute="height" constant="60" id="xSB-Dr-qVN"/>
</constraints>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="21"/>
<state key="normal" title="License Information">
<state key="normal" title="License Information Button">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="titleShadowColor" red="0.5725490196078431" green="0.5725490196078431" blue="0.5725490196078431" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
@@ -1622,7 +1509,7 @@ Cg
<constraint firstAttribute="height" constant="60" id="lFu-3n-8uz"/>
</constraints>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="21"/>
<state key="normal" title="EULA">
<state key="normal" title="Terms Button">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="titleShadowColor" red="0.5725490196078431" green="0.5725490196078431" blue="0.5725490196078431" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
@@ -1648,8 +1535,8 @@ Cg
<constraint firstItem="8Vc-YY-1rh" firstAttribute="top" secondItem="MpZ-GD-6aE" secondAttribute="bottom" constant="16" id="zSI-2L-hkd"/>
</constraints>
</view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Version" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YpQ-wa-mW3">
<rect key="frame" x="20" y="176" width="46" height="18"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Version Title Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YpQ-wa-mW3">
<rect key="frame" x="20" y="176" width="110.5" height="18"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="13"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@@ -1657,8 +1544,8 @@ Cg
<rect key="frame" x="20" y="256" width="43" height="15.5"/>
</variation>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="1.0.0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Jsi-LA-7jU">
<rect key="frame" x="20" y="202" width="30" height="18"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Version Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Jsi-LA-7jU">
<rect key="frame" x="20" y="202" width="81.5" height="18"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="13"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@@ -1727,7 +1614,7 @@ Cg
</mask>
</variation>
</view>
<navigationItem key="navigationItem" title="About" id="8o6-Yh-CuN">
<navigationItem key="navigationItem" id="8o6-Yh-CuN">
<barButtonItem key="rightBarButtonItem" systemItem="done" id="Bw1-bK-skL">
<connections>
<action selector="doneButtonTapped:" destination="WMr-pC-C12" id="3lp-4Z-r8w"/>
@@ -1735,9 +1622,11 @@ Cg
</barButtonItem>
</navigationItem>
<connections>
<outlet property="textView" destination="yEk-7o-5Ua" id="a7p-wJ-DDg"/>
<outlet property="versionDescriptionLabel" destination="YpQ-wa-mW3" id="ndm-Jp-4j0"/>
<outlet property="licenseInformationButton" destination="MpZ-GD-6aE" id="GGE-ik-Rt1"/>
<outlet property="partnershipTextView" destination="yEk-7o-5Ua" id="ob0-0S-7Ke"/>
<outlet property="termsButton" destination="8Vc-YY-1rh" id="BfT-Pq-zTN"/>
<outlet property="versionLabel" destination="Jsi-LA-7jU" id="b1V-A3-5jG"/>
<outlet property="versionTitleLabel" destination="YpQ-wa-mW3" id="KMt-af-UpK"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="4QC-nX-XeK" userLabel="First Responder" sceneMemberID="firstResponder"/>
@@ -1779,7 +1668,7 @@ Cg
</objects>
<point key="canvasLocation" x="1582" y="2046"/>
</scene>
<!--Settings-->
<!--Settings View Controller-->
<scene sceneID="yOw-OU-u8M">
<objects>
<tableViewController id="H1Q-9y-gn2" customClass="SettingsViewController" customModule="SAPTracker" customModuleProvider="target" sceneMemberID="viewController">
@@ -1788,24 +1677,18 @@ Cg
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="0.93725490199999995" green="0.93725490199999995" blue="0.95686274510000002" alpha="1" colorSpace="calibratedRGB"/>
<sections>
<tableViewSection headerTitle="Energy Management" id="PQM-l6-Zw8">
<tableViewSection headerTitle="Battery Saving Section" id="PQM-l6-Zw8">
<cells>
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="BatterySaving" id="nnw-vJ-ZW6">
<rect key="frame" x="0.0" y="49.5" width="600" height="44"/>
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="BatterySaving" rowHeight="100" id="nnw-vJ-ZW6" userLabel="Battery Saving">
<rect key="frame" x="0.0" y="49.5" width="600" height="100"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="nnw-vJ-ZW6" id="wMb-jA-3a7">
<rect key="frame" x="0.0" y="0.0" width="600" height="43.5"/>
<rect key="frame" x="0.0" y="0.0" width="600" height="99.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="WvA-dL-zOH">
<rect key="frame" x="536" y="6" width="51" height="31"/>
<connections>
<action selector="batterySavingChanged:" destination="H1Q-9y-gn2" eventType="valueChanged" id="6fN-hp-Ux5"/>
</connections>
</switch>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Battery Saving" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="eRQ-p8-ydN">
<rect key="frame" x="14" y="10" width="114" height="24"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="17"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="252" text="Battery Saving Title Label" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="eRQ-p8-ydN">
<rect key="frame" x="14" y="8" width="216" height="23.5"/>
<fontDescription key="fontDescription" name="OpenSans-Bold" family="Open Sans" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
<variation key="heightClass=compact" misplaced="YES">
@@ -1815,28 +1698,44 @@ Cg
<rect key="frame" x="15" y="10" width="111.5" height="24"/>
</variation>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" text="Battery Saving Description Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uqK-uV-1FP">
<rect key="frame" x="14" y="39" width="514" height="52"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="13"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" horizontalCompressionResistancePriority="751" verticalCompressionResistancePriority="751" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="WvA-dL-zOH">
<rect key="frame" x="536" y="34" width="51" height="31"/>
<connections>
<action selector="batterySavingChanged:" destination="H1Q-9y-gn2" eventType="valueChanged" id="6fN-hp-Ux5"/>
</connections>
</switch>
</subviews>
<constraints>
<constraint firstItem="eRQ-p8-ydN" firstAttribute="centerY" secondItem="wMb-jA-3a7" secondAttribute="centerY" id="AMn-eS-EDN"/>
<constraint firstAttribute="trailingMargin" secondItem="WvA-dL-zOH" secondAttribute="trailing" constant="7" id="EzM-6e-FNX"/>
<constraint firstItem="WvA-dL-zOH" firstAttribute="leading" secondItem="uqK-uV-1FP" secondAttribute="trailing" constant="8" id="J5d-r8-4gr"/>
<constraint firstItem="uqK-uV-1FP" firstAttribute="top" secondItem="eRQ-p8-ydN" secondAttribute="bottom" constant="8" id="Sdu-oP-4sq"/>
<constraint firstItem="uqK-uV-1FP" firstAttribute="leading" secondItem="wMb-jA-3a7" secondAttribute="leading" constant="14" id="ZP8-SX-NKb"/>
<constraint firstItem="WvA-dL-zOH" firstAttribute="centerY" secondItem="wMb-jA-3a7" secondAttribute="centerY" id="bFY-e3-y1j"/>
<constraint firstItem="eRQ-p8-ydN" firstAttribute="top" secondItem="wMb-jA-3a7" secondAttribute="top" constant="8" id="hxH-CE-Dme"/>
<constraint firstItem="eRQ-p8-ydN" firstAttribute="leading" secondItem="wMb-jA-3a7" secondAttribute="leading" constant="14" id="tiY-M3-4qe"/>
<constraint firstAttribute="bottom" secondItem="uqK-uV-1FP" secondAttribute="bottom" constant="8" id="xAj-gj-ZJa"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
<tableViewSection headerTitle="Other Settings" id="MJM-DA-e7Q">
<tableViewSection headerTitle="Other Settings Section" id="MJM-DA-e7Q">
<cells>
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="BatterySaving" id="5z9-8e-fkv">
<rect key="frame" x="0.0" y="135.5" width="600" height="44"/>
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="BatterySaving" rowHeight="100" id="5z9-8e-fkv" userLabel="Device Identifier">
<rect key="frame" x="0.0" y="191.5" width="600" height="100"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="5z9-8e-fkv" id="aHh-Fu-bjO">
<rect key="frame" x="0.0" y="0.0" width="600" height="43.5"/>
<rect key="frame" x="0.0" y="0.0" width="600" height="99.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Device Identifier:" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="GpR-bL-Ekk">
<rect key="frame" x="14" y="2" width="145" height="24"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="252" text="Device Identifier Title Label" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="0.0" translatesAutoresizingMaskIntoConstraints="NO" id="GpR-bL-Ekk">
<rect key="frame" x="14" y="8" width="232.5" height="24"/>
<fontDescription key="fontDescription" name="OpenSans-Bold" family="Open Sans" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@@ -1847,8 +1746,8 @@ Cg
<rect key="frame" x="15" y="10" width="111.5" height="24"/>
</variation>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="IHy-Ae-s1D">
<rect key="frame" x="14" y="23.5" width="33" height="18"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Device Identifier Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="IHy-Ae-s1D">
<rect key="frame" x="14" y="40" width="134.5" height="51.5"/>
<fontDescription key="fontDescription" name="OpenSans" family="Open Sans" pointSize="13"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
@@ -1859,9 +1758,10 @@ Cg
</subviews>
<constraints>
<constraint firstItem="GpR-bL-Ekk" firstAttribute="leading" secondItem="aHh-Fu-bjO" secondAttribute="leading" constant="14" id="1RO-LX-3Du"/>
<constraint firstAttribute="bottom" secondItem="IHy-Ae-s1D" secondAttribute="bottom" constant="2" id="3jK-sb-mbn"/>
<constraint firstAttribute="bottom" secondItem="IHy-Ae-s1D" secondAttribute="bottom" constant="8" id="3jK-sb-mbn"/>
<constraint firstItem="IHy-Ae-s1D" firstAttribute="leading" secondItem="aHh-Fu-bjO" secondAttribute="leading" constant="14" id="J8G-id-aec"/>
<constraint firstItem="GpR-bL-Ekk" firstAttribute="top" secondItem="aHh-Fu-bjO" secondAttribute="top" constant="2" id="UBz-vY-TpH"/>
<constraint firstItem="GpR-bL-Ekk" firstAttribute="top" secondItem="aHh-Fu-bjO" secondAttribute="top" constant="8" id="UBz-vY-TpH"/>
<constraint firstItem="IHy-Ae-s1D" firstAttribute="top" secondItem="GpR-bL-Ekk" secondAttribute="bottom" constant="8" id="Ys6-qB-CkQ"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
@@ -1872,7 +1772,7 @@ Cg
<outlet property="delegate" destination="H1Q-9y-gn2" id="HKX-jS-iho"/>
</connections>
</tableView>
<navigationItem key="navigationItem" title="Settings" id="SbA-xV-4ro">
<navigationItem key="navigationItem" id="SbA-xV-4ro">
<barButtonItem key="rightBarButtonItem" systemItem="done" id="Ta8-ro-B8t">
<connections>
<action selector="doneButtonTapped:" destination="H1Q-9y-gn2" id="z8A-RW-CAd"/>
@@ -1880,8 +1780,11 @@ Cg
</barButtonItem>
</navigationItem>
<connections>
<outlet property="batterySavingDescriptionLabel" destination="uqK-uV-1FP" id="L5H-Vk-UCt"/>
<outlet property="batterySavingSwitch" destination="WvA-dL-zOH" id="sRv-ja-xXy"/>
<outlet property="batterySavingTitleLabel" destination="eRQ-p8-ydN" id="hmc-f2-gcY"/>
<outlet property="deviceIdentifierLabel" destination="IHy-Ae-s1D" id="jA2-FC-aWy"/>
<outlet property="deviceIdentifierTitleLabel" destination="GpR-bL-Ekk" id="OJD-Hl-4ZD"/>
</connections>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="esa-2Y-AeG" userLabel="First Responder" sceneMemberID="firstResponder"/>
@@ -1924,7 +1827,7 @@ Cg
</objects>
<point key="canvasLocation" x="1582" y="542"/>
</scene>
<!--Leader Board-->
<!--Leaderboard View Controller-->
<scene sceneID="BcW-Cr-BGq">
<objects>
<viewController id="86Y-sl-Zhj" customClass="LeaderboardViewController" customModule="SAPTracker" customModuleProvider="target" sceneMemberID="viewController">
@@ -1958,7 +1861,7 @@ Cg
<constraint firstItem="21B-fg-uNB" firstAttribute="centerX" secondItem="752-p8-lMG" secondAttribute="centerX" id="rRu-7w-Iea"/>
</constraints>
</view>
<navigationItem key="navigationItem" title="Leader Board" id="8qz-J9-1KL">
<navigationItem key="navigationItem" id="8qz-J9-1KL">
<barButtonItem key="rightBarButtonItem" systemItem="done" id="NSL-iA-JLn">
<connections>
<action selector="doneButtonTapped:" destination="86Y-sl-Zhj" id="Xm9-iN-s5q"/>
@@ -2004,8 +1907,8 @@ Cg
<image name="settings" width="22" height="22"/>
</resources>
<inferredMetricsTieBreakers>
<segue reference="Xxn-jp-xEB"/>
<segue reference="QMa-LQ-D8c"/>
<segue reference="Xxn-jp-xEB"/>
</inferredMetricsTieBreakers>
<color key="tintColor" red="0.0" green="0.61568627450980395" blue="0.8784313725490196" alpha="1" colorSpace="calibratedRGB"/>
</document>
@@ -10,11 +10,6 @@ import UIKit
class RegattaController: NSObject {
private struct SendingInterval {
static let Normal: NSTimeInterval = 3
static let BatterySaving: NSTimeInterval = 30
}
let regatta: Regatta
var sendingBackgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid
@@ -51,7 +46,7 @@ class RegattaController: NSObject {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
func locationManagerUpdated(notification: NSNotification) {
@objc private func locationManagerUpdated(notification: NSNotification) {
dispatch_async(dispatch_get_main_queue(), {
guard self.isTracking else { return }
guard let locationData = notification.userInfo?[LocationManager.UserInfo.LocationData] as? LocationData else { return }
@@ -60,13 +55,13 @@ class RegattaController: NSObject {
gpsFix.updateWithLocationData(locationData)
CoreDataManager.sharedManager.saveContext()
if self.sendingDate.compare(NSDate()) == .OrderedAscending {
self.sendingDate = NSDate().dateByAddingTimeInterval(self.sendingPeriod)
self.sendingDate = NSDate().dateByAddingTimeInterval(BatteryManager.sharedManager.sendingPeriod)
self.beginGPSFixSendingInBackgroundTask()
}
})
}
func batterySavingChanged(notification: NSNotification) {
@objc private func batterySavingChanged(notification: NSNotification) {
dispatch_async(dispatch_get_main_queue(), {
guard let batterySaving = notification.userInfo?[Preferences.UserInfo.BatterySaving] as? Bool else { return }
if !batterySaving {
@@ -96,7 +91,7 @@ class RegattaController: NSObject {
// MARK: - Update
func update() {
updateDidStart()
SVProgressHUD.show()
let regattaData = RegattaData(serverURL: regatta.serverURL,
eventID: regatta.event.eventID,
leaderboardName: regatta.leaderboard.name,
@@ -113,18 +108,10 @@ class RegattaController: NSObject {
regatta.leaderboard.updateWithLeaderboardData(regattaData.leaderboardData)
regatta.competitor.updateWithCompetitorData(regattaData.competitorData)
CoreDataManager.sharedManager.saveContext()
updateDidFinish()
SVProgressHUD.popActivity()
}
func updateFailure() {
updateDidFinish()
}
func updateDidStart() {
SVProgressHUD.show()
}
func updateDidFinish() {
SVProgressHUD.popActivity()
}
@@ -153,8 +140,4 @@ class RegattaController: NSObject {
return requestManager
}()
// MARK: - Helper
var sendingPeriod: NSTimeInterval { get { return BatteryManager.sharedManager.batterySaving ? SendingInterval.BatterySaving : SendingInterval.Normal } }
}
@@ -84,17 +84,6 @@ public class RegattaData: NSObject {
self.init(url: url)
}
// Properties
var welcomeString: String {
get {
return String(format:NSLocalizedString("Hello %@. Welcome to %@. You are registered as %@.", comment: ""),
competitorData.name,
leaderboardData.name,
competitorData.sailID)
}
}
// MARK: - Helper
class private func queryItemValue(queryItems: [NSURLQueryItem]?, itemName: String) -> String? {
@@ -10,12 +10,19 @@ import Foundation
class RegattaViewController : UIViewController, UINavigationControllerDelegate {
private struct Segue {
static let About = "About"
static let Leaderboard = "Leaderboard"
static let Settings = "Settings"
static let Tracking = "Tracking"
}
private struct TeamImageKeys {
static let TeamImageURL = "teamImageUri"
}
var sourceTypes = [UIImagePickerControllerSourceType]()
var sourceTypeNames = [String]()
//var sourceTypes = [UIImagePickerControllerSourceType]()
//var sourceTypeNames = [String]()
@IBOutlet weak var teamImageView: UIImageView!
@IBOutlet weak var teamImageAddButton: UIButton!
@@ -28,12 +35,15 @@ class RegattaViewController : UIViewController, UINavigationControllerDelegate {
@IBOutlet weak var countdownView: UIView!
@IBOutlet weak var countdownViewHeight: NSLayoutConstraint!
@IBOutlet weak var countdownDaysLabel: UILabel!
@IBOutlet weak var countdownDaysTitleLabel: UILabel!
@IBOutlet weak var countdownHoursLabel: UILabel!
@IBOutlet weak var countdownHoursTitleLabel: UILabel!
@IBOutlet weak var countdownMinutesLabel: UILabel!
@IBOutlet weak var countdownMinutesTitleLabel: UILabel!
@IBOutlet weak var leaderboardButton: UIButton!
@IBOutlet weak var eventButton: UIButton!
@IBOutlet weak var startTrackingButton: UIButton!
@IBOutlet weak var announcementsLabel: UILabel!
@IBOutlet weak var announcementLabel: UILabel!
var regatta: Regatta!
var requestManager: RequestManager!
@@ -43,18 +53,23 @@ class RegattaViewController : UIViewController, UINavigationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
requestManager = RequestManager(baseURLString: regatta.serverURL)
setupButtons()
setupCompetitor()
setupCountdownTimer()
setupNavigationBar()
setupImageSourceTypes()
setupTeamImage()
setup()
// Update
// FIXME: - UI refresh?!
regattaController.update()
}
// MARK: - Setups
// MARK: - Setup
private func setup() {
setupButtons()
setupCompetitor()
setupCountdownTimer()
setupLocalization()
setupNavigationBar()
// setupImageSourceTypes()
setupTeamImage()
}
private func setupButtons() {
eventButton.setBackgroundImage(Images.BlueHighlighted, forState: .Highlighted)
@@ -79,15 +94,25 @@ class RegattaViewController : UIViewController, UINavigationControllerDelegate {
refreshCountdown()
}
private func setupImageSourceTypes() {
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera) {
sourceTypes.append(UIImagePickerControllerSourceType.Camera)
sourceTypeNames.append(NSLocalizedString("Camera", comment: ""))
}
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary) {
sourceTypes.append(UIImagePickerControllerSourceType.PhotoLibrary)
sourceTypeNames.append(NSLocalizedString("Photo Library", comment: ""))
}
// private func setupImageSourceTypes() {
// if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera) {
// sourceTypes.append(UIImagePickerControllerSourceType.Camera)
// sourceTypeNames.append(Translation.Common.Camera.String)
// }
// if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary) {
// sourceTypes.append(UIImagePickerControllerSourceType.PhotoLibrary)
// sourceTypeNames.append(Translation.Common.PhotoLibrary.String)
// }
// }
private func setupLocalization() {
countdownDaysTitleLabel.text = Translation.RegattaView.CountdownDaysTitleLabel.Text.String
countdownHoursTitleLabel.text = Translation.RegattaView.CountdownHoursTitleLabel.Text.String
countdownMinutesTitleLabel.text = Translation.RegattaView.CountdownMinutesTitleLabel.Text.String
eventButton.setTitle(Translation.RegattaView.EventButton.Title.String, forState: .Normal)
leaderboardButton.setTitle(Translation.LeaderboardView.Title.String, forState: .Normal)
startTrackingButton.setTitle(Translation.RegattaView.StartTrackingButton.Title.String, forState: .Normal)
announcementLabel.text = Translation.RegattaView.AnnouncementLabel.Text.String
}
private func setupNavigationBar() {
@@ -148,7 +173,7 @@ class RegattaViewController : UIViewController, UINavigationControllerDelegate {
func refreshCountdown() {
if regatta.event.startDate - NSDate().timeIntervalSince1970 > 0 {
regattaStartLabel.text = NSLocalizedString("Regatta will start in", comment: "")
regattaStartLabel.text = Translation.RegattaView.RegattaStartLabel.Text.BeforeRegattaDidStart.String
let duration = regatta.event.startDate - NSDate().timeIntervalSince1970
let days = Int(duration / (60 * 60 * 24))
let hours = Int(duration / (60 * 60)) - (days * 24)
@@ -159,7 +184,7 @@ class RegattaViewController : UIViewController, UINavigationControllerDelegate {
countdownView.hidden = false
countdownViewHeight.constant = 60
} else {
regattaStartLabel.text = NSLocalizedString("Regatta in progress", comment: "")
regattaStartLabel.text = Translation.RegattaView.RegattaStartLabel.Text.AfterRegattaDidStart.String
countdownView.hidden = true
countdownViewHeight.constant = 0
}
@@ -168,11 +193,11 @@ class RegattaViewController : UIViewController, UINavigationControllerDelegate {
// MARK: - Actions
@IBAction func teamImageAddButtonTapped(sender: AnyObject) {
showImageAlertController()
showSelectImageAlertController()
}
@IBAction func teamImageEditButtonTapped(sender: AnyObject) {
showImageAlertController()
showSelectImageAlertController()
}
@IBAction func teamImageRetryButtonTapped(sender: AnyObject) {
@@ -180,33 +205,40 @@ class RegattaViewController : UIViewController, UINavigationControllerDelegate {
}
@IBAction func eventButtonTapped(sender: UIButton) {
// FIXME: - Alert?
guard let url = regatta.eventURL() else { return }
UIApplication.sharedApplication().openURL(url)
UIApplication.sharedApplication().openURL(regatta.eventURL() ?? NSURL())
}
@IBAction func showMenuActionSheet(sender: AnyObject) {
@IBAction func optionButtonTapped(sender: AnyObject) {
let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet)
if let popoverController = alertController.popoverPresentationController {
popoverController.barButtonItem = sender as? UIBarButtonItem
}
let checkOutTitle = NSLocalizedString("Check-Out", comment: "")
let checkOutAction = UIAlertAction(title: checkOutTitle, style: .Default) { (action) in
let settingsAction = UIAlertAction(title: Translation.SettingsView.Title.String, style: .Default) { (action) in
self.performSegueWithIdentifier(Segue.Settings, sender: self)
}
let checkOutAction = UIAlertAction(title: Translation.RegattaView.OptionSheet.CheckOutAction.Title.String, style: .Default) { (action) in
self.showCheckOutAlertController()
}
let settingsTitle = NSLocalizedString("Settings", comment: "")
let settingsAction = UIAlertAction(title: settingsTitle, style: .Default) { (action) in
self.performSegueWithIdentifier("Settings", sender: self)
// FIXME: Replace or edit or a mix of both?
let replaceImageAction = UIAlertAction(title: Translation.RegattaView.OptionSheet.ReplaceImageAction.Title.String, style: .Default) { (action) in
self.showSelectImageAlertController()
}
let editPhotoTitle = NSLocalizedString("Replace Team Photo", comment: "")
let editPhotoAction = UIAlertAction(title: editPhotoTitle, style: .Default) { (action) in
self.showImageAlertController()
let refreshAction = UIAlertAction(title: Translation.RegattaView.OptionSheet.RefreshAction.Title.String, style: .Default) { (action) -> Void in
self.regattaController.update()
}
let cancelTitle = NSLocalizedString("Cancel", comment: "")
let cancelAction = UIAlertAction(title: cancelTitle, style: .Cancel, handler: nil)
alertController.addAction(checkOutAction)
let aboutAction = UIAlertAction(title: Translation.AboutView.Title.String, style: .Default) { (action) -> Void in
self.performSegueWithIdentifier(Segue.About, sender: alertController)
}
let cancelAction = UIAlertAction(title: Translation.Common.Cancel.String, style: .Cancel, handler: nil)
alertController.addAction(settingsAction)
alertController.addAction(editPhotoAction)
alertController.addAction(checkOutAction)
alertController.addAction(replaceImageAction)
alertController.addAction(refreshAction)
alertController.addAction(aboutAction)
alertController.addAction(cancelAction)
presentViewController(alertController, animated: true, completion: nil)
}
@@ -214,11 +246,10 @@ class RegattaViewController : UIViewController, UINavigationControllerDelegate {
@IBAction func startTrackingButtonTapped(sender: AnyObject) {
do {
try regattaController.startTracking()
performSegueWithIdentifier("Tracking", sender: sender)
performSegueWithIdentifier(Segue.Tracking, sender: sender)
} catch let error as LocationManager.LocationManagerError {
let alertController = UIAlertController(title: error.description, message: nil, preferredStyle: .Alert)
let cancelTitle = NSLocalizedString("Cancel", comment: "")
let cancelAction = UIAlertAction(title: cancelTitle, style: .Cancel, handler: nil)
let cancelAction = UIAlertAction(title: Translation.Common.Cancel.String, style: .Cancel, handler: nil)
alertController.addAction(cancelAction)
presentViewController(alertController, animated: true, completion: nil)
} catch {
@@ -229,12 +260,12 @@ class RegattaViewController : UIViewController, UINavigationControllerDelegate {
// MARK: - Alerts
private func showCheckOutAlertController() {
let alertTitle = NSLocalizedString("Check-out of Regatta?", comment: "")
let alertController = UIAlertController(title: alertTitle, message: nil, preferredStyle: .Alert)
let okTitle = NSLocalizedString("OK", comment: "")
let okAction = UIAlertAction(title: okTitle, style: .Default) { (action) in self.preformCheckOut() }
let cancelTitle = NSLocalizedString("Cancel", comment: "")
let cancelAction = UIAlertAction(title: cancelTitle, style: .Cancel, handler: nil)
let alertController = UIAlertController(title: Translation.Common.Warning.String,
message: Translation.RegattaView.CheckOutAlert.Message.String,
preferredStyle: .Alert
)
let okAction = UIAlertAction(title: Translation.Common.Yes.String, style: .Default) { (action) in self.preformCheckOut() }
let cancelAction = UIAlertAction(title: Translation.Common.No.String, style: .Cancel, handler: nil)
alertController.addAction(okAction)
alertController.addAction(cancelAction)
presentViewController(alertController, animated: true, completion: nil)
@@ -251,36 +282,39 @@ class RegattaViewController : UIViewController, UINavigationControllerDelegate {
navigationController!.popViewControllerAnimated(true)
}
func showImageAlertController() {
if sourceTypes.count == 1 {
imagePicker(sourceTypes[0])
private func showSelectImageAlertController() {
if UIImagePickerController.isSourceTypeAvailable(.Camera) && UIImagePickerController.isSourceTypeAvailable(.PhotoLibrary) {
let alertController = UIAlertController(title: Translation.RegattaView.SelectImageAlert.Title.String,
message: Translation.RegattaView.SelectImageAlert.Message.String,
preferredStyle: .Alert
)
let cameraAction = UIAlertAction(title: Translation.RegattaView.SelectImageAlert.CameraAction.Title.String, style: .Default) { (action) in
self.imagePicker(.Camera)
}
if sourceTypes.count == 2 {
let alertTitle = NSLocalizedString("Select a photo for your team", comment: "")
let alertController = UIAlertController(title: alertTitle, message: nil, preferredStyle: .Alert)
let sourceType1Action = UIAlertAction(title: sourceTypeNames[0], style: .Default) { (action) in
self.imagePicker(self.sourceTypes[0])
let photoLibraryAction = UIAlertAction(title: Translation.RegattaView.SelectImageAlert.PhotoLibraryAction.Title.String, style: .Default) { (action) in
self.imagePicker(.PhotoLibrary)
}
let sourceType2Action = UIAlertAction(title: sourceTypeNames[1], style: .Default) { (action) in
self.imagePicker(self.sourceTypes[1])
}
let cancelTitle = NSLocalizedString("Cancel", comment: "")
let cancelAction = UIAlertAction(title: cancelTitle, style: .Cancel, handler: nil)
alertController.addAction(sourceType1Action)
alertController.addAction(sourceType2Action)
let cancelAction = UIAlertAction(title: Translation.Common.Cancel.String, style: .Cancel, handler: nil)
alertController.addAction(cameraAction)
alertController.addAction(photoLibraryAction)
alertController.addAction(cancelAction)
presentViewController(alertController, animated: true, completion: nil)
} else if UIImagePickerController.isSourceTypeAvailable(.Camera) {
imagePicker(.Camera)
} else if UIImagePickerController.isSourceTypeAvailable(.PhotoLibrary) {
imagePicker(.PhotoLibrary)
}
}
// MARK: - Segue
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "Tracking") {
if (segue.identifier == Segue.Tracking) {
let trackingNC = segue.destinationViewController as! UINavigationController
let trackingVC = trackingNC.viewControllers[0] as! TrackingViewController
trackingVC.regatta = regatta
} else if (segue.identifier == "Leaderboard") {
trackingVC.regattaController = regattaController
} else if (segue.identifier == Segue.Leaderboard) {
let leaderboardNC = segue.destinationViewController as! UINavigationController
let leaderboardVC = leaderboardNC.viewControllers[0] as! LeaderboardViewController
leaderboardVC.regatta = regatta
@@ -289,7 +323,7 @@ class RegattaViewController : UIViewController, UINavigationControllerDelegate {
// MARK: - Properties
lazy var regattaController: RegattaController = {
private lazy var regattaController: RegattaController = {
return RegattaController(regatta: self.regatta)
}()
@@ -299,7 +333,7 @@ class RegattaViewController : UIViewController, UINavigationControllerDelegate {
extension RegattaViewController: UIImagePickerControllerDelegate {
func imagePicker(sourceType: UIImagePickerControllerSourceType) {
private func imagePicker(sourceType: UIImagePickerControllerSourceType) {
let imagePickerController = UIImagePickerController()
imagePickerController.delegate = self
imagePickerController.sourceType = sourceType;
@@ -308,7 +342,7 @@ extension RegattaViewController: UIImagePickerControllerDelegate {
presentViewController(imagePickerController, animated: true, completion: nil)
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
private func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
dismissViewControllerAnimated(true, completion: nil)
teamImageView.image = image
teamImageAddButton.hidden = true
@@ -346,10 +380,11 @@ extension RegattaViewController: UIImagePickerControllerDelegate {
CoreDataManager.sharedManager.saveContext()
// Show alert
let alertTitle = NSLocalizedString("Failed to upload image", comment: "")
let alertController = UIAlertController(title: alertTitle, message: error.localizedDescription, preferredStyle: .Alert)
let okTitle = NSLocalizedString("OK", comment: "")
let okAction = UIAlertAction(title: okTitle, style: .Default, handler: nil)
let alertController = UIAlertController(title: Translation.RegattaView.ImageUploadFailureAlert.Title.String,
message: error.localizedDescription,
preferredStyle: .Alert
)
let okAction = UIAlertAction(title: Translation.Common.OK.String, style: .Default, handler: nil)
alertController.addAction(okAction)
presentViewController(alertController, animated: true, completion: nil)
@@ -139,7 +139,7 @@ class RequestManager: NSObject {
}
func getEventFailure(eventID: String, error: NSError, failure: (String, NSError) -> Void) -> Void {
failure(String(format: NSLocalizedString("Couldn't get event %@", comment: ""), eventID), error)
failure(String(format: Translation.RequestManager.EventLoadingFailure.String, eventID), error)
}
// MARK: - Leaderboard
@@ -162,7 +162,7 @@ class RequestManager: NSObject {
}
func getLeaderboardFailure(leaderboardName: String, error: NSError, failure: (String, NSError) -> Void) {
failure(String(format: NSLocalizedString("Couldn't get leader board %@", comment: ""), leaderboardName), error)
failure(String(format: Translation.RequestManager.LeaderboardLoadingFailure.String, leaderboardName), error)
}
// MARK: - Competitor
@@ -185,7 +185,7 @@ class RequestManager: NSObject {
}
func getCompetitorFailure(competitorID: String, error: NSError, failure: (String, NSError) -> Void) {
failure(String(format: NSLocalizedString("Couldn't get competitor %@", comment: ""), competitorID), error)
failure(String(format: Translation.RequestManager.CompetitorLoadingFailure.String, competitorID), error)
}
// MARK: - Team
@@ -14,17 +14,18 @@ class ScanViewController: UIViewController {
@IBOutlet weak var previewView: UIView!
@IBOutlet weak var targetImageView: UIImageView!
private var session: AVCaptureSession!
private var output: AVCaptureMetadataOutput!
private var previewLayer: AVCaptureVideoPreviewLayer!
private var scanSession: AVCaptureSession?
private var scanOutput: AVCaptureMetadataOutput?
private var scanPreviewLayer: AVCaptureVideoPreviewLayer?
private var scanError: NSError?
override func viewDidLoad() {
super.viewDidLoad()
setupSession()
setup()
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
startScanning()
}
@@ -36,16 +37,26 @@ class ScanViewController: UIViewController {
// MARK: - Layouts
private func layoutPreviewLayer() {
guard let previewLayer = scanPreviewLayer else { return }
previewLayer.frame = previewView.bounds
previewLayer.position = CGPointMake(CGRectGetMidX(previewView.bounds), CGRectGetMidY(previewView.bounds))
}
// MARK: - Setups
// MARK: - Setup
private func setupSession() {
session = AVCaptureSession()
output = AVCaptureMetadataOutput()
private func setup() {
setupLocalization()
setupScanning()
}
private func setupLocalization() {
navigationItem.title = Translation.ScanView.Title.String
}
private func setupScanning() {
do {
let session = AVCaptureSession()
let output = AVCaptureMetadataOutput()
let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
let input = try AVCaptureDeviceInput(device: device);
output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
@@ -57,39 +68,56 @@ class ScanViewController: UIViewController {
session.addOutput(output)
}
output.metadataObjectTypes = [AVMetadataObjectTypeQRCode]
previewLayer = AVCaptureVideoPreviewLayer(session: self.session)
let previewLayer = AVCaptureVideoPreviewLayer(session: session)
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
previewLayer.connection.videoOrientation = videoOrientation(forInterfaceOrientation: UIApplication.sharedApplication().statusBarOrientation)
previewLayer.frame = previewView.bounds
previewLayer.position = CGPointMake(CGRectGetMidX(previewView.bounds), CGRectGetMidY(previewView.bounds))
previewView.layer.addSublayer(previewLayer)
} catch {
print(error)
scanSession = session
scanOutput = output
scanPreviewLayer = previewLayer
} catch let error as NSError {
scanError = error
}
}
// MARK: - UIViewControllerDelegate
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
previewLayer.connection.videoOrientation = videoOrientation(forInterfaceOrientation: toInterfaceOrientation)
}
// MARK: - Scanning
private func startScanning() {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
self.session.startRunning()
})
targetImageView.image = UIImage(named: "scan_white")
if let error = scanError {
let alertController = UIAlertController(title: error.localizedDescription, message: error.localizedFailureReason, preferredStyle: .Alert)
let settingsAction = UIAlertAction(title: Translation.Common.SystemSettings.String, style: .Default) { (action) in
UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString) ?? NSURL())
self.navigationController?.popViewControllerAnimated(true)
}
let cancelAction = UIAlertAction(title: Translation.Common.Cancel.String, style: .Cancel) { (action) in
self.navigationController?.popViewControllerAnimated(true)
}
alertController.addAction(settingsAction)
alertController.addAction(cancelAction)
presentViewController(alertController, animated: true, completion: nil)
} else {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
self.scanSession?.startRunning()
})
}
}
private func stopScanning() {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
self.session.stopRunning()
self.scanSession?.stopRunning()
})
targetImageView.image = UIImage(named: "scan_green")
}
// MARK: - UIViewControllerDelegate
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
scanPreviewLayer?.connection.videoOrientation = videoOrientation(forInterfaceOrientation: toInterfaceOrientation)
}
// MARK: - Properties
private lazy var checkInController: CheckInController = {
@@ -138,10 +166,8 @@ extension ScanViewController: AVCaptureMetadataOutputObjectsDelegate {
self.captureOutputSuccess(regattaData)
})
} else {
let alertTitle = NSLocalizedString("Incorrect QR Code", comment: "")
let alertController = UIAlertController(title: alertTitle, message: "", preferredStyle: .Alert)
let cancelTitle = NSLocalizedString("Cancel", comment: "")
let cancelAction = UIAlertAction(title: cancelTitle, style: .Cancel, handler: nil)
let alertController = UIAlertController(title: Translation.ScanView.IncorrectCodeAlert.Title.String, message: "", preferredStyle: .Alert)
let cancelAction = UIAlertAction(title: Translation.Common.Cancel.String, style: .Cancel, handler: nil)
alertController.addAction(cancelAction)
presentViewController(alertController, animated: true, completion: nil)
}
@@ -10,38 +10,83 @@ import Foundation
class SettingsViewController: UITableViewController {
@IBOutlet weak var batterySavingTitleLabel: UILabel!
@IBOutlet weak var batterySavingDescriptionLabel: UILabel!
@IBOutlet weak var batterySavingSwitch: UISwitch!
@IBOutlet weak var deviceIdentifierTitleLabel: UILabel!
@IBOutlet weak var deviceIdentifierLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
setupBatterySavingSwitch()
setupDeviceIdentifierLabel()
setupNavigationBar()
setup()
}
// MARK: - Setups
// MARK: - Setup
private func setup() {
setupBatterySavingSwitch()
setupBatterySavingDescriptionLabel()
setupDeviceIdentifierLabel()
setupLocalization()
setupNavigationBar()
setupTableView()
}
private func setupBatterySavingSwitch() {
batterySavingSwitch.setOn(Preferences.batterySaving, animated: true)
}
private func setupBatterySavingDescriptionLabel() {
batterySavingDescriptionLabel.text = String(format: Translation.SettingsView.BatterySavingDescriptionLabel.Text.String,
Preferences.batterySaving ?
BatteryManager.SendingInterval.BatterySaving :
BatteryManager.SendingInterval.Normal)
}
private func setupDeviceIdentifierLabel() {
deviceIdentifierLabel.text = Preferences.uuid
}
private func setupLocalization() {
navigationItem.title = Translation.SettingsView.Title.String
batterySavingTitleLabel.text = Translation.SettingsView.BatterySavingTitleLabel.Text.String
deviceIdentifierTitleLabel.text = Translation.SettingsView.DeviceIdentifierTitleLabel.Text.String
}
private func setupNavigationBar() {
navigationItem.leftBarButtonItem = UIBarButtonItem(customView: UIImageView(image: UIImage(named: "sap_logo")))
}
private func setupTableView() {
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 140
}
// MARK: - Actions
@IBAction func batterySavingChanged(sender: UISwitch) {
Preferences.batterySaving = sender.on
setupBatterySavingDescriptionLabel()
}
@IBAction func doneButtonTapped(sender: AnyObject) {
presentingViewController!.dismissViewControllerAnimated(true, completion: nil)
}
// MARK: - UITableViewDataSource
override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
switch section {
case 0: return Translation.SettingsView.TableView.BatterySavingSection.Title.String
case 1: return Translation.SettingsView.TableView.OtherSettingsSection.Title.String
default: return ""
}
}
// MARK: - UITableViewDelegate
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
}
@@ -12,19 +12,29 @@ class SpeedViewController: UIViewController {
private let mpsToKn = 1.94552529182879
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var speedLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
self.setupSpeedLabel(-1.0)
self.subscribeForNotifications()
setup()
subscribeForNotifications()
}
deinit {
self.unsubscribeFromNotifications()
unsubscribeFromNotifications()
}
// MARK: - Setups
// MARK: - Setup
private func setup() {
setupLocalization()
setupSpeedLabel(-1.0)
}
private func setupLocalization() {
titleLabel.text = Translation.SpeedView.TitleLabel.Text.String
}
private func setupSpeedLabel(mps: Double) {
if mps >= 0 {
@@ -54,14 +64,14 @@ class SpeedViewController: UIViewController {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
func locationManagerUpdated(notification: NSNotification) {
@objc private func locationManagerUpdated(notification: NSNotification) {
dispatch_async(dispatch_get_main_queue(), {
guard let locationData = notification.userInfo?[LocationManager.UserInfo.LocationData] as? LocationData else { return }
self.setupSpeedLabel(locationData.location.speed)
})
}
func locationManagerFailed(notification: NSNotification) {
@objc private func locationManagerFailed(notification: NSNotification) {
dispatch_async(dispatch_get_main_queue(), {
self.setupSpeedLabel(-1.0)
})
@@ -11,21 +11,24 @@ import Foundation
class TimerViewController: UIViewController {
private let startDate = NSDate()
private let dateFormatter = NSDateFormatter()
@IBOutlet weak var trackingTimeLabel: UILabel!
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var timeLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
self.setupDateFormatter()
self.setupTimer()
setup()
}
// MARK: - Setups
// MARK: - Setup
private func setupDateFormatter() {
dateFormatter.dateFormat = "HH:mm:ss"
dateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
private func setup() {
setupLocalization()
setupTimer()
}
private func setupLocalization() {
titleLabel.text = Translation.TimerView.TitleLabel.Text.String
}
private func setupTimer() {
@@ -44,7 +47,16 @@ class TimerViewController: UIViewController {
let currentDate = NSDate()
let timeInterval = currentDate.timeIntervalSinceDate(startDate)
let timerDate = NSDate(timeIntervalSince1970: timeInterval)
trackingTimeLabel.text = dateFormatter.stringFromDate(timerDate)
timeLabel.text = dateFormatter.stringFromDate(timerDate)
}
// MARK: - Properties
private lazy var dateFormatter: NSDateFormatter = {
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "HH:mm:ss"
dateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)
return dateFormatter
}()
}
@@ -17,8 +17,8 @@ class TrackingPageViewController : UIPageViewController, UIPageViewControllerDat
override func viewDidLoad() {
dataSource = self
page1 = storyboard!.instantiateViewControllerWithIdentifier("Timer") as? TimerViewController
page2 = storyboard!.instantiateViewControllerWithIdentifier("Speed")
page3 = storyboard!.instantiateViewControllerWithIdentifier("Heading")
page2 = storyboard!.instantiateViewControllerWithIdentifier("Course")
page3 = storyboard!.instantiateViewControllerWithIdentifier("Speed")
setViewControllers([page1!], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
}
@@ -19,7 +19,7 @@ class TrackingViewController : UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setups()
setup()
}
override func updateViewConstraints() {
@@ -27,10 +27,11 @@ class TrackingViewController : UIViewController {
tableViewHeight.constant = tableView.contentSize.height
}
// MARK: - Setups
// MARK: - Setup
private func setups() {
private func setup() {
setupButtons()
setupLocalization()
setupNavigationBar()
}
@@ -38,6 +39,10 @@ class TrackingViewController : UIViewController {
stopTrackingButton.setBackgroundImage(Images.RedHighlighted, forState: .Highlighted)
}
private func setupLocalization() {
stopTrackingButton.setTitle(Translation.TrackingView.StopTrackingButton.Title.String, forState: .Normal)
}
private func setupNavigationBar() {
navigationItem.title = regatta?.leaderboard.name
}
@@ -45,19 +50,20 @@ class TrackingViewController : UIViewController {
// MARK: - Actions
@IBAction func stopTrackingButtonTapped(sender: AnyObject) {
let alertTitle = NSLocalizedString("Stop tracking?", comment: "")
let alertController = UIAlertController(title: alertTitle, message: "", preferredStyle: .Alert)
let stopTitle = NSLocalizedString("Stop", comment: "")
let stopAction = UIAlertAction(title: stopTitle, style: .Default) { action in
let alertController = UIAlertController(title: Translation.TrackingView.StopTrackingAlert.Title.String,
message: Translation.TrackingView.StopTrackingAlert.Message.String,
preferredStyle: .Alert
)
let okAction = UIAlertAction(title: Translation.Common.OK.String, style: .Default) { action in
LocationManager.sharedManager.stopTracking()
// SendGPSFixController.sharedManager.checkIn = nil
SVProgressHUD.show()
self.regattaController.gpsFixController.sendAll({ (withSuccess) in
SVProgressHUD.dismiss()
self.dismissViewControllerAnimated(true, completion: nil)
})
}
let cancelTitle = NSLocalizedString("Cancel", comment: "")
let cancelAction = UIAlertAction(title: cancelTitle, style: .Cancel, handler: nil)
alertController.addAction(stopAction)
let cancelAction = UIAlertAction(title: Translation.Common.Cancel.String, style: .Cancel, handler: nil)
alertController.addAction(okAction)
alertController.addAction(cancelAction)
presentViewController(alertController, animated: true, completion: nil)
}
@@ -88,9 +94,8 @@ extension TrackingViewController: UITableViewDataSource {
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(TrackingViewController.Rows[indexPath.row]) ?? UITableViewCell()
if (cell.isKindOfClass(CachedFixesTrackingTableViewCell)) {
let cachedFixesCell = cell as! CachedFixesTrackingTableViewCell
cachedFixesCell.regatta = regatta
if let gpsFixesCell = cell as? TrackingViewGPSFixesCell {
gpsFixesCell.regatta = regatta
}
return cell
}
@@ -8,14 +8,15 @@
import UIKit
class GPSAccuracyTrackingTableViewCell: UITableViewCell {
class TrackingViewGPSAccuracyCell: UITableViewCell {
@IBOutlet weak var gpsAccuracyTitleLabel: UILabel!
@IBOutlet weak var gpsAccuracyLabel: UILabel!
@IBOutlet weak var gpsAccuracyView: GPSAccuracyView!
override func awakeFromNib() {
super.awakeFromNib()
setupGPSAccuracyLabel()
setup()
subscribeForNotifications()
}
@@ -23,16 +24,25 @@ class GPSAccuracyTrackingTableViewCell: UITableViewCell {
unsubscribeFromNotifications()
}
// MARK: - Setups
// MARK: - Setup
private func setup() {
setupGPSAccuracyLabel()
setupLocalization()
}
private func setupGPSAccuracyLabel() {
gpsAccuracyLabel.text = NSLocalizedString("No GPS", comment: "")
gpsAccuracyLabel.text = Translation.TrackingView.TableView.GPSAccuracyCell.GPSAccuracyLabel.Text.NoGPS.String
}
private func setupGPSAccuracyLabel(horizontalAccuracy: Double!) {
gpsAccuracyLabel.text = "~ " + String(format: "%.0f", horizontalAccuracy) + " m"
}
private func setupLocalization() {
gpsAccuracyTitleLabel.text = Translation.TrackingView.TableView.GPSAccuracyCell.GPSAccuracyTitleLabel.Text.String
}
// MARK: - Notifications
private func subscribeForNotifications() {
@@ -52,14 +62,14 @@ class GPSAccuracyTrackingTableViewCell: UITableViewCell {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
func locationManagerUpdated(notification: NSNotification) {
@objc private func locationManagerUpdated(notification: NSNotification) {
dispatch_async(dispatch_get_main_queue(), {
guard let locationData = notification.userInfo?[LocationManager.UserInfo.LocationData] as? LocationData else { return }
self.setupGPSAccuracyLabel(locationData.location.horizontalAccuracy)
})
}
func locationManagerFailed(notification: NSNotification) {
@objc private func locationManagerFailed(notification: NSNotification) {
dispatch_async(dispatch_get_main_queue(), {
self.setupGPSAccuracyLabel()
})
@@ -1,5 +1,5 @@
//
// CachedFixesTrackingTableViewCell.swift
// TrackingViewGPSFixesCell.swift
// SAPTracker
//
// Created by Raimund Wege on 07.06.16.
@@ -8,26 +8,36 @@
import UIKit
class CachedFixesTrackingTableViewCell: UITableViewCell {
class TrackingViewGPSFixesCell: UITableViewCell {
var regatta: Regatta?
@IBOutlet weak var cachedFixesLabel: UILabel!
@IBOutlet weak var gpsFixesTitleLabel: UILabel!
@IBOutlet weak var gpsFixesLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
self.setupCachedFixesLabel()
self.subscribeForNotifications()
setup()
subscribeForNotifications()
}
deinit {
self.unsubscribeFromNotifications()
unsubscribeFromNotifications()
}
// MARK: - Setups
// MARK: - Setup
private func setupCachedFixesLabel() {
self.cachedFixesLabel.text = String(format: "%d", regatta?.gpsFixes?.count ?? 0)
private func setup() {
setupLocalization()
setupGPSFixesLabel()
}
private func setupLocalization() {
gpsFixesTitleLabel.text = Translation.TrackingView.TableView.GPSFixesCell.GPSFixesTitleLabel.Text.String
}
private func setupGPSFixesLabel() {
gpsFixesLabel.text = String(format: "%d", regatta?.gpsFixes?.count ?? 0)
}
// MARK: - Notifications
@@ -44,9 +54,9 @@ class CachedFixesTrackingTableViewCell: UITableViewCell {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
func locationManagerUpdated(notification: NSNotification) {
@objc private func locationManagerUpdated(notification: NSNotification) {
dispatch_async(dispatch_get_main_queue(), {
self.setupCachedFixesLabel()
self.setupGPSFixesLabel()
})
}
@@ -1,5 +1,5 @@
//
// ModeTrackingTableViewCell.swift
// TrackingViewModeCell.swift
// SAPTracker
//
// Created by Raimund Wege on 07.06.16.
@@ -8,13 +8,14 @@
import UIKit
class ModeTrackingTableViewCell: UITableViewCell {
class TrackingViewModeCell: UITableViewCell {
@IBOutlet weak var modeTitleLabel: UILabel!
@IBOutlet weak var modeLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
setupModeLabel(GPSFixController.Mode.Offline)
setup()
subscribeForNotifications()
}
@@ -22,7 +23,16 @@ class ModeTrackingTableViewCell: UITableViewCell {
self.unsubscribeFromNotifications()
}
// MARK: - Setups
// MARK: - Setup
private func setup() {
setupLocalization()
setupModeLabel(GPSFixController.Mode.Offline)
}
private func setupLocalization() {
modeTitleLabel.text = Translation.GPSFixController.Mode.String
}
private func setupModeLabel(mode: GPSFixController.Mode) {
modeLabel.text = mode.description
@@ -42,7 +52,7 @@ class ModeTrackingTableViewCell: UITableViewCell {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
func regattaControllerModeChanged(notification: NSNotification) {
@objc private func regattaControllerModeChanged(notification: NSNotification) {
dispatch_async(dispatch_get_main_queue(), {
guard let rawValue = notification.userInfo?[GPSFixController.UserInfo.Mode] as? String else { return }
guard let mode = GPSFixController.Mode(rawValue: rawValue) else { return }
@@ -1,5 +1,5 @@
//
// StatusTrackingTableViewCell.swift
// TrackingViewStatusCell.swift
// SAPTracker
//
// Created by Raimund Wege on 07.06.16.
@@ -8,26 +8,35 @@
import UIKit
class StatusTrackingTableViewCell: UITableViewCell {
class TrackingViewStatusCell: UITableViewCell {
@IBOutlet weak var statusTitleLabel: UILabel!
@IBOutlet weak var statusLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
self.setupStatusLabel(false)
self.subscribeForNotifications()
setup()
subscribeForNotifications()
}
deinit {
self.unsubscribeFromNotifications()
unsubscribeFromNotifications()
}
// MARK: - Setups
// MARK: - Setup
private func setupStatusLabel(isTracking: Bool) {
statusLabel.text = isTracking ?
NSLocalizedString("Tracking", comment: "") :
NSLocalizedString("Not Tracking", comment: "")
private func setup() {
setupLocalization()
setupStatusLabel(LocationManager.Status.NotTracking)
}
private func setupLocalization() {
statusTitleLabel.text = Translation.LocationManager.Status.String
}
private func setupStatusLabel(status: LocationManager.Status) {
statusLabel.text = status.description
statusLabel.textColor = (status == .NotTracking ? UIColor.redColor() : UIColor.blackColor())
}
// MARK: - Notifications
@@ -49,15 +58,15 @@ class StatusTrackingTableViewCell: UITableViewCell {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
func locationManagerUpdated(notification: NSNotification) {
@objc private func locationManagerUpdated(notification: NSNotification) {
dispatch_async(dispatch_get_main_queue(), {
self.setupStatusLabel(true)
self.setupStatusLabel(LocationManager.Status.Tracking)
})
}
func locationManagerFailed(notification: NSNotification) {
@objc private func locationManagerFailed(notification: NSNotification) {
dispatch_async(dispatch_get_main_queue(), {
self.setupStatusLabel(false)
self.setupStatusLabel(LocationManager.Status.NotTracking)
})
}
@@ -0,0 +1,408 @@
//
// Translation.swift
// SAPTracker
//
// Created by Raimund Wege on 27.07.16.
// Copyright © 2016 com.sap.sailing. All rights reserved.
//
import UIKit
class Translation: NSObject {
struct Common { static let Key = "\(Common.self)"
struct Cancel { static let Key = "\(Common.Key).\(Cancel.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct OK { static let Key = "\(Common.Key).\(OK.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct SystemSettings { static let Key = "\(Common.Key).\(SystemSettings.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct Warning { static let Key = "\(Common.Key).\(Warning.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct Error { static let Key = "\(Common.Key).\(Error.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct Yes { static let Key = "\(Common.Key).\(Yes.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct No { static let Key = "\(Common.Key).\(No.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
// MARK: - CheckInController
struct CheckInController { static let Key = "\(CheckInController.self)"
struct PostCheckInFailureAlert { static let Key = "\(CheckInController.Key).\(PostCheckInFailureAlert.self)"
struct Message { static let Key = "\(PostCheckInFailureAlert.Key).\(Message.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct WelcomeAlert { static let Key = "\(CheckInController.Key).\(WelcomeAlert.self)"
struct Title { static let Key = "\(WelcomeAlert.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct Message { static let Key = "\(WelcomeAlert.Key).\(Message.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct CancelAction { static let Key = "\(WelcomeAlert.Key).\(CancelAction.self)"
struct Title { static let Key = "\(CancelAction.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
}
}
// MARK: - GPSFixController
struct GPSFixController { static let Key = "\(GPSFixController.self)"
struct Mode { static let Key = "\(GPSFixController.Key).\(Mode.self)"
static let String = NSLocalizedString(Key, comment: "")
struct Error { static let Key = "\(Mode.Key).\(Error.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct BatterySaving { static let Key = "\(Mode.Key).\(BatterySaving.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct Online { static let Key = "\(Mode.Key).\(Online.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct Offline { static let Key = "\(Mode.Key).\(Offline.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
}
// MARK: - LocationManager
struct LocationManager { static let Key = "\(LocationManager.self)"
struct LocationServicesDeniedError { static let Key = "\(LocationManager.Key).\(LocationServicesDeniedError.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct LocationServicesDisabledError { static let Key = "\(LocationManager.Key).\(LocationServicesDisabledError.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct Status { static let Key = "\(LocationManager.Key).\(Status.self)"
static let String = NSLocalizedString(Key, comment: "")
struct Tracking { static let Key = "\(Status.Key).\(Tracking.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct NotTracking { static let Key = "\(Status.Key).\(NotTracking.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
}
// MARK: - RequestManager
struct RequestManager { static let Key = "\(RequestManager.self)"
struct EventLoadingFailure { static let Key = "\(RequestManager.Key).\(EventLoadingFailure.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct LeaderboardLoadingFailure { static let Key = "\(RequestManager.Key).\(LeaderboardLoadingFailure.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct CompetitorLoadingFailure { static let Key = "\(RequestManager.Key).\(CompetitorLoadingFailure.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
// MARK: - AboutView
struct AboutView { static let Key = "\(AboutView.self)"
struct Title { static let Key = "\(AboutView.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct PartnershipTextView { static let Key = "\(AboutView.Key).\(PartnershipTextView.self)"
struct Text { static let Key = "\(PartnershipTextView.Key).\(Text.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct TermsButton { static let Key = "\(AboutView.Key).\(TermsButton.self)"
struct Title { static let Key = "\(TermsButton.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct VersionTitleLabel { static let Key = "\(AboutView.Key).\(VersionTitleLabel.self)"
struct Text { static let Key = "\(VersionTitleLabel.Key).\(Text.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
}
// MARK: - CourseView
struct CourseView { static let Key = "\(CourseView.self)"
struct TitleLabel { static let Key = "\(CourseView.Key).\(TitleLabel.self)"
struct Text { static let Key = "\(TitleLabel.Key).\(Text.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
}
// MARK: - HomeView
struct HomeView { static let Key = "\(HomeView.self)"
struct TableView { static let Key = "\(HomeView.Key).\(TableView.self)"
struct Title { static let Key = "\(TableView.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct InfoCodeLabel { static let Key = "\(HomeView.Key).\(InfoCodeLabel.self)"
struct Text { static let Key = "\(InfoCodeLabel.Key).\(Text.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct TermsAlert { static let Key = "\(HomeView.Key).\(TermsAlert.self)"
struct Title { static let Key = "\(TermsAlert.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct Message { static let Key = "\(TermsAlert.Key).\(Message.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct ShowTermsAction { static let Key = "\(TermsAlert.Key).\(ShowTermsAction.self)"
struct Title { static let Key = "\(ShowTermsAction.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct AcceptTermsAction { static let Key = "\(TermsAlert.Key).\(AcceptTermsAction.self)"
struct Title { static let Key = "\(AcceptTermsAction.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
}
struct NoCameraAlert { static let Key = "\(HomeView.Key).\(NoCameraAlert.self)"
struct Message { static let Key = "\(NoCameraAlert.Key).\(Message.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct NoCodeAlert { static let Key = "\(HomeView.Key).\(NoCodeAlert.self)"
struct Title { static let Key = "\(NoCodeAlert.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct Message { static let Key = "\(NoCodeAlert.Key).\(Message.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
}
// MARK: - LeaderboardView
struct LeaderboardView { static let Key = "\(LeaderboardView.self)"
struct Title { static let Key = "\(LeaderboardView.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
// MARK: - LicenseView
struct LicenseView { static let Key = "\(LicenseView.self)"
struct Title { static let Key = "\(LicenseView.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
// MARK: - RegattaView
struct RegattaView { static let Key = "\(RegattaView.self)"
struct CountdownDaysTitleLabel { static let Key = "\(RegattaView.Key).\(CountdownDaysTitleLabel.self)"
struct Text { static let Key = "\(CountdownDaysTitleLabel.Key).\(Text.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct CountdownHoursTitleLabel { static let Key = "\(RegattaView.Key).\(CountdownHoursTitleLabel.self)"
struct Text { static let Key = "\(CountdownHoursTitleLabel.Key).\(Text.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct CountdownMinutesTitleLabel { static let Key = "\(RegattaView.Key).\(CountdownMinutesTitleLabel.self)"
struct Text { static let Key = "\(CountdownMinutesTitleLabel.Key).\(Text.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct RegattaStartLabel { static let Key = "\(RegattaView.Key).\(RegattaStartLabel.self)"
struct Text { static let Key = "\(RegattaStartLabel.Key).\(Text.self)"
struct BeforeRegattaDidStart { static let Key = "\(Text.Key).\(BeforeRegattaDidStart.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct AfterRegattaDidStart { static let Key = "\(Text.Key).\(AfterRegattaDidStart.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
}
struct AnnouncementLabel { static let Key = "\(RegattaView.Key).\(AnnouncementLabel.self)"
struct Text { static let Key = "\(AnnouncementLabel.Key).\(Text.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct EventButton { static let Key = "\(RegattaView.Key).\(EventButton.self)"
struct Title { static let Key = "\(EventButton.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct StartTrackingButton { static let Key = "\(RegattaView.Key).\(StartTrackingButton.self)"
struct Title { static let Key = "\(StartTrackingButton.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct OptionSheet { static let Key = "\(RegattaView.Key).\(OptionSheet.self)"
struct CheckOutAction { static let Key = "\(OptionSheet.Key).\(CheckOutAction.self)"
struct Title { static let Key = "\(CheckOutAction.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct ReplaceImageAction { static let Key = "\(OptionSheet.Key).\(ReplaceImageAction.self)"
struct Title { static let Key = "\(ReplaceImageAction.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct RefreshAction { static let Key = "\(OptionSheet.Key).\(RefreshAction.self)"
struct Title { static let Key = "\(RefreshAction.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
}
struct CheckOutAlert { static let Key = "\(RegattaView.Key).\(CheckOutAlert.self)"
struct Message { static let Key = "\(CheckOutAlert.Key).\(Message.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct SelectImageAlert { static let Key = "\(RegattaView.Key).\(SelectImageAlert.self)"
struct Title { static let Key = "\(SelectImageAlert.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct Message { static let Key = "\(SelectImageAlert.Key).\(Message.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct CameraAction { static let Key = "\(SelectImageAlert.Key).\(CameraAction.self)"
struct Title { static let Key = "\(CameraAction.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct PhotoLibraryAction { static let Key = "\(SelectImageAlert.Key).\(PhotoLibraryAction.self)"
struct Title { static let Key = "\(PhotoLibraryAction.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
}
struct ImageUploadFailureAlert { static let Key = "\(LeaderboardView.Key).\(ImageUploadFailureAlert.self)"
struct Title { static let Key = "\(ImageUploadFailureAlert.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
}
// MARK: - ScanView
struct ScanView { static let Key = "\(ScanView.self)"
struct Title { static let Key = "\(ScanView.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct IncorrectCodeAlert { static let Key = "\(ScanView.Key).\(IncorrectCodeAlert.self)"
struct Title { static let Key = "\(IncorrectCodeAlert.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
}
// MARK: - SettingsView
struct SettingsView { static let Key = "\(SettingsView.self)"
struct Title { static let Key = "\(SettingsView.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct TableView { static let Key = "\(SettingsView.Key).\(TableView.self)"
struct BatterySavingSection { static let Key = "\(TableView.Key).\(BatterySavingSection.self)"
struct Title { static let Key = "\(BatterySavingSection.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct OtherSettingsSection { static let Key = "\(TableView.Key).\(OtherSettingsSection.self)"
struct Title { static let Key = "\(OtherSettingsSection.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
}
struct BatterySavingTitleLabel { static let Key = "\(SettingsView.Key).\(BatterySavingTitleLabel.self)"
struct Text { static let Key = "\(BatterySavingTitleLabel.Key).\(Text.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct BatterySavingDescriptionLabel { static let Key = "\(SettingsView.Key).\(BatterySavingDescriptionLabel.self)"
struct Text { static let Key = "\(BatterySavingDescriptionLabel.Key).\(Text.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct DeviceIdentifierTitleLabel { static let Key = "\(SettingsView.Key).\(DeviceIdentifierTitleLabel.self)"
struct Text { static let Key = "\(DeviceIdentifierTitleLabel.Key).\(Text.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
}
// MARK: - SpeedView
struct SpeedView { static let Key = "\(SpeedView.self)"
struct TitleLabel { static let Key = "\(SpeedView.Key).\(TitleLabel.self)"
struct Text { static let Key = "\(TitleLabel.Key).\(Text.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
}
// MARK: - TimerView
struct TimerView { static let Key = "\(TimerView.self)"
struct TitleLabel { static let Key = "\(TimerView.Key).\(TitleLabel.self)"
struct Text { static let Key = "\(TitleLabel.Key).\(Text.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
}
// MARK: - TrackingView
struct TrackingView { static let Key = "\(TrackingView.self)"
struct TableView { static let Key = "\(TrackingView.Key).\(TableView.self)"
struct GPSAccuracyCell { static let Key = "\(TableView.Key).\(GPSAccuracyCell.self)"
struct GPSAccuracyTitleLabel { static let Key = "\(GPSAccuracyCell.Key).\(GPSAccuracyTitleLabel.self)"
struct Text { static let Key = "\(GPSAccuracyTitleLabel.Key).\(Text.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct GPSAccuracyLabel { static let Key = "\(GPSAccuracyCell.Key).\(GPSAccuracyLabel.self)"
struct Text { static let Key = "\(GPSAccuracyLabel.Key).\(Text.self)"
struct NoGPS { static let Key = "\(Text.Key).\(NoGPS.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
}
}
struct GPSFixesCell { static let Key = "\(TableView.Key).\(GPSFixesCell.self)"
struct GPSFixesTitleLabel { static let Key = "\(GPSFixesCell.Key).\(GPSFixesTitleLabel.self)"
struct Text { static let Key = "\(GPSFixesTitleLabel.Key).\(Text.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
}
}
struct StopTrackingButton { static let Key = "\(TrackingView.Key).\(StopTrackingButton.self)"
struct Title { static let Key = "\(StopTrackingButton.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
struct StopTrackingAlert { static let Key = "\(TrackingView.Key).\(StopTrackingAlert.self)"
struct Title { static let Key = "\(StopTrackingAlert.Key).\(Title.self)"
static let String = NSLocalizedString(Key, comment: "")
}
struct Message { static let Key = "\(StopTrackingAlert.Key).\(Message.self)"
static let String = NSLocalizedString(Key, comment: "")
}
}
}
}
@@ -1,192 +0,0 @@
/* Class = "UILabel"; text = "COG"; ObjectID = "1Tn-6d-NlO"; */
"1Tn-6d-NlO.text" = "COG";
/* Class = "UIView"; accessibilityLabel = "Name, Sail ID"; ObjectID = "2UK-je-59c"; */
"2UK-je-59c.accessibilityLabel" = "Name, Sail ID";
/* Class = "UILabel"; text = "Tracking läuft"; ObjectID = "5Xu-6g-tqP"; */
"5Xu-6g-tqP.text" = "Tracking läuft";
/* Class = "UIButton"; normalTitle = "EULA"; ObjectID = "8Vc-YY-1rh"; */
"8Vc-YY-1rh.normalTitle" = "EULA";
/* Class = "UILabel"; accessibilityLabel = "Der QR-Code befindet sich auf Ihrer Teilnahmebestätigung"; ObjectID = "8aO-2n-aG5"; */
"8aO-2n-aG5.accessibilityLabel" = "Der QR-Code befindet sich auf Ihrer Teilnahmebestätigung";
/* Class = "UILabel"; text = "Bitte achten Sie auf die Durchsagen"; ObjectID = "8aO-2n-aG5"; */
"8aO-2n-aG5.text" = "Bitte achten Sie auf die Durchsagen";
/* Class = "UINavigationItem"; title = "Über"; ObjectID = "8o6-Yh-CuN"; */
"8o6-Yh-CuN.title" = "Über";
/* Class = "UINavigationItem"; title = "Leader Board"; ObjectID = "8qz-J9-1KL"; */
"8qz-J9-1KL.title" = "Leader Board";
/* Class = "UIBarButtonItem"; title = "Home"; ObjectID = "ASu-3l-KjT"; */
"ASu-3l-KjT.title" = "Home";
/* Class = "UIBarButtonItem"; title = "Annehmen"; ObjectID = "Agc-gU-hjA"; */
"Agc-gU-hjA.title" = "Annehmen";
/* Class = "UINavigationItem"; title = "Regatta"; ObjectID = "BjQ-Fx-PEX"; */
"BjQ-Fx-PEX.title" = "Regatta";
/* Class = "UIButton"; normalTitle = "Team Foto"; ObjectID = "CDA-ep-bjo"; */
"CDA-ep-bjo.normalTitle" = "Team Foto";
/* Class = "UILabel"; text = "kein GPS"; ObjectID = "DiM-MR-SGV"; */
"DiM-MR-SGV.text" = "kein GPS";
/* Class = "UILabel"; text = "Minuten"; ObjectID = "EES-a9-qxv"; */
"EES-a9-qxv.text" = "Minuten";
/* Class = "UIButton"; accessibilityLabel = "Sie haben keinen QR-Code?"; ObjectID = "Fp0-61-7he"; */
"Fp0-61-7he.accessibilityLabel" = "Sie haben keinen QR-Code?";
/* Class = "UIButton"; normalTitle = "Sie haben keinen QR-Code?"; ObjectID = "Fp0-61-7he"; */
"Fp0-61-7he.normalTitle" = "Sie haben keinen QR-Code?";
/* Class = "UILabel"; text = "Titel"; ObjectID = "FzL-oN-acm"; */
"FzL-oN-acm.text" = "Titel";
/* Class = "UILabel"; text = "Tracking Zeit"; ObjectID = "IeZ-JM-OWw"; */
"IeZ-JM-OWw.text" = "Tracking Zeit";
/* Class = "UIButton"; accessibilityLabel = "QR-Code scannen"; ObjectID = "Ieu-ch-jeI"; */
"Ieu-ch-jeI.accessibilityLabel" = "QR-Code scannen";
/* Class = "UIButton"; normalTitle = "QR-Code scannen"; ObjectID = "Ieu-ch-jeI"; */
"Ieu-ch-jeI.normalTitle" = "QR-Code scannen";
/* Class = "UILabel"; text = "1.0.0"; ObjectID = "Jsi-LA-7jU"; */
"Jsi-LA-7jU.text" = "1.0.0";
/* Class = "UINavigationItem"; title = "QR-Code scannen"; ObjectID = "LQ4-39-f6l"; */
"LQ4-39-f6l.title" = "QR-Code scannen";
/* Class = "UIButton"; normalTitle = "Lizenzinformationen"; ObjectID = "MpZ-GD-6aE"; */
"MpZ-GD-6aE.normalTitle" = "Lizenzinformationen";
/* Class = "UILabel"; accessibilityLabel = "Der QR-Code befindet sich auf Ihrer Teilnahmebestätigung"; ObjectID = "OqX-q3-43s"; */
"OqX-q3-43s.accessibilityLabel" = "Der QR-Code befindet sich auf Ihrer Teilnahmebestätigung";
/* Class = "UILabel"; text = "Der QR-Code befindet sich auf Ihrer Teilnahmebestätigung"; ObjectID = "OqX-q3-43s"; */
"OqX-q3-43s.text" = "Der QR-Code befindet sich auf Ihrer Teilnahmebestätigung";
/* Class = "UIButton"; normalTitle = "Leader Board"; ObjectID = "P9e-ZM-HZP"; */
"P9e-ZM-HZP.normalTitle" = "Leader Board";
/* Class = "UITableViewSection"; headerTitle = "Batterie Sparen"; ObjectID = "PQM-l6-Zw8"; */
"PQM-l6-Zw8.headerTitle" = "Batterie Sparen";
/* Class = "UINavigationItem"; title = "Tracker"; ObjectID = "Pei-UE-kDI"; */
"Pei-UE-kDI.title" = "Tracker";
/* Class = "UIViewController"; title = "Timer"; ObjectID = "QJL-mi-hJE"; */
"QJL-mi-hJE.title" = "Timer";
/* Class = "UIViewController"; title = "Geschwindigkeit"; ObjectID = "RAt-Nw-u56"; */
"RAt-Nw-u56.title" = "Geschwindigkeit";
/* Class = "UINavigationItem"; title = "Einstellungen"; ObjectID = "SbA-xV-4ro"; */
"SbA-xV-4ro.title" = "Einstellungen";
/* Class = "UILabel"; text = "59"; ObjectID = "Txm-uf-MP4"; */
"Txm-uf-MP4.text" = "59";
/* Class = "UIButton"; normalTitle = "Stoppe Tracking"; ObjectID = "ULl-vy-5gb"; */
"ULl-vy-5gb.normalTitle" = "Stoppe Tracking";
/* Class = "UILabel"; text = "Cached Fixes"; ObjectID = "Ujw-jg-ilY"; */
"Ujw-jg-ilY.text" = "Cached Fixes";
/* Class = "UILabel"; text = "Geschwindigkeit"; ObjectID = "V9h-qX-rao"; */
"V9h-qX-rao.text" = "Geschwindigkeit";
/* Class = "UILabel"; text = "Modus"; ObjectID = "Xww-rc-pOA"; */
"Xww-rc-pOA.text" = "Modus";
/* Class = "UILabel"; text = "Version"; ObjectID = "YpQ-wa-mW3"; */
"YpQ-wa-mW3.text" = "Version";
/* Class = "UILabel"; text = "GPS Genauigkeit"; ObjectID = "Z1d-5I-pbj"; */
"Z1d-5I-pbj.text" = "GPS Genauigkeit";
/* Class = "UINavigationItem"; title = "AGB"; ObjectID = "bO3-X5-ui2"; */
"bO3-X5-ui2.title" = "AGB";
/* Class = "UILabel"; text = "Stunden"; ObjectID = "c2J-Uj-KEg"; */
"c2J-Uj-KEg.text" = "Stunden";
/* Class = "UILabel"; text = "0"; ObjectID = "dz3-w7-CCh"; */
"dz3-w7-CCh.text" = "0";
/* Class = "UIViewController"; title = "Tracking"; ObjectID = "eHd-jN-WkS"; */
"eHd-jN-WkS.title" = "Tracking";
/* Class = "UILabel"; text = "Batterie Sparen"; ObjectID = "eRQ-p8-ydN"; */
"eRQ-p8-ydN.text" = "Batterie Sparen";
/* Class = "UILabel"; text = "Regatta beginnt in"; ObjectID = "ft9-jD-C5m"; */
"ft9-jD-C5m.text" = "Regatta beginnt in";
/* Class = "UINavigationItem"; title = "Tracking"; ObjectID = "fyS-rY-bYp"; */
"fyS-rY-bYp.title" = "Tracking";
/* Class = "UILabel"; text = "Letzte Synchronisierung"; ObjectID = "gHJ-am-Ulb"; */
"gHJ-am-Ulb.text" = "Letzte Synchronisierung";
/* Class = "UILabel"; text = "24"; ObjectID = "gaG-Iv-Xyq"; */
"gaG-Iv-Xyq.text" = "24";
/* Class = "UILabel"; text = "GER 17"; ObjectID = "iIf-9z-7fe"; */
"iIf-9z-7fe.text" = "GER 17";
/* Class = "UILabel"; text = "0.0 kn"; ObjectID = "l5u-i3-029"; */
"l5u-i3-029.text" = "0.0 kn";
/* Class = "UILabel"; text = "Tage"; ObjectID = "l8F-Sg-cUb"; */
"l8F-Sg-cUb.text" = "Tage";
/* Class = "UINavigationItem"; title = "Tracker"; ObjectID = "lqI-5f-PEI"; */
"lqI-5f-PEI.title" = "Tracker";
/* Class = "UILabel"; text = "00:00.00"; ObjectID = "mUm-EE-6Is"; */
"mUm-EE-6Is.text" = "00:00.00";
/* Class = "UIButton"; normalTitle = "Starte Tracking"; ObjectID = "mj9-m1-nYY"; */
"mj9-m1-nYY.normalTitle" = "Starte Tracking";
/* Class = "UILabel"; text = "Max Mustermann"; ObjectID = "oJS-dM-2B6"; */
"oJS-dM-2B6.text" = "Max Mustermann";
/* Class = "UIViewController"; title = "Kurs"; ObjectID = "pzM-XJ-vUZ"; */
"pzM-XJ-vUZ.title" = "Kurs";
/* Class = "UINavigationItem"; title = "Tracking"; ObjectID = "qW6-wb-0HC"; */
"qW6-wb-0HC.title" = "Tracking";
/* Class = "UINavigationItem"; title = "Tracking"; ObjectID = "qfB-FT-Ysz"; */
"qfB-FT-Ysz.title" = "Tracking";
/* Class = "UILabel"; text = "Status"; ObjectID = "r6d-OU-cRI"; */
"r6d-OU-cRI.text" = "Status";
/* Class = "UIPageViewController"; title = "Tracking Page View Controller"; ObjectID = "rjH-vb-OUF"; */
"rjH-vb-OUF.title" = "Tracking Page View Controller";
/* Class = "UILabel"; text = "356"; ObjectID = "sGD-0U-P4b"; */
"sGD-0U-P4b.text" = "356";
/* Class = "UILabel"; text = "0 °"; ObjectID = "sGK-xV-9a0"; */
"sGK-xV-9a0.text" = "0 °";
/* Class = "UILabel"; text = "Online"; ObjectID = "tJY-RR-vpe"; */
"tJY-RR-vpe.text" = "Online";
/* Class = "UIViewController"; title = "Home"; ObjectID = "vXZ-lx-hvc"; */
"vXZ-lx-hvc.title" = "Home";
/* Class = "UIBarButtonItem"; title = "Ablehnen"; ObjectID = "xAL-3o-tyx"; */
"xAL-3o-tyx.title" = "Ablehnen";
@@ -0,0 +1,201 @@
/* Class = "UILabel"; text = "COG"; ObjectID = "1Tn-6d-NlO"; */
"1Tn-6d-NlO.text" = "COG";
/* Class = "UIView"; accessibilityLabel = "Name, Sail ID"; ObjectID = "2UK-je-59c"; */
"2UK-je-59c.accessibilityLabel" = "Name, Sail ID";
/* Class = "UILabel"; text = "Event Label"; ObjectID = "4Xi-He-o21"; */
"4Xi-He-o21.text" = "Event Label";
/* Class = "UILabel"; text = "Status Label"; ObjectID = "5Xu-6g-tqP"; */
"5Xu-6g-tqP.text" = "Status Label";
/* Class = "UIButton"; normalTitle = "EULA"; ObjectID = "8Vc-YY-1rh"; */
"8Vc-YY-1rh.normalTitle" = "EULA";
/* Class = "UILabel"; accessibilityLabel = "You can find your QR code on your registration confirmation"; ObjectID = "8aO-2n-aG5"; */
"8aO-2n-aG5.accessibilityLabel" = "You can find your QR code on your registration confirmation";
/* Class = "UILabel"; text = "Please listen to announcements"; ObjectID = "8aO-2n-aG5"; */
"8aO-2n-aG5.text" = "Please listen to announcements";
/* Class = "UINavigationItem"; title = "About"; ObjectID = "8o6-Yh-CuN"; */
"8o6-Yh-CuN.title" = "About";
/* Class = "UINavigationItem"; title = "Leader Board"; ObjectID = "8qz-J9-1KL"; */
"8qz-J9-1KL.title" = "Leader Board";
/* Class = "UIBarButtonItem"; title = "Home"; ObjectID = "ASu-3l-KjT"; */
"ASu-3l-KjT.title" = "Home";
/* Class = "UINavigationItem"; title = "Regatta"; ObjectID = "BjQ-Fx-PEX"; */
"BjQ-Fx-PEX.title" = "Regatta";
/* Class = "UIButton"; normalTitle = "Your Team Photo"; ObjectID = "CDA-ep-bjo"; */
"CDA-ep-bjo.normalTitle" = "Your Team Photo";
/* Class = "UILabel"; text = "GPS Accuracy Label"; ObjectID = "DiM-MR-SGV"; */
"DiM-MR-SGV.text" = "GPS Accuracy Label";
/* Class = "UILabel"; text = "Minutes"; ObjectID = "EES-a9-qxv"; */
"EES-a9-qxv.text" = "Minutes";
/* Class = "UIButton"; accessibilityLabel = "Don't have a QR Code?"; ObjectID = "Fp0-61-7he"; */
"Fp0-61-7he.accessibilityLabel" = "Don't have a QR Code?";
/* Class = "UIButton"; normalTitle = "Don't have a QR Code?"; ObjectID = "Fp0-61-7he"; */
"Fp0-61-7he.normalTitle" = "Don't have a QR Code?";
/* Class = "UIButton"; normalTitle = "Error during upload. Tap to retry."; ObjectID = "Gjq-vj-gAR"; */
"Gjq-vj-gAR.normalTitle" = "Error during upload. Tap to retry.";
/* Class = "UILabel"; text = "Device Identifier:"; ObjectID = "GpR-bL-Ekk"; */
"GpR-bL-Ekk.text" = "Device Identifier:";
/* Class = "UILabel"; text = "Label"; ObjectID = "IHy-Ae-s1D"; */
"IHy-Ae-s1D.text" = "Label";
/* Class = "UILabel"; text = "Tracking Time"; ObjectID = "IeZ-JM-OWw"; */
"IeZ-JM-OWw.text" = "Tracking Time";
/* Class = "UIButton"; accessibilityLabel = "Scan QR Code"; ObjectID = "Ieu-ch-jeI"; */
"Ieu-ch-jeI.accessibilityLabel" = "Scan QR Code";
/* Class = "UIButton"; normalTitle = "Scan QR Code"; ObjectID = "Ieu-ch-jeI"; */
"Ieu-ch-jeI.normalTitle" = "Scan QR Code";
/* Class = "UILabel"; text = "1.0.0"; ObjectID = "Jsi-LA-7jU"; */
"Jsi-LA-7jU.text" = "1.0.0";
/* Class = "UINavigationItem"; title = "Scan QR Code"; ObjectID = "LQ4-39-f6l"; */
"LQ4-39-f6l.title" = "Scan QR Code";
/* Class = "UIButton"; normalTitle = "Zum Event"; ObjectID = "Lzv-E6-gsr"; */
"Lzv-E6-gsr.normalTitle" = "Zum Event";
/* Class = "UITableViewSection"; headerTitle = "Other Settings"; ObjectID = "MJM-DA-e7Q"; */
"MJM-DA-e7Q.headerTitle" = "Other Settings";
/* Class = "UIButton"; normalTitle = "License Information"; ObjectID = "MpZ-GD-6aE"; */
"MpZ-GD-6aE.normalTitle" = "License Information";
/* Class = "UILabel"; accessibilityLabel = "You can find your QR code on your registration confirmation"; ObjectID = "OqX-q3-43s"; */
"OqX-q3-43s.accessibilityLabel" = "You can find your QR code on your registration confirmation";
/* Class = "UILabel"; text = "You can find your QR code on your registration confirmation"; ObjectID = "OqX-q3-43s"; */
"OqX-q3-43s.text" = "You can find your QR code on your registration confirmation";
/* Class = "UIButton"; normalTitle = "Leader Board"; ObjectID = "P9e-ZM-HZP"; */
"P9e-ZM-HZP.normalTitle" = "Leader Board";
/* Class = "UITableViewSection"; headerTitle = "Energy Management"; ObjectID = "PQM-l6-Zw8"; */
"PQM-l6-Zw8.headerTitle" = "Energy Management";
/* Class = "UIViewController"; title = "Timer"; ObjectID = "QJL-mi-hJE"; */
"QJL-mi-hJE.title" = "Timer";
/* Class = "UIViewController"; title = "Speed"; ObjectID = "RAt-Nw-u56"; */
"RAt-Nw-u56.title" = "Speed";
/* Class = "UINavigationItem"; title = "Settings"; ObjectID = "SbA-xV-4ro"; */
"SbA-xV-4ro.title" = "Settings";
/* Class = "UILabel"; text = "59"; ObjectID = "Txm-uf-MP4"; */
"Txm-uf-MP4.text" = "59";
/* Class = "UILabel"; text = "Cached Fixes"; ObjectID = "Ujw-jg-ilY"; */
"Ujw-jg-ilY.text" = "Cached Fixes";
/* Class = "UILabel"; text = "Speed"; ObjectID = "V9h-qX-rao"; */
"V9h-qX-rao.text" = "Speed";
/* Class = "UILabel"; text = "Mode"; ObjectID = "Xww-rc-pOA"; */
"Xww-rc-pOA.text" = "Mode";
/* Class = "UILabel"; text = "Version"; ObjectID = "YpQ-wa-mW3"; */
"YpQ-wa-mW3.text" = "Version";
/* Class = "UILabel"; text = "GPS Accuracy"; ObjectID = "Z1d-5I-pbj"; */
"Z1d-5I-pbj.text" = "GPS Accuracy";
/* Class = "UILabel"; text = "Hours"; ObjectID = "c2J-Uj-KEg"; */
"c2J-Uj-KEg.text" = "Hours";
/* Class = "UILabel"; text = "Cached Fixes Label"; ObjectID = "dz3-w7-CCh"; */
"dz3-w7-CCh.text" = "Cached Fixes Label";
/* Class = "UIViewController"; title = "Tracking"; ObjectID = "eHd-jN-WkS"; */
"eHd-jN-WkS.title" = "Tracking";
/* Class = "UILabel"; text = "Battery Saving"; ObjectID = "eRQ-p8-ydN"; */
"eRQ-p8-ydN.text" = "Battery Saving";
/* Class = "UILabel"; text = "Regatta starts in"; ObjectID = "ft9-jD-C5m"; */
"ft9-jD-C5m.text" = "Regatta starts in";
/* Class = "UINavigationItem"; title = "Tracking"; ObjectID = "fyS-rY-bYp"; */
"fyS-rY-bYp.title" = "Tracking";
/* Class = "UILabel"; text = "24"; ObjectID = "gaG-Iv-Xyq"; */
"gaG-Iv-Xyq.text" = "24";
/* Class = "UILabel"; text = "Sail ID Label"; ObjectID = "iIf-9z-7fe"; */
"iIf-9z-7fe.text" = "Sail ID Label";
/* Class = "UILabel"; text = "0.0 kn"; ObjectID = "l5u-i3-029"; */
"l5u-i3-029.text" = "0.0 kn";
/* Class = "UILabel"; text = "Days"; ObjectID = "l8F-Sg-cUb"; */
"l8F-Sg-cUb.text" = "Days";
/* Class = "UILabel"; text = "Title Label"; ObjectID = "lc2-1P-oDt"; */
"lc2-1P-oDt.text" = "Title Label";
/* Class = "UINavigationItem"; title = "Tracker"; ObjectID = "lqI-5f-PEI"; */
"lqI-5f-PEI.title" = "Tracker";
/* Class = "UILabel"; text = "00:00.00"; ObjectID = "mUm-EE-6Is"; */
"mUm-EE-6Is.text" = "00:00.00";
/* Class = "UIButton"; normalTitle = "Start Tracking"; ObjectID = "mj9-m1-nYY"; */
"mj9-m1-nYY.normalTitle" = "Start Tracking";
/* Class = "UIButton"; normalTitle = "Stop Tracking"; ObjectID = "mnl-aL-6R2"; */
"mnl-aL-6R2.normalTitle" = "Stop Tracking";
/* Class = "UILabel"; text = "Competitor Label"; ObjectID = "oJS-dM-2B6"; */
"oJS-dM-2B6.text" = "Competitor Label";
/* Class = "UIViewController"; title = "Heading"; ObjectID = "pzM-XJ-vUZ"; */
"pzM-XJ-vUZ.title" = "Heading";
/* Class = "UINavigationItem"; title = "Tracking"; ObjectID = "qW6-wb-0HC"; */
"qW6-wb-0HC.title" = "Tracking";
/* Class = "UINavigationItem"; title = "Tracking"; ObjectID = "qfB-FT-Ysz"; */
"qfB-FT-Ysz.title" = "Tracking";
/* Class = "UILabel"; text = "Status"; ObjectID = "r6d-OU-cRI"; */
"r6d-OU-cRI.text" = "Status";
/* Class = "UIPageViewController"; title = "Tracking Page View Controller"; ObjectID = "rjH-vb-OUF"; */
"rjH-vb-OUF.title" = "Tracking Page View Controller";
/* Class = "UILabel"; text = "356"; ObjectID = "sGD-0U-P4b"; */
"sGD-0U-P4b.text" = "356";
/* Class = "UILabel"; text = "0 °"; ObjectID = "sGK-xV-9a0"; */
"sGK-xV-9a0.text" = "0 °";
/* Class = "UILabel"; text = "Competitor Label"; ObjectID = "sNr-Dr-sM5"; */
"sNr-Dr-sM5.text" = "Competitor Label";
/* Class = "UILabel"; text = "Mode Label"; ObjectID = "tJY-RR-vpe"; */
"tJY-RR-vpe.text" = "Mode Label";
/* Class = "UIViewController"; title = "Home"; ObjectID = "vXZ-lx-hvc"; */
"vXZ-lx-hvc.title" = "Home";
/* Class = "UILabel"; text = "Leaderboard Label"; ObjectID = "yqN-BN-c2a"; */
"yqN-BN-c2a.text" = "Leaderboard Label";