flip_the_switch 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +146 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +13 -0
  5. data/CHANGELOG.md +14 -0
  6. data/Classes/FlipTheSwitch/FlipTheSwitch.h +9 -0
  7. data/Classes/FlipTheSwitch/FlipTheSwitch.m +88 -0
  8. data/Example/.gitignore +2 -0
  9. data/Example/Colors-iOS/AppDelegateiOS.h +3 -0
  10. data/Example/Colors-iOS/AppDelegateiOS.m +4 -0
  11. data/Example/Colors-iOS/Base.lproj/Main_iPhone.storyboard +76 -0
  12. data/Example/Colors-iOS/Colors-iOS-Info.plist +49 -0
  13. data/Example/Colors-iOS/Colors-iOS-Prefix.pch +16 -0
  14. data/Example/Colors-iOS/Images.xcassets/AppIcon.appiconset/Contents.json +53 -0
  15. data/Example/Colors-iOS/Images.xcassets/LaunchImage.launchimage/Contents.json +51 -0
  16. data/Example/Colors-iOS/ViewControlleriOS.h +2 -0
  17. data/Example/Colors-iOS/ViewControlleriOS.m +78 -0
  18. data/Example/Colors-iOS/main.m +8 -0
  19. data/Example/Colors.xcodeproj/project.pbxproj +358 -0
  20. data/Example/Colors.xcodeproj/xcshareddata/xcschemes/Colors-iOS.xcscheme +77 -0
  21. data/Example/Podfile +4 -0
  22. data/Example/Rakefile +23 -0
  23. data/Example/features.yml +2 -0
  24. data/FlipTheSwitch.podspec +16 -0
  25. data/Gemfile +17 -0
  26. data/Guardfile.example +15 -0
  27. data/LICENSE +21 -0
  28. data/README.md +104 -0
  29. data/Rakefile +35 -0
  30. data/Tests/FlipTheSwitchSpec-Mac/Features.plist +8 -0
  31. data/Tests/FlipTheSwitchSpec-Mac/FlipTheSwitchSpec-Mac-Info.plist +22 -0
  32. data/Tests/FlipTheSwitchSpec-Mac/FlipTheSwitchSpec-Mac-Prefix.pch +13 -0
  33. data/Tests/FlipTheSwitchSpec-iOS/Features.plist +8 -0
  34. data/Tests/FlipTheSwitchSpec-iOS/FlipTheSwitchSpec-iOS-Info.plist +22 -0
  35. data/Tests/FlipTheSwitchSpec-iOS/FlipTheSwitchSpec-iOS-Prefix.pch +14 -0
  36. data/Tests/FlipTheSwitchSpec.xcodeproj/project.pbxproj +605 -0
  37. data/Tests/FlipTheSwitchSpec.xcodeproj/xcshareddata/xcschemes/FlipTheSwitchSpec-Mac.xcscheme +75 -0
  38. data/Tests/FlipTheSwitchSpec.xcodeproj/xcshareddata/xcschemes/FlipTheSwitchSpec-iOS.xcscheme +75 -0
  39. data/Tests/Podfile +15 -0
  40. data/Tests/Rakefile +22 -0
  41. data/Tests/Spec/Classes/FlipTheSwitch/FlipTheSwitchSpec.m +88 -0
  42. data/Tests/Spec/Helpers/GcovTestObserver.h +4 -0
  43. data/Tests/Spec/Helpers/GcovTestObserver.m +12 -0
  44. data/bin/flip-the-switch +4 -0
  45. data/flip_the_switch.gemspec +17 -0
  46. data/lib/flip_the_switch/cli.rb +61 -0
  47. data/lib/flip_the_switch/errors.rb +12 -0
  48. data/lib/flip_the_switch/generator/base.rb +13 -0
  49. data/lib/flip_the_switch/generator/category.rb +71 -0
  50. data/lib/flip_the_switch/generator/header.h.erb +11 -0
  51. data/lib/flip_the_switch/generator/implementation.m.erb +26 -0
  52. data/lib/flip_the_switch/generator/plist.rb +17 -0
  53. data/lib/flip_the_switch/generator.rb +3 -0
  54. data/lib/flip_the_switch/reader/yaml.rb +39 -0
  55. data/lib/flip_the_switch/reader.rb +1 -0
  56. data/lib/flip_the_switch.rb +3 -0
  57. data/spec/flip_the_switch/cli_spec.rb +81 -0
  58. data/spec/flip_the_switch/generator/category_spec.rb +44 -0
  59. data/spec/flip_the_switch/generator/plist_spec.rb +19 -0
  60. data/spec/flip_the_switch/reader/yaml_spec.rb +43 -0
  61. data/spec/resources/ExpectedFeatures.plist +10 -0
  62. data/spec/resources/expected_header.h +16 -0
  63. data/spec/resources/expected_implementation.m +46 -0
  64. data/spec/resources/invalid_layout/features.yml +4 -0
  65. data/spec/resources/invalid_type/features.yml +7 -0
  66. data/spec/resources/real/features.yml +2 -0
  67. data/spec/spec_helper.rb +15 -0
  68. metadata +166 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 619f1abd162d81a6bbad84209c1cea55f2b27aa4
4
+ data.tar.gz: 5fe65dd5282fa538e9d7fae127bed002ad3b5b01
5
+ SHA512:
6
+ metadata.gz: a2e7f90c45df40258f8ff75ccae108e4ca54d57f382458b617453d8871eac376846172f232ab1a0a5c2d5832a3cb24d55c4bfa85bc5bb5da26082832f3981b4b
7
+ data.tar.gz: 6d7949f226ffec6785cadf0c6008ec653b9d0f28ec266c61db17eb92815ae79e941927dfa11cd98c9ad14eaf91f3e62c312cf7fe34cade0db96a209a7ef2391a
data/.gitignore ADDED
@@ -0,0 +1,146 @@
1
+ #########################
2
+ # .gitignore file for Xcode4 / OS X Source projects
3
+ #
4
+ # Version 2.0
5
+ # For latest version, see: http://stackoverflow.com/questions/49478/git-ignore-file-for-xcode-projects
6
+ #
7
+ # 2013 updates:
8
+ # - fixed the broken "save personal Schemes"
9
+ #
10
+ # NB: if you are storing "built" products, this WILL NOT WORK,
11
+ # and you should use a different .gitignore (or none at all)
12
+ # This file is for SOURCE projects, where there are many extra
13
+ # files that we want to exclude
14
+ #
15
+ #########################
16
+
17
+ #####
18
+ # Guard
19
+ Guardfile
20
+
21
+ #####
22
+ # Coveralls
23
+ .coveralls.yml
24
+
25
+ #####
26
+ # Cocoapods
27
+ Pods/
28
+
29
+ #####
30
+ # Gems
31
+ *.gem
32
+
33
+ #####
34
+ # OS X temporary files that should never be committed
35
+
36
+ .DS_Store
37
+ *.swp
38
+ *.lock
39
+ profile
40
+
41
+
42
+ ####
43
+ # Xcode temporary files that should never be committed
44
+ #
45
+ # NB: NIB/XIB files still exist even on Storyboard projects, so we want this...
46
+
47
+ *~.nib
48
+
49
+
50
+ ####
51
+ # Xcode build files -
52
+ #
53
+ # NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "DerivedData"
54
+
55
+ DerivedData/
56
+
57
+ # NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "build"
58
+
59
+ build/
60
+
61
+
62
+ #####
63
+ # Xcode private settings (window sizes, bookmarks, breakpoints, custom executables, smart groups)
64
+ #
65
+ # This is complicated:
66
+ #
67
+ # SOMETIMES you need to put this file in version control.
68
+ # Apple designed it poorly - if you use "custom executables", they are
69
+ # saved in this file.
70
+ # 99% of projects do NOT use those, so they do NOT want to version control this file.
71
+ # ..but if you're in the 1%, comment out the line "*.pbxuser"
72
+
73
+ *.pbxuser
74
+ *.mode1v3
75
+ *.mode2v3
76
+ *.perspectivev3
77
+ # NB: also, whitelist the default ones, some projects need to use these
78
+ !default.pbxuser
79
+ !default.mode1v3
80
+ !default.mode2v3
81
+ !default.perspectivev3
82
+
83
+
84
+ ####
85
+ # Xcode 4 - semi-personal settings
86
+ #
87
+ #
88
+ # OPTION 1: ---------------------------------
89
+ # throw away ALL personal settings (including custom schemes!
90
+ # - unless they are "shared")
91
+ #
92
+ # NB: this is exclusive with OPTION 2 below
93
+ xcuserdata
94
+
95
+ # OPTION 2: ---------------------------------
96
+ # get rid of ALL personal settings, but KEEP SOME OF THEM
97
+ # - NB: you must manually uncomment the bits you want to keep
98
+ #
99
+ # NB: this is exclusive with OPTION 1 above
100
+ #
101
+ #xcuserdata/**/*
102
+
103
+ # (requires option 2 above): Personal Schemes
104
+ #
105
+ #!xcuserdata/**/xcschemes/*
106
+
107
+ ####
108
+ # XCode 4 workspaces - more detailed
109
+ #
110
+ # Workspaces are important! They are a core feature of Xcode - don't exclude them :)
111
+ #
112
+ # Workspace layout is quite spammy. For reference:
113
+ #
114
+ # /(root)/
115
+ # /(project-name).xcodeproj/
116
+ # project.pbxproj
117
+ # /project.xcworkspace/
118
+ # contents.xcworkspacedata
119
+ # /xcuserdata/
120
+ # /(your name)/xcuserdatad/
121
+ # UserInterfaceState.xcuserstate
122
+ # /xcsshareddata/
123
+ # /xcschemes/
124
+ # (shared scheme name).xcscheme
125
+ # /xcuserdata/
126
+ # /(your name)/xcuserdatad/
127
+ # (private scheme).xcscheme
128
+ # xcschememanagement.plist
129
+ #
130
+ #
131
+ *.xcworkspace
132
+
133
+ ####
134
+ # Xcode 4 - Deprecated classes
135
+ #
136
+ # Allegedly, if you manually "deprecate" your classes, they get moved here.
137
+ #
138
+ # We're using source-control, so this is a "feature" that we do not want!
139
+
140
+ *.moved-aside
141
+
142
+
143
+ ####
144
+ # UNKNOWN: recommended by others, but I can't discover what these files are
145
+ #
146
+ # ...none. Everything is now explained.
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color --drb --format documentation
data/.travis.yml ADDED
@@ -0,0 +1,13 @@
1
+ language: objective-c
2
+ before_install:
3
+ - brew update
4
+ - brew upgrade xctool
5
+ - sudo easy_install cpp-coveralls
6
+ - gem install bundler
7
+ - bundle install
8
+ script: bundle exec rake ci
9
+ after_success: bundle exec rake coverage
10
+ addons:
11
+ code_climate:
12
+ repo_token:
13
+ secure: OX7DsiC54CWoPd2c2LQ2zI9TNUNGwkXRRPDb1i0pPLHW3YhRnxfLC79R3wXSYHwWfQY4VYDvNL3Kn44XltyZfptPcksSYJFdU2bmA1ppoyEO72CuCAVlFlcbmBfqdLclP4h5pXJdP+euW0QPvl6JpEnIKz+77vVnkLj6jotSL+g=
data/CHANGELOG.md ADDED
@@ -0,0 +1,14 @@
1
+ # 0.3.0 / 2014-07-02
2
+
3
+ * [FEATURE] #15 Auto-create category for features
4
+ * [FEATURE] #13 Auto-create plist file for features
5
+ * [FEATURE] #10 Create gem
6
+
7
+ # 0.2.0 / 2014-06-06
8
+
9
+ * [FEATURE] #9 Allow setting initial feature settings via plist file
10
+
11
+ # 0.1.0 / 2014-06-06
12
+
13
+ * [FEATURE] #1 Allow in-app feature setting & unsetting
14
+ * [FEATURE] #2 Persist through app close
@@ -0,0 +1,9 @@
1
+ @interface FlipTheSwitch : NSObject
2
+ - (instancetype)init __attribute__((unavailable("init not available ")));
3
+ + (instancetype)sharedInstance;
4
+
5
+ - (BOOL)isFeatureEnabled:(NSString *)feature;
6
+ - (void)enableFeature:(NSString *)feature;
7
+ - (void)disableFeature:(NSString *)feature;
8
+ - (void)setFeature:(NSString *)feature enabled:(BOOL)enabled;
9
+ @end
@@ -0,0 +1,88 @@
1
+ #import "FlipTheSwitch.h"
2
+
3
+ @interface FlipTheSwitch ()
4
+ @property (nonatomic, readonly) NSUserDefaults *userDefaults;
5
+ @property (nonatomic, readonly) NSBundle *bundle;
6
+ @end
7
+
8
+ @implementation FlipTheSwitch {
9
+ NSDictionary *_plistEnabledFeatures;
10
+ }
11
+
12
+ #pragma mark - Singleton
13
+
14
+ + (instancetype)sharedInstance
15
+ {
16
+ static FlipTheSwitch *sharedInstance;
17
+ static dispatch_once_t once;
18
+ dispatch_once(&once, ^{
19
+ sharedInstance = [[self alloc] initWithUserDefaults:[NSUserDefaults standardUserDefaults]
20
+ bundle:[NSBundle mainBundle]];
21
+ });
22
+ return sharedInstance;
23
+ }
24
+
25
+ #pragma mark - Initialization
26
+
27
+ - (instancetype)initWithUserDefaults:(NSUserDefaults *)userDefaults
28
+ bundle:(NSBundle *)bundle
29
+ {
30
+ self = [super init];
31
+ if (self) {
32
+ NSParameterAssert(userDefaults);
33
+ NSParameterAssert(bundle);
34
+ _userDefaults = userDefaults;
35
+ _bundle = bundle;
36
+ }
37
+ return self;
38
+ }
39
+
40
+ #pragma mark - Public
41
+
42
+ - (BOOL)isFeatureEnabled:(NSString *)feature
43
+ {
44
+ NSNumber *userEnabledFeature = [self.userDefaults objectForKey:[self userKeyForFeature:feature]];
45
+ if (userEnabledFeature) {
46
+ return [userEnabledFeature boolValue];
47
+ } else {
48
+ return [[[self plistEnabledFeatures] objectForKey:feature] boolValue];
49
+ }
50
+ }
51
+
52
+ - (void)enableFeature:(NSString *)feature
53
+ {
54
+ [self setFeature:feature enabled:YES];
55
+ }
56
+
57
+ - (void)disableFeature:(NSString *)feature
58
+ {
59
+ [self setFeature:feature enabled:NO];
60
+ }
61
+
62
+ - (void)setFeature:(NSString *)feature enabled:(BOOL)enabled
63
+ {
64
+ [self.userDefaults setBool:enabled forKey:[self userKeyForFeature:feature]];
65
+ [self.userDefaults synchronize];
66
+ }
67
+
68
+ #pragma mark - Private
69
+
70
+ - (NSString *)userKeyForFeature:(NSString *)feature
71
+ {
72
+ return [NSString stringWithFormat:@"FTS_FEATURE_%@", feature];
73
+ }
74
+
75
+ - (NSDictionary *)plistEnabledFeatures
76
+ {
77
+ if (!_plistEnabledFeatures) {
78
+ _plistEnabledFeatures = [[NSDictionary alloc] initWithContentsOfFile:[self featurePlistPath]];
79
+ }
80
+ return _plistEnabledFeatures;
81
+ }
82
+
83
+ - (NSString *)featurePlistPath
84
+ {
85
+ return [self.bundle pathForResource:@"Features" ofType:@"plist"];
86
+ }
87
+
88
+ @end
@@ -0,0 +1,2 @@
1
+ Colors-iOS/Features.plist
2
+ Colors-iOS/FlipTheSwitch+Features.*
@@ -0,0 +1,3 @@
1
+ @interface AppDelegateiOS : UIResponder <UIApplicationDelegate>
2
+ @property (nonatomic) UIWindow *window;
3
+ @end
@@ -0,0 +1,4 @@
1
+ #import "AppDelegateiOS.h"
2
+
3
+ @implementation AppDelegateiOS
4
+ @end
@@ -0,0 +1,76 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="5056" systemVersion="12F45" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="vXZ-lx-hvc">
3
+ <dependencies>
4
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3733"/>
5
+ </dependencies>
6
+ <scenes>
7
+ <!--View ControlleriOS-->
8
+ <scene sceneID="ufC-wZ-h7g">
9
+ <objects>
10
+ <viewController id="vXZ-lx-hvc" customClass="ViewControlleriOS" sceneMemberID="viewController">
11
+ <layoutGuides>
12
+ <viewControllerLayoutGuide type="top" id="jyV-Pf-zRb"/>
13
+ <viewControllerLayoutGuide type="bottom" id="2fi-mo-0CV"/>
14
+ </layoutGuides>
15
+ <view key="view" contentMode="scaleToFill" id="kh9-bI-dsS">
16
+ <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
17
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
18
+ <subviews>
19
+ <view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="n3c-1r-4pm">
20
+ <rect key="frame" x="0.0" y="0.0" width="320" height="259"/>
21
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
22
+ <subviews>
23
+ <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="hmn-zk-CNu">
24
+ <rect key="frame" x="88" y="161" width="145" height="30"/>
25
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
26
+ <state key="normal" title="Change the top color">
27
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
28
+ </state>
29
+ <connections>
30
+ <action selector="topColorChangeButtonTapped" destination="vXZ-lx-hvc" eventType="touchUpInside" id="UDv-XR-9Cr"/>
31
+ </connections>
32
+ </button>
33
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="The top part of the screen is green" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6sQ-se-sag">
34
+ <rect key="frame" x="0.0" y="119" width="320" height="21"/>
35
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
36
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
37
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
38
+ <nil key="highlightedColor"/>
39
+ </label>
40
+ </subviews>
41
+ <color key="backgroundColor" red="0.0" green="1" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
42
+ </view>
43
+ <view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="7pg-AU-squ">
44
+ <rect key="frame" x="0.0" y="267" width="320" height="301"/>
45
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
46
+ <subviews>
47
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="The bottom part of the screen is yellow" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="l8T-13-b9l">
48
+ <rect key="frame" x="0.0" y="140" width="320" height="21"/>
49
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
50
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
51
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
52
+ <nil key="highlightedColor"/>
53
+ </label>
54
+ </subviews>
55
+ <color key="backgroundColor" red="1" green="1" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
56
+ </view>
57
+ </subviews>
58
+ </view>
59
+ <connections>
60
+ <outlet property="bottomColorInfoTextView" destination="l8T-13-b9l" id="DVQ-Pv-h5e"/>
61
+ <outlet property="bottomColorView" destination="7pg-AU-squ" id="V4I-KX-4e3"/>
62
+ <outlet property="topColorChangeButton" destination="hmn-zk-CNu" id="u6i-up-Bry"/>
63
+ <outlet property="topColorInfoTextView" destination="6sQ-se-sag" id="ury-Jl-zil"/>
64
+ <outlet property="topColorView" destination="n3c-1r-4pm" id="zTf-UX-aoz"/>
65
+ </connections>
66
+ </viewController>
67
+ <placeholder placeholderIdentifier="IBFirstResponder" id="x5A-6p-PRh" sceneMemberID="firstResponder"/>
68
+ </objects>
69
+ </scene>
70
+ </scenes>
71
+ <simulatedMetricsContainer key="defaultSimulatedMetrics">
72
+ <simulatedStatusBarMetrics key="statusBar"/>
73
+ <simulatedOrientationMetrics key="orientation"/>
74
+ <simulatedScreenMetrics key="destination" type="retina4"/>
75
+ </simulatedMetricsContainer>
76
+ </document>
@@ -0,0 +1,49 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>CFBundleDevelopmentRegion</key>
6
+ <string>en</string>
7
+ <key>CFBundleDisplayName</key>
8
+ <string>${PRODUCT_NAME}</string>
9
+ <key>CFBundleExecutable</key>
10
+ <string>${EXECUTABLE_NAME}</string>
11
+ <key>CFBundleIdentifier</key>
12
+ <string>com.github.${PRODUCT_NAME:rfc1034identifier}</string>
13
+ <key>CFBundleInfoDictionaryVersion</key>
14
+ <string>6.0</string>
15
+ <key>CFBundleName</key>
16
+ <string>${PRODUCT_NAME}</string>
17
+ <key>CFBundlePackageType</key>
18
+ <string>APPL</string>
19
+ <key>CFBundleShortVersionString</key>
20
+ <string>1.0</string>
21
+ <key>CFBundleSignature</key>
22
+ <string>????</string>
23
+ <key>CFBundleVersion</key>
24
+ <string>1.0</string>
25
+ <key>LSRequiresIPhoneOS</key>
26
+ <true/>
27
+ <key>UIMainStoryboardFile</key>
28
+ <string>Main_iPhone</string>
29
+ <key>UIMainStoryboardFile~ipad</key>
30
+ <string>Main_iPad</string>
31
+ <key>UIRequiredDeviceCapabilities</key>
32
+ <array>
33
+ <string>armv7</string>
34
+ </array>
35
+ <key>UISupportedInterfaceOrientations</key>
36
+ <array>
37
+ <string>UIInterfaceOrientationPortrait</string>
38
+ <string>UIInterfaceOrientationLandscapeLeft</string>
39
+ <string>UIInterfaceOrientationLandscapeRight</string>
40
+ </array>
41
+ <key>UISupportedInterfaceOrientations~ipad</key>
42
+ <array>
43
+ <string>UIInterfaceOrientationPortrait</string>
44
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
45
+ <string>UIInterfaceOrientationLandscapeLeft</string>
46
+ <string>UIInterfaceOrientationLandscapeRight</string>
47
+ </array>
48
+ </dict>
49
+ </plist>
@@ -0,0 +1,16 @@
1
+ //
2
+ // Prefix header
3
+ //
4
+ // The contents of this file are implicitly included at the beginning of every source file.
5
+ //
6
+
7
+ #import <Availability.h>
8
+
9
+ #ifndef __IPHONE_5_0
10
+ #warning "This project uses features only available in iOS SDK 5.0 and later."
11
+ #endif
12
+
13
+ #ifdef __OBJC__
14
+ #import <Foundation/Foundation.h>
15
+ #import <UIKit/UIKit.h>
16
+ #endif
@@ -0,0 +1,53 @@
1
+ {
2
+ "images" : [
3
+ {
4
+ "idiom" : "iphone",
5
+ "size" : "29x29",
6
+ "scale" : "2x"
7
+ },
8
+ {
9
+ "idiom" : "iphone",
10
+ "size" : "40x40",
11
+ "scale" : "2x"
12
+ },
13
+ {
14
+ "idiom" : "iphone",
15
+ "size" : "60x60",
16
+ "scale" : "2x"
17
+ },
18
+ {
19
+ "idiom" : "ipad",
20
+ "size" : "29x29",
21
+ "scale" : "1x"
22
+ },
23
+ {
24
+ "idiom" : "ipad",
25
+ "size" : "29x29",
26
+ "scale" : "2x"
27
+ },
28
+ {
29
+ "idiom" : "ipad",
30
+ "size" : "40x40",
31
+ "scale" : "1x"
32
+ },
33
+ {
34
+ "idiom" : "ipad",
35
+ "size" : "40x40",
36
+ "scale" : "2x"
37
+ },
38
+ {
39
+ "idiom" : "ipad",
40
+ "size" : "76x76",
41
+ "scale" : "1x"
42
+ },
43
+ {
44
+ "idiom" : "ipad",
45
+ "size" : "76x76",
46
+ "scale" : "2x"
47
+ }
48
+ ],
49
+ "info" : {
50
+ "version" : 1,
51
+ "author" : "xcode"
52
+ }
53
+ }
@@ -0,0 +1,51 @@
1
+ {
2
+ "images" : [
3
+ {
4
+ "orientation" : "portrait",
5
+ "idiom" : "iphone",
6
+ "extent" : "full-screen",
7
+ "minimum-system-version" : "7.0",
8
+ "scale" : "2x"
9
+ },
10
+ {
11
+ "orientation" : "portrait",
12
+ "idiom" : "iphone",
13
+ "subtype" : "retina4",
14
+ "extent" : "full-screen",
15
+ "minimum-system-version" : "7.0",
16
+ "scale" : "2x"
17
+ },
18
+ {
19
+ "orientation" : "portrait",
20
+ "idiom" : "ipad",
21
+ "extent" : "full-screen",
22
+ "minimum-system-version" : "7.0",
23
+ "scale" : "1x"
24
+ },
25
+ {
26
+ "orientation" : "landscape",
27
+ "idiom" : "ipad",
28
+ "extent" : "full-screen",
29
+ "minimum-system-version" : "7.0",
30
+ "scale" : "1x"
31
+ },
32
+ {
33
+ "orientation" : "portrait",
34
+ "idiom" : "ipad",
35
+ "extent" : "full-screen",
36
+ "minimum-system-version" : "7.0",
37
+ "scale" : "2x"
38
+ },
39
+ {
40
+ "orientation" : "landscape",
41
+ "idiom" : "ipad",
42
+ "extent" : "full-screen",
43
+ "minimum-system-version" : "7.0",
44
+ "scale" : "2x"
45
+ }
46
+ ],
47
+ "info" : {
48
+ "version" : 1,
49
+ "author" : "xcode"
50
+ }
51
+ }
@@ -0,0 +1,2 @@
1
+ @interface ViewControlleriOS : UIViewController
2
+ @end
@@ -0,0 +1,78 @@
1
+ #import "ViewControlleriOS.h"
2
+
3
+ #import "FlipTheSwitch+Features.h"
4
+
5
+ @interface ViewControlleriOS ()
6
+ @property (nonatomic, weak) IBOutlet UIView *topColorView;
7
+ @property (nonatomic, weak) IBOutlet UILabel *topColorInfoTextView;
8
+ @property (nonatomic, weak) IBOutlet UIButton *topColorChangeButton;
9
+ @property (nonatomic, weak) IBOutlet UIView *bottomColorView;
10
+ @property (nonatomic, weak) IBOutlet UILabel *bottomColorInfoTextView;
11
+ @end
12
+
13
+ @implementation ViewControlleriOS
14
+
15
+ #pragma mark - UIViewController Lifecycle
16
+
17
+ - (void)viewDidLoad
18
+ {
19
+ [super viewDidLoad];
20
+ [self setupView];
21
+ }
22
+
23
+ #pragma mark - Actions
24
+
25
+ - (IBAction)topColorChangeButtonTapped
26
+ {
27
+ [self toggleRedFeature];
28
+ }
29
+
30
+ #pragma mark - Private
31
+
32
+ - (void)setupView
33
+ {
34
+ [self setupTopView];
35
+ [self setupBottomView];
36
+ }
37
+
38
+ - (void)setupTopView
39
+ {
40
+ NSString *topColorName;
41
+ UIColor *topColor;
42
+ if ([FlipTheSwitch isRedColorEnabled]) {
43
+ topColorName = @"Red";
44
+ topColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:1];
45
+ } else {
46
+ topColorName = @"Green";
47
+ topColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:1];
48
+ }
49
+ self.topColorInfoTextView.text = [NSString stringWithFormat:@"The top part of the screen is %@", topColorName];
50
+ self.topColorView.backgroundColor = topColor;
51
+ }
52
+
53
+ - (void)setupBottomView
54
+ {
55
+ NSString *bottomColorName;
56
+ UIColor *bottomColor;
57
+ if ([FlipTheSwitch isPurpleColorEnabled]) {
58
+ bottomColorName = @"Purple";
59
+ bottomColor = [UIColor colorWithRed:1 green:0 blue:1 alpha:1];
60
+ } else {
61
+ bottomColorName = @"Yellow";
62
+ bottomColor = [UIColor colorWithRed:1 green:1 blue:0 alpha:1];
63
+ }
64
+ self.bottomColorInfoTextView.text = [NSString stringWithFormat:@"The bottom part of the screen is %@", bottomColorName];
65
+ self.bottomColorView.backgroundColor = bottomColor;
66
+ }
67
+
68
+ - (void)toggleRedFeature
69
+ {
70
+ if ([FlipTheSwitch isRedColorEnabled]) {
71
+ [FlipTheSwitch disableRedColor];
72
+ } else {
73
+ [FlipTheSwitch enableRedColor];
74
+ }
75
+ [self setupView];
76
+ }
77
+
78
+ @end
@@ -0,0 +1,8 @@
1
+ #import "AppDelegateiOS.h"
2
+
3
+ int main(int argc, char * argv[])
4
+ {
5
+ @autoreleasepool {
6
+ return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegateiOS class]));
7
+ }
8
+ }