From d1a0101a5da2cbdbea3484cb9259eb7083047dc2 Mon Sep 17 00:00:00 2001 From: Michael Kamprath Date: Sun, 20 Oct 2013 14:42:00 -0700 Subject: [PATCH] Refactored to enable certain behavior in subclasses --- Other/MKParentalGate/MKParentalGate.h | 29 ++++ Other/MKParentalGate/MKParentalGate.m | 46 ++++++ .../MKParentalGateTouchCancelView.h | 13 ++ .../MKParentalGateTouchCancelView.m | 31 ++++ .../MKParentalGateTouchTargetView.h | 29 ++++ .../MKParentalGateTouchTargetView.m | 70 +++++++++ .../MKParentalGateViewController.h | 16 ++ .../MKParentalGateViewController.m | 141 ++++++++++++++++++ .../MKParentalGateViewController.xib | 72 +++++++++ Other/MKParentalGate/icons/stop.png | Bin 0 -> 8957 bytes Other/MKParentalGate/icons/stop@2x.png | Bin 0 -> 13200 bytes .../project.pbxproj | 65 +++++++- .../ParentalGateSuccessViewController.h | 13 ++ .../ParentalGateSuccessViewController.m | 38 +++++ .../ParentalGateSuccessViewController.xib | 21 +++ .../TableViewCellsViewController.m | 34 ++++- .../MKTouchTrackingView/MKTouchTrackingView.h | 1 + .../MKTouchTrackingView/MKTouchTrackingView.m | 59 ++++++-- 18 files changed, 659 insertions(+), 19 deletions(-) create mode 100644 Other/MKParentalGate/MKParentalGate.h create mode 100644 Other/MKParentalGate/MKParentalGate.m create mode 100644 Other/MKParentalGate/MKParentalGateTouchCancelView.h create mode 100644 Other/MKParentalGate/MKParentalGateTouchCancelView.m create mode 100644 Other/MKParentalGate/MKParentalGateTouchTargetView.h create mode 100644 Other/MKParentalGate/MKParentalGateTouchTargetView.m create mode 100644 Other/MKParentalGate/MKParentalGateViewController.h create mode 100644 Other/MKParentalGate/MKParentalGateViewController.m create mode 100644 Other/MKParentalGate/MKParentalGateViewController.xib create mode 100644 Other/MKParentalGate/icons/stop.png create mode 100644 Other/MKParentalGate/icons/stop@2x.png create mode 100644 Sample App/iPhoneMK Sample App/ParentalGateSuccessViewController.h create mode 100644 Sample App/iPhoneMK Sample App/ParentalGateSuccessViewController.m create mode 100644 Sample App/iPhoneMK Sample App/ParentalGateSuccessViewController.xib diff --git a/Other/MKParentalGate/MKParentalGate.h b/Other/MKParentalGate/MKParentalGate.h new file mode 100644 index 0000000..3244fb1 --- /dev/null +++ b/Other/MKParentalGate/MKParentalGate.h @@ -0,0 +1,29 @@ +// +// MKParentalGate.h +// +// Copyright 2013 Michael F. Kamprath +// michael@claireware.com +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import + +typedef void (^MKParentalGateSuccessBlock)(void); +typedef void (^MKParentalGateFailureBlock)(void); + +@interface MKParentalGate : NSObject + ++(void)displayGateWithCurrentViewController:(UIViewController*)inViewController successBlock:(MKParentalGateSuccessBlock)inSuccessBlock failureBlock:(MKParentalGateFailureBlock)inFailureBlock; + +@end diff --git a/Other/MKParentalGate/MKParentalGate.m b/Other/MKParentalGate/MKParentalGate.m new file mode 100644 index 0000000..2a14950 --- /dev/null +++ b/Other/MKParentalGate/MKParentalGate.m @@ -0,0 +1,46 @@ +// +// MKParentalGate.h +// +// Copyright 2013 Michael F. Kamprath +// michael@claireware.com +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef __has_feature +#define __has_feature(x) 0 +#endif +#ifndef __has_extension +#define __has_extension __has_feature // Compatibility with pre-3.0 compilers. +#endif + +#if !(__has_feature(objc_arc) && __clang_major__ >= 3) +#error "MKParentalGate is designed to be used with ARC. Please add '-fobjc-arc' to the compiler flags of MKParentalGate.m." +#endif // __has_feature(objc_arc) + +#import "MKParentalGate.h" +#import "MKParentalGateViewController.h" + +@implementation MKParentalGate + ++(void)displayGateWithCurrentViewController:(UIViewController*)inViewController successBlock:(MKParentalGateSuccessBlock)inSuccessBlock failureBlock:(MKParentalGateFailureBlock)inFailureBlock +{ + + + MKParentalGateViewController* gateVC = [[MKParentalGateViewController alloc] initWithStopIcon:[UIImage imageNamed:@"stop.png"] goIcon:nil successBlock:inSuccessBlock failureBlock:inFailureBlock]; + + [inViewController presentViewController:gateVC animated:YES completion:NULL]; + +} + +@end diff --git a/Other/MKParentalGate/MKParentalGateTouchCancelView.h b/Other/MKParentalGate/MKParentalGateTouchCancelView.h new file mode 100644 index 0000000..1f30905 --- /dev/null +++ b/Other/MKParentalGate/MKParentalGateTouchCancelView.h @@ -0,0 +1,13 @@ +// +// MKParentalGateTouchCancelView.h +// iPhoneMK Sample App +// +// Created by Michael Kamprath on 10/20/13. +// +// + +#import "MKTouchTrackingView.h" + +@interface MKParentalGateTouchCancelView : MKTouchTrackingView + +@end diff --git a/Other/MKParentalGate/MKParentalGateTouchCancelView.m b/Other/MKParentalGate/MKParentalGateTouchCancelView.m new file mode 100644 index 0000000..6883899 --- /dev/null +++ b/Other/MKParentalGate/MKParentalGateTouchCancelView.m @@ -0,0 +1,31 @@ +// +// MKParentalGateTouchCancelView.m +// iPhoneMK Sample App +// +// Created by Michael Kamprath on 10/20/13. +// +// + +#import "MKParentalGateTouchCancelView.h" + +@implementation MKParentalGateTouchCancelView + +- (id)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + // Initialization code + } + return self; +} + +/* +// Only override drawRect: if you perform custom drawing. +// An empty implementation adversely affects performance during animation. +- (void)drawRect:(CGRect)rect +{ + // Drawing code +} +*/ + +@end diff --git a/Other/MKParentalGate/MKParentalGateTouchTargetView.h b/Other/MKParentalGate/MKParentalGateTouchTargetView.h new file mode 100644 index 0000000..cbd8e69 --- /dev/null +++ b/Other/MKParentalGate/MKParentalGateTouchTargetView.h @@ -0,0 +1,29 @@ +// +// MKParentalGateTouchTargetView.h +// iPhoneMK Sample App +// +// Created by Michael Kamprath on 10/19/13. +// +// + +#import "MKTouchTrackingAnimationView.h" + +@class MKParentalGateTouchTargetView; + +@protocol MKParentalGateTouchTargetDelegate + +@required +-(void)handleTargetTouchDown:(MKParentalGateTouchTargetView*)inTargetView; +-(void)handleTargetTouchUp:(MKParentalGateTouchTargetView*)inTargetView; + +@end + +@interface MKParentalGateTouchTargetView : MKTouchTrackingAnimationView + +- (id)initWithFrame:(CGRect)frame stopIcon:(UIImage*)inStopIcon goIcon:(UIImage*)inGoIcon delegate:(id)inDelegate; + +-(void)startAnimation; +-(void)pauseAnimation; +-(void)resumeAnimation; + +@end diff --git a/Other/MKParentalGate/MKParentalGateTouchTargetView.m b/Other/MKParentalGate/MKParentalGateTouchTargetView.m new file mode 100644 index 0000000..d0f445b --- /dev/null +++ b/Other/MKParentalGate/MKParentalGateTouchTargetView.m @@ -0,0 +1,70 @@ +// +// MKParentalGateTouchTargetView.m +// iPhoneMK Sample App +// +// Created by Michael Kamprath on 10/19/13. +// +// + +#import "MKParentalGateTouchTargetView.h" +@interface MKParentalGateTouchTargetView () +@property (strong,nonatomic) UIImage* goIcon; +@property (strong,nonatomic) UIImage* stopIcon; +@property (weak,nonatomic) id delegate; +@end + +@implementation MKParentalGateTouchTargetView + +- (id)initWithFrame:(CGRect)frame stopIcon:(UIImage*)inStopIcon goIcon:(UIImage*)inGoIcon delegate:(id)inDelegate; +{ + self = [super initWithFrame:frame]; + if (self) { + self.goIcon = inGoIcon; + self.stopIcon = inStopIcon; + self.delegate = inDelegate; + + MKSoundCoordinatedAnimationLayer* aniLayer = [[MKSoundCoordinatedAnimationLayer alloc] init]; + aniLayer.frame = CGRectMake(0, 0, frame.size.width, frame.size.height); + + self.animationLayer = aniLayer; + } + return self; +} + +/* +// Only override drawRect: if you perform custom drawing. +// An empty implementation adversely affects performance during animation. +- (void)drawRect:(CGRect)rect +{ + // Drawing code +} +*/ + +#pragma mark - Animation + +-(void)startAnimation { + [self.animationLayer startAnimating]; +} + +-(void)pauseAnimation { + [self.animationLayer pauseAnimation]; +} + +-(void)resumeAnimation { + [self.animationLayer resumeAnimation]; +} +#pragma mark - Touch Tracking + +-(void)touchInViewBegan { + [self.delegate handleTargetTouchDown:self]; +} + +-(void)touchUpInView { + [self.delegate handleTargetTouchUp:self]; +} + +-(void)touchTrackedOutOfView { + [self.delegate handleTargetTouchUp:self]; + [self cancelTouchTracking]; +} +@end diff --git a/Other/MKParentalGate/MKParentalGateViewController.h b/Other/MKParentalGate/MKParentalGateViewController.h new file mode 100644 index 0000000..ac860f6 --- /dev/null +++ b/Other/MKParentalGate/MKParentalGateViewController.h @@ -0,0 +1,16 @@ +// +// MKParentalGateViewController.h +// iPhoneMK Sample App +// +// Created by Michael Kamprath on 10/19/13. +// +// + +#import +#import "MKParentalGate.h" + +@interface MKParentalGateViewController : UIViewController + +- (id)initWithStopIcon:(UIImage*)inStopIcon goIcon:(UIImage*)inGoIcon successBlock:(MKParentalGateSuccessBlock)inSuccessBlock failureBlock:(MKParentalGateFailureBlock)inFailureBlock; + +@end diff --git a/Other/MKParentalGate/MKParentalGateViewController.m b/Other/MKParentalGate/MKParentalGateViewController.m new file mode 100644 index 0000000..eb35cbc --- /dev/null +++ b/Other/MKParentalGate/MKParentalGateViewController.m @@ -0,0 +1,141 @@ +// +// MKParentalGateViewController.m +// iPhoneMK Sample App +// +// Created by Michael Kamprath on 10/19/13. +// +// + +#ifndef __has_feature +#define __has_feature(x) 0 +#endif +#ifndef __has_extension +#define __has_extension __has_feature // Compatibility with pre-3.0 compilers. +#endif + +#if !(__has_feature(objc_arc) && __clang_major__ >= 3) +#error "MKParentalGate is designed to be used with ARC. Please add '-fobjc-arc' to the compiler flags of MKParentalGateViewController.m." +#endif // __has_feature(objc_arc) + +#import "MKParentalGateViewController.h" +#import "MKParentalGateTouchTargetView.h" + +@interface MKParentalGateViewController () + +@property (weak,nonatomic) IBOutlet UIView* topObjectView; +@property (weak,nonatomic) IBOutlet UIView* bottomObjectView; +@property (weak,nonatomic) IBOutlet UILabel* titleLabel; +@property (weak,nonatomic) IBOutlet UILabel* topExplanationLabel; +@property (weak,nonatomic) IBOutlet UILabel* bottomExplanationLabel; +@property (strong,nonatomic) MKParentalGateTouchTargetView* topTarget; +@property (strong,nonatomic) MKParentalGateTouchTargetView* bottomTarget; +@property (strong,nonatomic) UIImage* goIcon; +@property (strong,nonatomic) UIImage* stopIcon; +@property (strong,nonatomic) MKParentalGateSuccessBlock successBlock; +@property (strong,nonatomic) MKParentalGateFailureBlock failureBlock; + +-(NSDictionary*)topTouchTargetAnimation; +-(NSDictionary*)bottomTouchTargetAnimation; + +@end + +@implementation MKParentalGateViewController + +- (id)initWithStopIcon:(UIImage*)inStopIcon goIcon:(UIImage*)inGoIcon successBlock:(MKParentalGateSuccessBlock)inSuccessBlock failureBlock:(MKParentalGateFailureBlock)inFailureBlock +{ + self = [super initWithNibName:@"MKParentalGateViewController" bundle:nil]; + if (self) { + self.stopIcon = inStopIcon; + self.goIcon = inGoIcon; + self.successBlock = inSuccessBlock; + self.failureBlock = inFailureBlock; + + if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) { + [self setNeedsStatusBarAppearanceUpdate]; + } + else { + self.wantsFullScreenLayout = YES; + } + } + return self; +} +-(BOOL)prefersStatusBarHidden { + return YES; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +-(void)viewDidAppear:(BOOL)animated { + [self.topTarget startAnimation]; + [self.bottomTarget startAnimation]; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + // Do any additional setup after loading the view from its nib. + + self.topTarget = [[MKParentalGateTouchTargetView alloc] initWithFrame:CGRectMake(0, (self.topObjectView.bounds.size.height - self.stopIcon.size.height)/2.0, self.stopIcon.size.width, self.stopIcon.size.height) stopIcon:self.stopIcon goIcon:self.goIcon delegate:self]; + self.topTarget.animationLayer.config = [self topTouchTargetAnimation]; + [self.topObjectView addSubview:self.topTarget]; + + self.bottomTarget = [[MKParentalGateTouchTargetView alloc] initWithFrame:CGRectMake(self.bottomObjectView.bounds.size.width - self.stopIcon.size.width, (self.bottomObjectView.bounds.size.height - self.stopIcon.size.height)/2.0, self.stopIcon.size.width, self.stopIcon.size.height) stopIcon:self.stopIcon goIcon:self.goIcon delegate:self]; + self.bottomTarget.animationLayer.config = [self bottomTouchTargetAnimation]; + [self.bottomObjectView addSubview:self.bottomTarget]; +} + +#pragma mark - Animations + +-(NSDictionary*)topTouchTargetAnimation { + NSMutableDictionary* animationConfig = [NSMutableDictionary dictionaryWithCapacity:4]; + + if ( nil != self.stopIcon ) { + [animationConfig setObject:@{@"stillImageObj":self.stopIcon} forKey:@"meta"]; + [animationConfig setObject:@{@"deltaX":[NSNumber numberWithFloat:0.0]} forKey:[NSNumber numberWithFloat:0.0]]; + [animationConfig setObject:@{@"deltaX":[NSNumber numberWithFloat:(self.topObjectView.bounds.size.width - self.stopIcon.size.width)]} forKey:[NSNumber numberWithFloat:5.0]]; + [animationConfig setObject:@{@"deltaX":[NSNumber numberWithFloat:0.0],@"lastFrameDuration":[NSNumber numberWithFloat:0.0]} forKey:[NSNumber numberWithFloat:10.0]]; + } + return animationConfig; +} + +-(NSDictionary*)bottomTouchTargetAnimation { + NSMutableDictionary* animationConfig = [NSMutableDictionary dictionaryWithCapacity:4]; + + if ( nil != self.stopIcon ) { + [animationConfig setObject:@{@"stillImageObj":self.stopIcon} forKey:@"meta"]; + [animationConfig setObject:@{@"deltaX":[NSNumber numberWithFloat:0.0]} forKey:[NSNumber numberWithFloat:0.0]]; + [animationConfig setObject:@{@"deltaX":[NSNumber numberWithFloat:-(self.topObjectView.bounds.size.width - self.stopIcon.size.width)]} forKey:[NSNumber numberWithFloat:5.0]]; + [animationConfig setObject:@{@"deltaX":[NSNumber numberWithFloat:0.0],@"lastFrameDuration":[NSNumber numberWithFloat:0.0]} forKey:[NSNumber numberWithFloat:10.0]]; + } + return animationConfig; +} + +#pragma mark - MKParentalGateTouchTargetDelegate + +-(void)handleTargetTouchDown:(MKParentalGateTouchTargetView*)inTargetView { + if ( inTargetView == self.topTarget ) { + [self.topTarget pauseAnimation]; + self.topObjectView.backgroundColor = [UIColor greenColor]; + } + else if ( inTargetView == self.bottomTarget ) { + [self.bottomTarget pauseAnimation]; + self.bottomObjectView.backgroundColor = [UIColor greenColor]; + } + +} +-(void)handleTargetTouchUp:(MKParentalGateTouchTargetView*)inTargetView { + if ( inTargetView == self.topTarget ) { + [self.topTarget resumeAnimation]; + self.topObjectView.backgroundColor = [UIColor whiteColor]; + } + else if ( inTargetView == self.bottomTarget ) { + [self.bottomTarget resumeAnimation]; + self.bottomObjectView.backgroundColor = [UIColor whiteColor]; + } +} + +@end diff --git a/Other/MKParentalGate/MKParentalGateViewController.xib b/Other/MKParentalGate/MKParentalGateViewController.xib new file mode 100644 index 0000000..e09bcda --- /dev/null +++ b/Other/MKParentalGate/MKParentalGateViewController.xib @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Other/MKParentalGate/icons/stop.png b/Other/MKParentalGate/icons/stop.png new file mode 100644 index 0000000000000000000000000000000000000000..bc384d8894ee3298917ebf316302f65df6bdb5b5 GIT binary patch literal 8957 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

IFbqcnr6E+O(M`fBW0N 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 X2xYlY<(*Sj00000NkvXXu0mjf$qO#8 literal 0 HcmV?d00001 diff --git a/Other/MKParentalGate/icons/stop@2x.png b/Other/MKParentalGate/icons/stop@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..63ddaf3b012e3ee906ffed17ac36c7e120e48a89 GIT binary patch literal 13200 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 CTpPsz literal 0 HcmV?d00001 diff --git a/Sample App/iPhoneMK Sample App.xcodeproj/project.pbxproj b/Sample App/iPhoneMK Sample App.xcodeproj/project.pbxproj index a51dab5..32f4ca1 100644 --- a/Sample App/iPhoneMK Sample App.xcodeproj/project.pbxproj +++ b/Sample App/iPhoneMK Sample App.xcodeproj/project.pbxproj @@ -31,6 +31,13 @@ 4C1DF62714F61C7500AE7949 /* TableViewCellsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1DF62614F61C7400AE7949 /* TableViewCellsViewController.m */; }; 4C1DF62A14F624A500AE7949 /* third.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C1DF62814F624A500AE7949 /* third.png */; }; 4C1DF62B14F624A500AE7949 /* third@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C1DF62914F624A500AE7949 /* third@2x.png */; }; + 4C3FC4A51812EB7100A60DF4 /* MKParentalGateViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C3FC4A31812EB7100A60DF4 /* MKParentalGateViewController.m */; }; + 4C3FC4A61812EB7100A60DF4 /* MKParentalGateViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C3FC4A41812EB7100A60DF4 /* MKParentalGateViewController.xib */; }; + 4C3FC4A91813B4C200A60DF4 /* MKParentalGateTouchTargetView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C3FC4A81813B4C200A60DF4 /* MKParentalGateTouchTargetView.m */; }; + 4C3FC4AD1813B9C500A60DF4 /* stop.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C3FC4AB1813B9C500A60DF4 /* stop.png */; }; + 4C3FC4AE1813B9C500A60DF4 /* stop@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C3FC4AC1813B9C500A60DF4 /* stop@2x.png */; }; + 4C3FC4B1181455CA00A60DF4 /* MKParentalGateTouchCancelView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C3FC4B0181455CA00A60DF4 /* MKParentalGateTouchCancelView.m */; }; + 4C5304091812E57700F67459 /* MKParentalGate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5304081812E57700F67459 /* MKParentalGate.m */; }; 4C5865A4176E27E4002AA16F /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C5865A3176E27E4002AA16F /* Default-568h@2x.png */; }; 4C8FD91B15CF2620005A36C9 /* facebook.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C8FD90D15CF2620005A36C9 /* facebook.png */; }; 4C8FD91C15CF2620005A36C9 /* facebook@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C8FD90E15CF2620005A36C9 /* facebook@2x.png */; }; @@ -104,6 +111,17 @@ 4C1DF62614F61C7400AE7949 /* TableViewCellsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TableViewCellsViewController.m; sourceTree = ""; }; 4C1DF62814F624A500AE7949 /* third.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = third.png; sourceTree = ""; }; 4C1DF62914F624A500AE7949 /* third@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "third@2x.png"; sourceTree = ""; }; + 4C3FC4A21812EB7100A60DF4 /* MKParentalGateViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MKParentalGateViewController.h; sourceTree = ""; }; + 4C3FC4A31812EB7100A60DF4 /* MKParentalGateViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MKParentalGateViewController.m; sourceTree = ""; }; + 4C3FC4A41812EB7100A60DF4 /* MKParentalGateViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MKParentalGateViewController.xib; sourceTree = ""; }; + 4C3FC4A71813B4C200A60DF4 /* MKParentalGateTouchTargetView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MKParentalGateTouchTargetView.h; sourceTree = ""; }; + 4C3FC4A81813B4C200A60DF4 /* MKParentalGateTouchTargetView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MKParentalGateTouchTargetView.m; sourceTree = ""; }; + 4C3FC4AB1813B9C500A60DF4 /* stop.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = stop.png; sourceTree = ""; }; + 4C3FC4AC1813B9C500A60DF4 /* stop@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "stop@2x.png"; sourceTree = ""; }; + 4C3FC4AF181455CA00A60DF4 /* MKParentalGateTouchCancelView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MKParentalGateTouchCancelView.h; sourceTree = ""; }; + 4C3FC4B0181455CA00A60DF4 /* MKParentalGateTouchCancelView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MKParentalGateTouchCancelView.m; sourceTree = ""; }; + 4C5304071812E57700F67459 /* MKParentalGate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MKParentalGate.h; sourceTree = ""; }; + 4C5304081812E57700F67459 /* MKParentalGate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MKParentalGate.m; sourceTree = ""; }; 4C5865A3176E27E4002AA16F /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-568h@2x.png"; path = "../Default-568h@2x.png"; sourceTree = ""; }; 4C8FD90D15CF2620005A36C9 /* facebook.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = facebook.png; sourceTree = ""; }; 4C8FD90E15CF2620005A36C9 /* facebook@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "facebook@2x.png"; sourceTree = ""; }; @@ -240,6 +258,7 @@ 4C98654915311A28006F05EB /* fourth@2x.png */, 4C1DF60B14F60C0A00AE7949 /* TableViewCells */, 4C1DF60F14F60C0A00AE7949 /* Views */, + 4C5304021812E44300F67459 /* Other */, 4C1DF5E314F60B6E00AE7949 /* Supporting Files */, ); path = "iPhoneMK Sample App"; @@ -318,6 +337,41 @@ path = MKSoundCoordinatedAnimationView; sourceTree = ""; }; + 4C3FC4AA1813B9C500A60DF4 /* icons */ = { + isa = PBXGroup; + children = ( + 4C3FC4AB1813B9C500A60DF4 /* stop.png */, + 4C3FC4AC1813B9C500A60DF4 /* stop@2x.png */, + ); + path = icons; + sourceTree = ""; + }; + 4C5304021812E44300F67459 /* Other */ = { + isa = PBXGroup; + children = ( + 4C5304061812E55B00F67459 /* MKParentalGate */, + ); + name = Other; + path = ../../Other; + sourceTree = ""; + }; + 4C5304061812E55B00F67459 /* MKParentalGate */ = { + isa = PBXGroup; + children = ( + 4C3FC4AA1813B9C500A60DF4 /* icons */, + 4C5304071812E57700F67459 /* MKParentalGate.h */, + 4C5304081812E57700F67459 /* MKParentalGate.m */, + 4C3FC4A21812EB7100A60DF4 /* MKParentalGateViewController.h */, + 4C3FC4A31812EB7100A60DF4 /* MKParentalGateViewController.m */, + 4C3FC4A41812EB7100A60DF4 /* MKParentalGateViewController.xib */, + 4C3FC4A71813B4C200A60DF4 /* MKParentalGateTouchTargetView.h */, + 4C3FC4A81813B4C200A60DF4 /* MKParentalGateTouchTargetView.m */, + 4C3FC4AF181455CA00A60DF4 /* MKParentalGateTouchCancelView.h */, + 4C3FC4B0181455CA00A60DF4 /* MKParentalGateTouchCancelView.m */, + ); + path = MKParentalGate; + sourceTree = ""; + }; 4C8FD90A15CF2620005A36C9 /* icons */ = { isa = PBXGroup; children = ( @@ -423,6 +477,7 @@ 4C1DF62B14F624A500AE7949 /* third@2x.png in Resources */, 4CBC702D150CA25100AE63B5 /* checkmarkicon_empty.png in Resources */, 4CBC702E150CA25100AE63B5 /* checkmarkicon_empty@2x.png in Resources */, + 4C3FC4A61812EB7100A60DF4 /* MKParentalGateViewController.xib in Resources */, 4CBC7031150CA25100AE63B5 /* checkmarkicon_on.png in Resources */, 4CBC7032150CA25100AE63B5 /* checkmarkicon_on@2x.png in Resources */, 4C98654A15311A28006F05EB /* fourth.png in Resources */, @@ -432,9 +487,11 @@ 4C98655A15311F45006F05EB /* animating_shape@2x.png in Resources */, 4C98655C15311F74006F05EB /* AnimationConfig.plist in Resources */, 4C98656515312109006F05EB /* animating_shape_01.png in Resources */, + 4C3FC4AE1813B9C500A60DF4 /* stop@2x.png in Resources */, 4C98656615312109006F05EB /* animating_shape_01@2x.png in Resources */, 4C98656715312109006F05EB /* animating_shape_02.png in Resources */, 4C98656815312109006F05EB /* animating_shape_02@2x.png in Resources */, + 4C3FC4AD1813B9C500A60DF4 /* stop.png in Resources */, 4C98656915312109006F05EB /* animating_shape_03.png in Resources */, 4C98656A15312109006F05EB /* animating_shape_03@2x.png in Resources */, 4C5865A4176E27E4002AA16F /* Default-568h@2x.png in Resources */, @@ -456,7 +513,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4C3FC4A51812EB7100A60DF4 /* MKParentalGateViewController.m in Sources */, + 4C3FC4B1181455CA00A60DF4 /* MKParentalGateTouchCancelView.m in Sources */, 4C1DF5E914F60B6E00AE7949 /* main.m in Sources */, + 4C5304091812E57700F67459 /* MKParentalGate.m in Sources */, 4C9C91FD17F7B1B00051E0BF /* MKTouchTrackingView.m in Sources */, 4C9C920017F7B33C0051E0BF /* MKTouchTrackingAnimationView.m in Sources */, 4C1DF5ED14F60B6E00AE7949 /* AppDelegate.m in Sources */, @@ -473,6 +533,7 @@ 4C98655515311AE0006F05EB /* AnimationLayerViewController.m in Sources */, 4C98656F15312261006F05EB /* AnimationConfigModel.m in Sources */, 4CAE1D4615A9E0F7007A9C07 /* MKSocialShareTableViewCell.m in Sources */, + 4C3FC4A91813B4C200A60DF4 /* MKParentalGateTouchTargetView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -559,7 +620,7 @@ GCC_THUMB_SUPPORT = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; INFOPLIST_FILE = "iPhoneMK Sample App/iPhoneMK Sample App-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 3.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -574,7 +635,7 @@ GCC_THUMB_SUPPORT = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; INFOPLIST_FILE = "iPhoneMK Sample App/iPhoneMK Sample App-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 3.1; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; diff --git a/Sample App/iPhoneMK Sample App/ParentalGateSuccessViewController.h b/Sample App/iPhoneMK Sample App/ParentalGateSuccessViewController.h new file mode 100644 index 0000000..88e45b2 --- /dev/null +++ b/Sample App/iPhoneMK Sample App/ParentalGateSuccessViewController.h @@ -0,0 +1,13 @@ +// +// ParentalGateSuccessViewController.h +// iPhoneMK Sample App +// +// Created by Michael Kamprath on 10/20/13. +// +// + +#import + +@interface ParentalGateSuccessViewController : UIViewController + +@end diff --git a/Sample App/iPhoneMK Sample App/ParentalGateSuccessViewController.m b/Sample App/iPhoneMK Sample App/ParentalGateSuccessViewController.m new file mode 100644 index 0000000..0ef828c --- /dev/null +++ b/Sample App/iPhoneMK Sample App/ParentalGateSuccessViewController.m @@ -0,0 +1,38 @@ +// +// ParentalGateSuccessViewController.m +// iPhoneMK Sample App +// +// Created by Michael Kamprath on 10/20/13. +// +// + +#import "ParentalGateSuccessViewController.h" + +@interface ParentalGateSuccessViewController () + +@end + +@implementation ParentalGateSuccessViewController + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization + } + return self; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + // Do any additional setup after loading the view from its nib. +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +@end diff --git a/Sample App/iPhoneMK Sample App/ParentalGateSuccessViewController.xib b/Sample App/iPhoneMK Sample App/ParentalGateSuccessViewController.xib new file mode 100644 index 0000000..a2d8ee0 --- /dev/null +++ b/Sample App/iPhoneMK Sample App/ParentalGateSuccessViewController.xib @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Sample App/iPhoneMK Sample App/TableViewCellsViewController.m b/Sample App/iPhoneMK Sample App/TableViewCellsViewController.m index 6e641bc..9bba0a2 100644 --- a/Sample App/iPhoneMK Sample App/TableViewCellsViewController.m +++ b/Sample App/iPhoneMK Sample App/TableViewCellsViewController.m @@ -10,10 +10,12 @@ #import "MKSwitchControlTableViewCell.h" #import "MKIconCheckmarkTableViewCell.h" #import "MKSocialShareTableViewCell.h" +#import "MKParentalGate.h" #define SECTIONID_MKSwitchControlTableViewCell 0 #define SECTIONID_MKIconCheckmarkTableViewCell 1 -#define SECTIONID_MKSocialShareTableViewCell 2 +#define SECTIONID_MKSocialShareTableViewCell 3 +#define SECTIONID_MKParentalGate 2 @interface TableViewCellsViewController () @@ -95,10 +97,10 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { if ( [MKSocialShareTableViewCell socialShareAvailable] ) { - return 3; + return 4; } else { - return 2; + return 3; } } @@ -113,6 +115,10 @@ - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInte break; case SECTIONID_MKSocialShareTableViewCell: return @"MKSocialShareTableViewCell"; + break; + case SECTIONID_MKParentalGate: + return @"MKParentalGate"; + break; default: return nil; break; @@ -137,6 +143,9 @@ - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger return 0; } break; + case SECTIONID_MKParentalGate: + return 1; + break; default: return 0; break; @@ -204,6 +213,20 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N return cell; } + else if ( sectionID == SECTIONID_MKParentalGate ) { + static NSString* ParentGateCellIdentifier = @"ParentalGate"; + + UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:ParentGateCellIdentifier]; + + if ( nil == cell ) { + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ParentGateCellIdentifier]; + } + + cell.textLabel.text = @"Parental Gate"; + cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; + + return cell; + } else { return nil; } @@ -215,7 +238,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - if ( [indexPath indexAtPosition:0] == 1 ) { + if ( [indexPath indexAtPosition:0] == SECTIONID_MKIconCheckmarkTableViewCell ) { [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO]; MKIconCheckmarkTableViewCell* cell = (MKIconCheckmarkTableViewCell*)[tableView cellForRowAtIndexPath:indexPath]; @@ -225,6 +248,9 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath [cell setNeedsDisplay]; } + else if ( [indexPath indexAtPosition:0] == SECTIONID_MKParentalGate ) { + [MKParentalGate displayGateWithCurrentViewController:self successBlock:NULL failureBlock:NULL]; + } } diff --git a/Views/MKTouchTrackingView/MKTouchTrackingView.h b/Views/MKTouchTrackingView/MKTouchTrackingView.h index a62437f..f572081 100644 --- a/Views/MKTouchTrackingView/MKTouchTrackingView.h +++ b/Views/MKTouchTrackingView/MKTouchTrackingView.h @@ -27,6 +27,7 @@ -(void)touchTrackedOutOfView; -(void)touchUpInView; +-(void)cancelTouchTracking; -(BOOL)isPtInViewCoreArea:(CGPoint)inPt; -(BOOL)isPtInViewTrackingArea:(CGPoint)inPt; diff --git a/Views/MKTouchTrackingView/MKTouchTrackingView.m b/Views/MKTouchTrackingView/MKTouchTrackingView.m index a620b96..cb9d548 100644 --- a/Views/MKTouchTrackingView/MKTouchTrackingView.m +++ b/Views/MKTouchTrackingView/MKTouchTrackingView.m @@ -31,13 +31,17 @@ #import "MKTouchTrackingView.h" @interface MKTouchTrackingView () { - BOOL _curTouchInTrackingRect; BOOL _simulatedTouchUp; + BOOL _isTrackingTouch; NSTimer* _simulatedTouchUpTimer; } +@property (assign,nonatomic) BOOL curTouchInTrackingRect; +-(void)startTouchTimer; -(void)invalidateTouchTimer; +-(BOOL)isTouchInCoreArea:(UITouch*)inTouch; +-(BOOL)isTouchInTrackingArea:(UITouch*)inTouch; @end @implementation MKTouchTrackingView @@ -47,13 +51,24 @@ - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { - // Initialization code. - - self.delayForSimulatedTouchUp = 0; + [self initObject]; + } + return self; +} + +-(id)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + [self initObject]; } + return self; } +-(void)initObject { + self.delayForSimulatedTouchUp = 0; + _isTrackingTouch = NO; +} -(void)invalidateTouchTimer { if (_simulatedTouchUpTimer != nil ) { @@ -78,6 +93,7 @@ - (void)simulateTouchUp:(NSTimer*)theTimer { _simulatedTouchUp = YES; [self touchUpInView]; _simulatedTouchUpTimer = nil; + _isTrackingTouch = NO; } #pragma mark -- Touch Handling -- @@ -90,15 +106,24 @@ - (BOOL)pointInside:(CGPoint)localPoint withEvent:(UIEvent *)event { } +-(BOOL)isTouchInCoreArea:(UITouch*)inTouch { + return (inTouch.view == self && [self isPtInViewCoreArea:[inTouch locationInView:self]]); +} + +-(BOOL)isTouchInTrackingArea:(UITouch*)inTouch { + return (inTouch.view == self && [self isPtInViewTrackingArea:[inTouch locationInView:self]]); +} + - (void)touchesBegan:(NSSet *)inTouches withEvent:(UIEvent *)inEvent { [self invalidateTouchTimer]; UITouch *touch = [inTouches anyObject]; - if ( touch.view == self && [self isPtInViewCoreArea:[touch locationInView:self]] ) + if ( [self isTouchInCoreArea:touch] ) { - _curTouchInTrackingRect = YES; + self.curTouchInTrackingRect = YES; + _isTrackingTouch = YES; [self touchInViewBegan]; @@ -113,12 +138,12 @@ - (void)touchesMoved:(NSSet *)inTouches withEvent:(UIEvent *)inEvent UITouch *touch = [inTouches anyObject]; - if ( touch.view == self && !_simulatedTouchUp ) { + if ( _isTrackingTouch && touch.view == self && !_simulatedTouchUp ) { - BOOL touchInRect = [self isPtInViewTrackingArea:[touch locationInView:self]]; + BOOL touchInRect = [self isTouchInTrackingArea:touch]; - if ( touchInRect != _curTouchInTrackingRect ) { + if ( touchInRect != self.curTouchInTrackingRect ) { if ( touchInRect ) { [self touchTrackedIntoView]; [self startTouchTimer]; @@ -130,7 +155,7 @@ - (void)touchesMoved:(NSSet *)inTouches withEvent:(UIEvent *)inEvent } [self setNeedsDisplay]; - _curTouchInTrackingRect = touchInRect; + self.curTouchInTrackingRect = touchInRect; } } @@ -141,19 +166,27 @@ - (void)touchesEnded:(NSSet *)inTouches withEvent:(UIEvent *)inEvent UITouch *touch = [inTouches anyObject]; - if ( touch.view == self && !_simulatedTouchUp ) { + if ( _isTrackingTouch && touch.view == self && !_simulatedTouchUp ) { [self invalidateTouchTimer]; - if ([self isPtInViewTrackingArea:[touch locationInView:self]]) { + if ([self isTouchInTrackingArea:touch]) { [self touchUpInView]; } else { [self touchTrackedOutOfView]; } - _curTouchInTrackingRect = NO; + self.curTouchInTrackingRect = NO; } _simulatedTouchUp = NO; + _isTrackingTouch = NO; +} + +-(void)cancelTouchTracking { + [self invalidateTouchTimer]; + self.curTouchInTrackingRect = NO; + _simulatedTouchUp = NO; + _isTrackingTouch = NO; } -(void)touchInViewBegan {