Fixed UI issies and updated to universal storyboards

This commit is contained in:
Joe Blau 2015-03-13 22:30:50 -07:00
parent 2306412316
commit 393debeb77
15 changed files with 353 additions and 256 deletions

View File

@ -1,65 +1,55 @@
Language: Cpp ---
Language: Cpp
# BasedOnStyle: WebKit
AccessModifierOffset: -4 AccessModifierOffset: -4
ConstructorInitializerIndentWidth: 4
AlignEscapedNewlinesLeft: false AlignEscapedNewlinesLeft: false
AlignTrailingComments: false AlignTrailingComments: false
PointerAlignment: Left
AllowAllParametersOfDeclarationOnNextLine: true AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: true AllowShortBlocksOnASingleLine: false
AllowShortIfStatementsOnASingleLine: true AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: true AllowShortLoopsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All AllowShortFunctionsOnASingleLine: All
AlwaysBreakTemplateDeclarations: false AlwaysBreakTemplateDeclarations: false
AlwaysBreakBeforeMultilineStrings: false AlwaysBreakBeforeMultilineStrings: false
# Only available on clang-format 3.6 BreakBeforeBinaryOperators: true
# AlwaysBreakAfterDefinitionReturnType: true
BreakBeforeBinaryOperators: false
BreakBeforeTernaryOperators: true BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: true BreakConstructorInitializersBeforeComma: true
BreakBeforeBraces: Attach
BinPackParameters: true BinPackParameters: true
ColumnLimit: 0 ColumnLimit: 0
ConstructorInitializerAllOnOneLineOrOnePerLine: false ConstructorInitializerAllOnOneLineOrOnePerLine: false
DerivePointerAlignment: false DerivePointerBinding: false
ExperimentalAutoDetectBinPacking: false ExperimentalAutoDetectBinPacking: false
IndentCaseLabels: true IndentCaseLabels: true
IndentWrappedFunctionNames: false
IndentFunctionDeclarationAfterType: false
MaxEmptyLinesToKeep: 1 MaxEmptyLinesToKeep: 1
KeepEmptyLinesAtTheStartOfBlocks: true KeepEmptyLinesAtTheStartOfBlocks: true
NamespaceIndentation: Inner
ObjCSpaceAfterProperty: true ObjCSpaceAfterProperty: true
ObjCSpaceBeforeProtocolList: true ObjCSpaceBeforeProtocolList: true
PenaltyBreakBeforeFirstCallParameter: 19 PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300 PenaltyBreakComment: 300
PenaltyBreakString: 1000 PenaltyBreakString: 1000
PenaltyBreakFirstLessLess: 120 PenaltyBreakFirstLessLess: 120
PenaltyExcessCharacter: 1000000 PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60 PenaltyReturnTypeOnItsOwnLine: 60
PointerBindsToType: false
SpacesBeforeTrailingComments: 1
Cpp11BracedListStyle: false Cpp11BracedListStyle: false
Standard: Cpp03 Standard: Cpp03
IndentWidth: 4
TabWidth: 8 TabWidth: 8
UseTab: Never UseTab: Never
NamespaceIndentation: Inner BreakBeforeBraces: Attach
IndentWidth: 4 IndentFunctionDeclarationAfterType: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
SpacesInParentheses: false SpacesInParentheses: false
SpacesInAngles: false SpacesInAngles: false
SpaceInEmptyParentheses: false SpaceInEmptyParentheses: false
SpacesInCStyleCastParentheses: false SpacesInCStyleCastParentheses: false
SpacesInContainerLiterals: true SpacesInContainerLiterals: true
SpaceBeforeAssignmentOperators: true SpaceBeforeAssignmentOperators: true
SpacesBeforeTrailingComments: 1 ContinuationIndentWidth: 4
CommentPragmas: '^ IWYU pragma:'
ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
SpaceBeforeParens: ControlStatements SpaceBeforeParens: ControlStatements
DisableFormat: false
CommentPragmas: '^ IWYU pragma:'
ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
DisableFormat: false
... ...

View File

@ -1,6 +1,6 @@
Pod::Spec.new do |s| Pod::Spec.new do |s|
s.name = "COSTouchVisualizer" s.name = "COSTouchVisualizer"
s.version = "1.0.5" s.version = "1.0.6"
s.summary = "Visualize iOS finger touches, gestures and holds on external displays" s.summary = "Visualize iOS finger touches, gestures and holds on external displays"
s.description = <<-DESC s.description = <<-DESC
Touch Screen Visualizer visualizes your touches, gestures, and holds on Touch Screen Visualizer visualizes your touches, gestures, and holds on

View File

@ -15,18 +15,18 @@
@property (nonatomic, weak) id<COSTouchVisualizerWindowDelegate> touchVisualizerWindowDelegate; @property (nonatomic, weak) id<COSTouchVisualizerWindowDelegate> touchVisualizerWindowDelegate;
// Touch effects // Touch effects
@property (nonatomic) UIImage* touchImage; @property (nonatomic) UIImage *touchImage;
@property (nonatomic) CGFloat touchAlpha; @property (nonatomic) CGFloat touchAlpha;
@property (nonatomic) NSTimeInterval fadeDuration; @property (nonatomic) NSTimeInterval fadeDuration;
@property (nonatomic) UIColor* strokeColor; @property (nonatomic) UIColor *strokeColor;
@property (nonatomic) UIColor* fillColor; @property (nonatomic) UIColor *fillColor;
// Ripple Effects // Ripple Effects
@property (nonatomic) UIImage* rippleImage; @property (nonatomic) UIImage *rippleImage;
@property (nonatomic) CGFloat rippleAlpha; @property (nonatomic) CGFloat rippleAlpha;
@property (nonatomic) NSTimeInterval rippleFadeDuration; @property (nonatomic) NSTimeInterval rippleFadeDuration;
@property (nonatomic) UIColor* rippleStrokeColor; @property (nonatomic) UIColor *rippleStrokeColor;
@property (nonatomic) UIColor* rippleFillColor; @property (nonatomic) UIColor *rippleFillColor;
@property (nonatomic) BOOL stationaryMorphEnabled; // default: YES @property (nonatomic) BOOL stationaryMorphEnabled; // default: YES
@ -36,7 +36,7 @@
@optional @optional
- (BOOL)touchVisualizerWindowShouldShowFingertip:(COSTouchVisualizerWindow*)window; - (BOOL)touchVisualizerWindowShouldShowFingertip:(COSTouchVisualizerWindow *)window;
- (BOOL)touchVisualizerWindowShouldAlwaysShowFingertip:(COSTouchVisualizerWindow*)window; - (BOOL)touchVisualizerWindowShouldAlwaysShowFingertip:(COSTouchVisualizerWindow *)window;
@end @end

View File

@ -8,6 +8,31 @@
#import "COSTouchVisualizerWindow.h" #import "COSTouchVisualizerWindow.h"
#pragma mark - Touch Visualizer Window
@interface TouchVisualizerWindow : UIWindow
@end
@implementation TouchVisualizerWindow
// UIKit tries to get the rootViewController from the overlay window.
// Instead, try to find the rootViewController on some other
// application window.
// Fixes problems with status bar hiding, because it considers the
// overlay window a candidate for controlling the status bar.
- (UIViewController *)rootViewController {
for (UIWindow *window in [[UIApplication sharedApplication] windows]) {
if (self == window)
continue;
UIViewController *realRootViewController = window.rootViewController;
if (realRootViewController != nil)
return realRootViewController;
}
return [super rootViewController];
}
@end
#pragma mark - Conopsys Touch Spot View #pragma mark - Conopsys Touch Spot View
@interface COSTouchSpotView : UIImageView @interface COSTouchSpotView : UIImageView
@ -21,40 +46,28 @@
@implementation COSTouchSpotView @implementation COSTouchSpotView
@end @end
#pragma mark - Conopsys Touch Overlay Window View Controller
@interface COSTouchOverlayWindowViewController : UIViewController
@end
@implementation COSTouchOverlayWindowViewController
- (UIStatusBarStyle)preferredStatusBarStyle {
return [UIApplication sharedApplication].keyWindow.rootViewController.preferredStatusBarStyle;
}
@end
#pragma mark - Conopsys Touch Visualizer Window #pragma mark - Conopsys Touch Visualizer Window
@interface COSTouchVisualizerWindow () @interface COSTouchVisualizerWindow ()
@property (nonatomic) UIWindow* overlayWindow; @property (nonatomic) UIWindow *overlayWindow;
@property (nonatomic) UIViewController* overlayWindowViewController; @property (nonatomic) UIViewController *overlayWindowViewController;
@property (nonatomic) BOOL fingerTipRemovalScheduled; @property (nonatomic) BOOL fingerTipRemovalScheduled;
@property (nonatomic) NSTimer* timer; @property (nonatomic) NSTimer *timer;
@property (nonatomic) NSSet *allTouches;
- (void)COSTouchVisualizerWindow_commonInit; - (void)COSTouchVisualizerWindow_commonInit;
- (void)scheduleFingerTipRemoval; - (void)scheduleFingerTipRemoval;
- (void)cancelScheduledFingerTipRemoval; - (void)cancelScheduledFingerTipRemoval;
- (void)removeInactiveFingerTips; - (void)removeInactiveFingerTips;
- (void)removeFingerTipWithHash:(NSUInteger)hash animated:(BOOL)animated; - (void)removeFingerTipWithHash:(NSUInteger)hash animated:(BOOL)animated;
- (BOOL)shouldAutomaticallyRemoveFingerTipForTouch:(UITouch*)touch; - (BOOL)shouldAutomaticallyRemoveFingerTipForTouch:(UITouch *)touch;
@end @end
@implementation COSTouchVisualizerWindow @implementation COSTouchVisualizerWindow
- (id)initWithCoder:(NSCoder*)decoder { - (id)initWithCoder:(NSCoder *)decoder {
// This covers NIB-loaded windows. // This covers NIB-loaded windows.
if (self = [super initWithCoder:decoder]) if (self = [super initWithCoder:decoder])
[self COSTouchVisualizerWindow_commonInit]; [self COSTouchVisualizerWindow_commonInit];
@ -80,15 +93,15 @@
self.stationaryMorphEnabled = YES; self.stationaryMorphEnabled = YES;
} }
#pragma mark - #pragma mark - Touch / Ripple and Images
- (UIImage*)touchImage { - (UIImage *)touchImage {
if (!_touchImage) { if (!_touchImage) {
UIBezierPath* clipPath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 50.0, 50.0)]; UIBezierPath *clipPath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 50.0, 50.0)];
UIGraphicsBeginImageContextWithOptions(clipPath.bounds.size, NO, 0); UIGraphicsBeginImageContextWithOptions(clipPath.bounds.size, NO, 0);
UIBezierPath* drawPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(25.0, 25.0) UIBezierPath *drawPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(25.0, 25.0)
radius:22.0 radius:22.0
startAngle:0 startAngle:0
endAngle:2 * M_PI endAngle:2 * M_PI
@ -110,13 +123,13 @@
return _touchImage; return _touchImage;
} }
- (UIImage*)rippleImage { - (UIImage *)rippleImage {
if (!_rippleImage) { if (!_rippleImage) {
UIBezierPath* clipPath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 50.0, 50.0)]; UIBezierPath *clipPath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 50.0, 50.0)];
UIGraphicsBeginImageContextWithOptions(clipPath.bounds.size, NO, 0); UIGraphicsBeginImageContextWithOptions(clipPath.bounds.size, NO, 0);
UIBezierPath* drawPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(25.0, 25.0) UIBezierPath *drawPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(25.0, 25.0)
radius:22.0 radius:22.0
startAngle:0 startAngle:0
endAngle:2 * M_PI endAngle:2 * M_PI
@ -138,13 +151,13 @@
return _rippleImage; return _rippleImage;
} }
#pragma mark Active #pragma mark - Active
- (BOOL)anyScreenIsMirrored { - (BOOL)anyScreenIsMirrored {
if (![UIScreen instancesRespondToSelector:@selector(mirroredScreen)]) if (![UIScreen instancesRespondToSelector:@selector(mirroredScreen)])
return NO; return NO;
for (UIScreen* screen in [UIScreen screens]) { for (UIScreen *screen in [UIScreen screens]) {
if ([screen mirroredScreen] != nil) { if ([screen mirroredScreen] != nil) {
return YES; return YES;
} }
@ -165,17 +178,17 @@
} }
} }
#pragma mark UIWindow overrides #pragma mark - UIWindow overrides
- (void)sendEvent:(UIEvent*)event { - (void)sendEvent:(UIEvent *)event {
if (self.active) { if (self.active) {
NSSet* allTouches = [event allTouches]; self.allTouches = [event allTouches];
for (UITouch* touch in [allTouches allObjects]) { for (UITouch *touch in [self.allTouches allObjects]) {
switch (touch.phase) { switch (touch.phase) {
case UITouchPhaseBegan: case UITouchPhaseBegan:
case UITouchPhaseMoved: { case UITouchPhaseMoved: {
// Generate ripples // Generate ripples
COSTouchSpotView* rippleView = [[COSTouchSpotView alloc] initWithImage:self.rippleImage]; COSTouchSpotView *rippleView = [[COSTouchSpotView alloc] initWithImage:self.rippleImage];
[self.overlayWindow addSubview:rippleView]; [self.overlayWindow addSubview:rippleView];
rippleView.alpha = self.rippleAlpha; rippleView.alpha = self.rippleAlpha;
@ -186,19 +199,16 @@
options:UIViewAnimationOptionCurveEaseIn // See other options:UIViewAnimationOptionCurveEaseIn // See other
// options // options
animations:^{ animations:^{
[rippleView setAlpha:0.0]; [rippleView setAlpha:0.0];
[rippleView setFrame:CGRectInset(rippleView.frame, 25, 25)]; [rippleView setFrame:CGRectInset(rippleView.frame, 25, 25)];
} } completion:^(BOOL finished) {
completion:^(BOOL finished) { [rippleView removeFromSuperview];
[rippleView removeFromSuperview];
}]; }];
} }
case UITouchPhaseStationary: { case UITouchPhaseStationary: {
COSTouchSpotView* touchView = (COSTouchSpotView*) COSTouchSpotView *touchView = (COSTouchSpotView *)[self.overlayWindow viewWithTag:touch.hash];
[self.overlayWindow viewWithTag:touch.hash];
if (touch.phase != UITouchPhaseStationary && touchView != nil && if (touch.phase != UITouchPhaseStationary && touchView != nil && [touchView isFadingOut]) {
[touchView isFadingOut]) {
[self.timer invalidate]; [self.timer invalidate];
[touchView removeFromSuperview]; [touchView removeFromSuperview];
touchView = nil; touchView = nil;
@ -235,32 +245,24 @@
} }
[super sendEvent:event]; [super sendEvent:event];
[self scheduleFingerTipRemoval]; // We may not see all UITouchPhaseEnded/UITouchPhaseCancelled events.
[self scheduleFingerTipRemoval]; // We may not see all
// UITouchPhaseEnded/UITouchPhaseCancelled
// events.
} }
#pragma mark - #pragma mark - Private
#pragma mark Private
- (UIWindow*)overlayWindow { - (UIWindow *)overlayWindow {
if (!_overlayWindow) { if (!_overlayWindow) {
_overlayWindow = [[UIWindow alloc] initWithFrame:self.frame]; _overlayWindow = [[TouchVisualizerWindow alloc] initWithFrame:self.frame];
_overlayWindow.userInteractionEnabled = NO; _overlayWindow.userInteractionEnabled = NO;
_overlayWindow.windowLevel = UIWindowLevelStatusBar; _overlayWindow.windowLevel = UIWindowLevelStatusBar;
_overlayWindow.backgroundColor = [UIColor clearColor]; _overlayWindow.backgroundColor = [UIColor clearColor];
_overlayWindow.hidden = NO; _overlayWindow.hidden = NO;
_overlayWindowViewController = [[COSTouchOverlayWindowViewController alloc] init];
[_overlayWindow setRootViewController:_overlayWindowViewController];
[_overlayWindowViewController setView:_overlayWindow];
} }
return _overlayWindow; return _overlayWindow;
} }
- (void)scheduleFingerTipRemoval { - (void)scheduleFingerTipRemoval {
if (self.fingerTipRemovalScheduled) if (self.fingerTipRemovalScheduled)
return; return;
self.fingerTipRemovalScheduled = YES; self.fingerTipRemovalScheduled = YES;
@ -281,22 +283,25 @@
NSTimeInterval now = [[NSProcessInfo processInfo] systemUptime]; NSTimeInterval now = [[NSProcessInfo processInfo] systemUptime];
const CGFloat REMOVAL_DELAY = 0.2; const CGFloat REMOVAL_DELAY = 0.2;
for (COSTouchSpotView *touchView in [self.overlayWindow subviews]) {
for (COSTouchSpotView* touchView in [self.overlayWindow subviews]) { if (![touchView isKindOfClass:[COSTouchSpotView class]])
if (![touchView isKindOfClass:[COSTouchSpotView class]]) continue; continue;
if (touchView.shouldAutomaticallyRemoveAfterTimeout && now > touchView.timestamp + REMOVAL_DELAY) if (touchView.shouldAutomaticallyRemoveAfterTimeout && now > touchView.timestamp + REMOVAL_DELAY)
[self removeFingerTipWithHash:touchView.tag animated:YES]; [self removeFingerTipWithHash:touchView.tag animated:YES];
} }
if ([[self.overlayWindow subviews] count]) [self scheduleFingerTipRemoval]; if ([[self.overlayWindow subviews] count])
[self scheduleFingerTipRemoval];
} }
- (void)removeFingerTipWithHash:(NSUInteger)hash animated:(BOOL)animated { - (void)removeFingerTipWithHash:(NSUInteger)hash animated:(BOOL)animated {
COSTouchSpotView* touchView = (COSTouchSpotView*)[self.overlayWindow viewWithTag:hash]; COSTouchSpotView *touchView = (COSTouchSpotView *)[self.overlayWindow viewWithTag:hash];
if (touchView == nil) return; if (touchView == nil)
return;
if ([touchView isFadingOut]) return; if ([touchView isFadingOut])
return;
BOOL animationsWereEnabled = [UIView areAnimationsEnabled]; BOOL animationsWereEnabled = [UIView areAnimationsEnabled];
@ -323,7 +328,7 @@
afterDelay:self.fadeDuration]; afterDelay:self.fadeDuration];
} }
- (BOOL)shouldAutomaticallyRemoveFingerTipForTouch:(UITouch*)touch; - (BOOL)shouldAutomaticallyRemoveFingerTipForTouch:(UITouch *)touch;
{ {
// We don't reliably get UITouchPhaseEnded or UITouchPhaseCancelled // We don't reliably get UITouchPhaseEnded or UITouchPhaseCancelled
// events via -sendEvent: for certain touch events. Known cases // events via -sendEvent: for certain touch events. Known cases
@ -337,18 +342,20 @@
// don't use UITouchPhaseStationary touches for those. *sigh*). So we // don't use UITouchPhaseStationary touches for those. *sigh*). So we
// end up with this more complicated setup. // end up with this more complicated setup.
UIView* view = [touch view]; UIView *view = [touch view];
view = [view hitTest:[touch locationInView:view] withEvent:nil]; view = [view hitTest:[touch locationInView:view] withEvent:nil];
while (view != nil) { while (view != nil) {
if ([view isKindOfClass:[UITableViewCell class]]) { if ([view isKindOfClass:[UITableViewCell class]]) {
for (UIGestureRecognizer* recognizer in [touch gestureRecognizers]) { for (UIGestureRecognizer *recognizer in [touch gestureRecognizers]) {
if ([recognizer isKindOfClass:[UISwipeGestureRecognizer class]]) return YES; if ([recognizer isKindOfClass:[UISwipeGestureRecognizer class]])
return YES;
} }
} }
if ([view isKindOfClass:[UITableView class]]) { if ([view isKindOfClass:[UITableView class]]) {
if ([[touch gestureRecognizers] count] == 0) return YES; if ([[touch gestureRecognizers] count] == 0)
return YES;
} }
view = view.superview; view = view.superview;
} }
@ -356,8 +363,8 @@
return NO; return NO;
} }
- (void)performMorph:(NSTimer*)theTimer { - (void)performMorph:(NSTimer *)theTimer {
UIView* view = (UIView*)[theTimer userInfo]; UIView *view = (UIView *)[theTimer userInfo];
NSTimeInterval duration = .4; NSTimeInterval duration = .4;
NSTimeInterval delay = 0; NSTimeInterval delay = 0;
// Start // Start
@ -395,11 +402,13 @@
view.transform = CGAffineTransformMakeScale(1, 1); view.transform = CGAffineTransformMakeScale(1, 1);
} }
completion:^(BOOL finished){ completion:^(BOOL finished){
// If there are no touches, remove this morping touch
if (self.allTouches.count == 0)
[view removeFromSuperview];
}]; }];
}]; }];
}]; }];
}]; }];
} }
@end @end

View File

@ -8,13 +8,14 @@
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
530F5A797A9D4A7BB1CB3265 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 49B1CBA208334F3CBDDFFFE4 /* libPods.a */; }; 530F5A797A9D4A7BB1CB3265 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 49B1CBA208334F3CBDDFFFE4 /* libPods.a */; };
E670B46A1AB3EBEF0043E508 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E670B4691AB3EBEF0043E508 /* Main.storyboard */; };
E670B46C1AB3EC8E0043E508 /* Launch Screen.xib in Resources */ = {isa = PBXBuildFile; fileRef = E670B46B1AB3EC8E0043E508 /* Launch Screen.xib */; };
E6F67FCD18DE12B4001C954A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E6F67FCC18DE12B4001C954A /* Foundation.framework */; }; E6F67FCD18DE12B4001C954A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E6F67FCC18DE12B4001C954A /* Foundation.framework */; };
E6F67FCF18DE12B4001C954A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E6F67FCE18DE12B4001C954A /* CoreGraphics.framework */; }; E6F67FCF18DE12B4001C954A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E6F67FCE18DE12B4001C954A /* CoreGraphics.framework */; };
E6F67FD118DE12B4001C954A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E6F67FD018DE12B4001C954A /* UIKit.framework */; }; E6F67FD118DE12B4001C954A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E6F67FD018DE12B4001C954A /* UIKit.framework */; };
E6F67FD718DE12B4001C954A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E6F67FD518DE12B4001C954A /* InfoPlist.strings */; }; E6F67FD718DE12B4001C954A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E6F67FD518DE12B4001C954A /* InfoPlist.strings */; };
E6F67FD918DE12B4001C954A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E6F67FD818DE12B4001C954A /* main.m */; }; E6F67FD918DE12B4001C954A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E6F67FD818DE12B4001C954A /* main.m */; };
E6F67FDD18DE12B4001C954A /* COSAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E6F67FDC18DE12B4001C954A /* COSAppDelegate.m */; }; E6F67FDD18DE12B4001C954A /* COSAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E6F67FDC18DE12B4001C954A /* COSAppDelegate.m */; };
E6F67FE018DE12B4001C954A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E6F67FDE18DE12B4001C954A /* Main.storyboard */; };
E6F67FE318DE12B4001C954A /* COSMasterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E6F67FE218DE12B4001C954A /* COSMasterViewController.m */; }; E6F67FE318DE12B4001C954A /* COSMasterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E6F67FE218DE12B4001C954A /* COSMasterViewController.m */; };
E6F67FE618DE12B4001C954A /* COSDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E6F67FE518DE12B4001C954A /* COSDetailViewController.m */; }; E6F67FE618DE12B4001C954A /* COSDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E6F67FE518DE12B4001C954A /* COSDetailViewController.m */; };
E6F67FE818DE12B4001C954A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E6F67FE718DE12B4001C954A /* Images.xcassets */; }; E6F67FE818DE12B4001C954A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E6F67FE718DE12B4001C954A /* Images.xcassets */; };
@ -38,6 +39,8 @@
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
49B1CBA208334F3CBDDFFFE4 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; 49B1CBA208334F3CBDDFFFE4 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };
4AF719864DF9411488359337 /* Pods.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.xcconfig; path = Pods/Pods.xcconfig; sourceTree = "<group>"; }; 4AF719864DF9411488359337 /* Pods.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.xcconfig; path = Pods/Pods.xcconfig; sourceTree = "<group>"; };
E670B4691AB3EBEF0043E508 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = "<group>"; };
E670B46B1AB3EC8E0043E508 /* Launch Screen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "Launch Screen.xib"; sourceTree = "<group>"; };
E6F67FC918DE12B4001C954A /* TouchVisualizer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TouchVisualizer.app; sourceTree = BUILT_PRODUCTS_DIR; }; E6F67FC918DE12B4001C954A /* TouchVisualizer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TouchVisualizer.app; sourceTree = BUILT_PRODUCTS_DIR; };
E6F67FCC18DE12B4001C954A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; E6F67FCC18DE12B4001C954A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
E6F67FCE18DE12B4001C954A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; E6F67FCE18DE12B4001C954A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
@ -48,7 +51,6 @@
E6F67FDA18DE12B4001C954A /* TouchVisualizer-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TouchVisualizer-Prefix.pch"; sourceTree = "<group>"; }; E6F67FDA18DE12B4001C954A /* TouchVisualizer-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TouchVisualizer-Prefix.pch"; sourceTree = "<group>"; };
E6F67FDB18DE12B4001C954A /* COSAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = COSAppDelegate.h; sourceTree = "<group>"; }; E6F67FDB18DE12B4001C954A /* COSAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = COSAppDelegate.h; sourceTree = "<group>"; };
E6F67FDC18DE12B4001C954A /* COSAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = COSAppDelegate.m; sourceTree = "<group>"; }; E6F67FDC18DE12B4001C954A /* COSAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = COSAppDelegate.m; sourceTree = "<group>"; };
E6F67FDF18DE12B4001C954A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
E6F67FE118DE12B4001C954A /* COSMasterViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = COSMasterViewController.h; sourceTree = "<group>"; }; E6F67FE118DE12B4001C954A /* COSMasterViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = COSMasterViewController.h; sourceTree = "<group>"; };
E6F67FE218DE12B4001C954A /* COSMasterViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = COSMasterViewController.m; sourceTree = "<group>"; }; E6F67FE218DE12B4001C954A /* COSMasterViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = COSMasterViewController.m; sourceTree = "<group>"; };
E6F67FE418DE12B4001C954A /* COSDetailViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = COSDetailViewController.h; sourceTree = "<group>"; }; E6F67FE418DE12B4001C954A /* COSDetailViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = COSDetailViewController.h; sourceTree = "<group>"; };
@ -127,12 +129,13 @@
children = ( children = (
E6F67FDB18DE12B4001C954A /* COSAppDelegate.h */, E6F67FDB18DE12B4001C954A /* COSAppDelegate.h */,
E6F67FDC18DE12B4001C954A /* COSAppDelegate.m */, E6F67FDC18DE12B4001C954A /* COSAppDelegate.m */,
E6F67FDE18DE12B4001C954A /* Main.storyboard */, E670B4691AB3EBEF0043E508 /* Main.storyboard */,
E6F67FE118DE12B4001C954A /* COSMasterViewController.h */, E6F67FE118DE12B4001C954A /* COSMasterViewController.h */,
E6F67FE218DE12B4001C954A /* COSMasterViewController.m */, E6F67FE218DE12B4001C954A /* COSMasterViewController.m */,
E6F67FE418DE12B4001C954A /* COSDetailViewController.h */, E6F67FE418DE12B4001C954A /* COSDetailViewController.h */,
E6F67FE518DE12B4001C954A /* COSDetailViewController.m */, E6F67FE518DE12B4001C954A /* COSDetailViewController.m */,
E6F67FE718DE12B4001C954A /* Images.xcassets */, E6F67FE718DE12B4001C954A /* Images.xcassets */,
E670B46B1AB3EC8E0043E508 /* Launch Screen.xib */,
E6F67FD318DE12B4001C954A /* Supporting Files */, E6F67FD318DE12B4001C954A /* Supporting Files */,
); );
path = TouchVisualizer; path = TouchVisualizer;
@ -247,8 +250,9 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
E6F67FE818DE12B4001C954A /* Images.xcassets in Resources */, E6F67FE818DE12B4001C954A /* Images.xcassets in Resources */,
E670B46C1AB3EC8E0043E508 /* Launch Screen.xib in Resources */,
E6F67FD718DE12B4001C954A /* InfoPlist.strings in Resources */, E6F67FD718DE12B4001C954A /* InfoPlist.strings in Resources */,
E6F67FE018DE12B4001C954A /* Main.storyboard in Resources */, E670B46A1AB3EBEF0043E508 /* Main.storyboard in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -334,14 +338,6 @@
name = InfoPlist.strings; name = InfoPlist.strings;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
E6F67FDE18DE12B4001C954A /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
E6F67FDF18DE12B4001C954A /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
E6F67FF718DE12B4001C954A /* InfoPlist.strings */ = { E6F67FF718DE12B4001C954A /* InfoPlist.strings */ = {
isa = PBXVariantGroup; isa = PBXVariantGroup;
children = ( children = (

View File

@ -1,107 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="5023" systemVersion="13A603" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="rS3-R9-Ivy">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3733"/>
</dependencies>
<scenes>
<!--Navigation Controller-->
<scene sceneID="cUi-kZ-frf">
<objects>
<navigationController id="rS3-R9-Ivy" sceneMemberID="viewController">
<navigationBar key="navigationBar" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="yXu-0R-QUA">
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<connections>
<segue destination="pGg-6v-bdr" kind="relationship" relationship="rootViewController" id="RxB-wf-QIq"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="eq9-QA-ai8" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-1" y="64"/>
</scene>
<!--class Prefix:identifier Master View Controller - Master-->
<scene sceneID="VgW-fR-Quf">
<objects>
<tableViewController title="Master" id="pGg-6v-bdr" customClass="COSMasterViewController" sceneMemberID="viewController">
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="mLL-gJ-YKr">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" accessoryType="disclosureIndicator" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="Cell" textLabel="2pz-XF-uhl" style="IBUITableViewCellStyleDefault" id="m0d-ak-lc9">
<rect key="frame" x="0.0" y="86" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="m0d-ak-lc9" id="d3P-M7-ByW">
<rect key="frame" x="0.0" y="0.0" width="287" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="2pz-XF-uhl">
<rect key="frame" x="15" y="0.0" width="270" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="20"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</label>
</subviews>
</tableViewCellContentView>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<connections>
<segue destination="Ah7-4n-0Wa" kind="push" identifier="showDetail" id="jUr-3t-vfg"/>
</connections>
</tableViewCell>
</prototypes>
<sections/>
<connections>
<outlet property="dataSource" destination="pGg-6v-bdr" id="P41-gY-KXY"/>
<outlet property="delegate" destination="pGg-6v-bdr" id="Y6K-Cp-Qkv"/>
</connections>
</tableView>
<navigationItem key="navigationItem" title="Master" id="tQt-TN-PWz"/>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="6Cn-md-YlS" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="459" y="64"/>
</scene>
<!--class Prefix:identifier Detail View Controller - Detail-->
<scene sceneID="Cn3-H9-jdl">
<objects>
<viewController title="Detail" id="Ah7-4n-0Wa" customClass="COSDetailViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="cIm-e0-J51"/>
<viewControllerLayoutGuide type="bottom" id="a0L-h9-sNL"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="MMQ-IT-qOo">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" text="Detail view content goes here" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="Lei-5M-9Gs">
<rect key="frame" x="20" y="276" width="280" height="17"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<fontDescription key="fontDescription" type="system" size="system"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="Lei-5M-9Gs" firstAttribute="leading" secondItem="MMQ-IT-qOo" secondAttribute="leading" constant="20" symbolic="YES" id="62x-JV-TTJ"/>
<constraint firstItem="Lei-5M-9Gs" firstAttribute="centerY" secondItem="MMQ-IT-qOo" secondAttribute="centerY" id="JzS-HC-Rnl"/>
<constraint firstAttribute="trailing" secondItem="Lei-5M-9Gs" secondAttribute="trailing" constant="20" symbolic="YES" id="pXB-RP-Zz6"/>
</constraints>
</view>
<navigationItem key="navigationItem" title="Detail" id="cra-N8-TIN"/>
<connections>
<outlet property="detailDescriptionLabel" destination="Lei-5M-9Gs" id="sCT-F7-F6f"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="lrm-kH-fPn" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="902" y="64"/>
</scene>
</scenes>
<simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/>
<simulatedScreenMetrics key="destination" type="retina4"/>
</simulatedMetricsContainer>
</document>

View File

@ -8,6 +8,6 @@
@interface COSAppDelegate : UIResponder <UIApplicationDelegate> @interface COSAppDelegate : UIResponder <UIApplicationDelegate>
@property (nonatomic) UIWindow* window; @property (nonatomic) UIWindow *window;
@end @end

View File

@ -14,28 +14,28 @@
@implementation COSAppDelegate @implementation COSAppDelegate
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch. // Override point for customization after application launch.
return YES; return YES;
} }
- (COSTouchVisualizerWindow*)window { - (COSTouchVisualizerWindow *)window {
static COSTouchVisualizerWindow* customWindow = nil; static COSTouchVisualizerWindow *customWindow = nil;
if (!customWindow) { if (!customWindow) {
customWindow = [[COSTouchVisualizerWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; customWindow = [[COSTouchVisualizerWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[customWindow setFillColor:[UIColor yellowColor]]; [customWindow setFillColor:[UIColor purpleColor]];
[customWindow setStrokeColor:[UIColor purpleColor]]; [customWindow setStrokeColor:[UIColor blueColor]];
[customWindow setTouchAlpha:0.4]; [customWindow setTouchAlpha:0.4];
[customWindow setRippleFillColor:[UIColor yellowColor]]; [customWindow setRippleFillColor:[UIColor purpleColor]];
[customWindow setRippleStrokeColor:[UIColor purpleColor]]; [customWindow setRippleStrokeColor:[UIColor blueColor]];
[customWindow setRippleAlpha:0.1]; [customWindow setRippleAlpha:0.1];
[customWindow setTouchVisualizerWindowDelegate:self]; [customWindow setTouchVisualizerWindowDelegate:self];
} }
return customWindow; return customWindow;
} }
- (BOOL)touchVisualizerWindowShouldAlwaysShowFingertip:(COSTouchVisualizerWindow*)window { - (BOOL)touchVisualizerWindowShouldAlwaysShowFingertip:(COSTouchVisualizerWindow *)window {
return YES; return YES;
} }

View File

@ -9,6 +9,7 @@
#import "COSDetailViewController.h" #import "COSDetailViewController.h"
@interface COSDetailViewController () @interface COSDetailViewController ()
@property (weak, nonatomic) IBOutlet UILabel *holding;
- (void)configureView; - (void)configureView;
@end @end
@ -23,11 +24,24 @@
} }
} }
- (IBAction)toggleStatusBar:(UIButton *)sender {
[[UIApplication sharedApplication] setStatusBarHidden:![UIApplication sharedApplication].statusBarHidden withAnimation:UIStatusBarAnimationSlide];
}
- (IBAction)startHoldAction:(UIButton *)sender {
self.holding.text = @"Pressed";
self.holding.textColor = [UIColor blackColor];
}
- (IBAction)releaseHoldAction:(UIButton *)sender {
self.holding.text = @"Not Pressed";
self.holding.textColor = [UIColor lightGrayColor];
}
- (void)configureView { - (void)configureView {
// Update the user interface for the detail item. // Update the user interface for the detail item.
if (self.detailItem) { if (self.detailItem)
self.detailDescriptionLabel.text = [self.detailItem description]; self.detailDescriptionLabel.text = [self.detailItem description];
}
} }
- (void)viewDidLoad { - (void)viewDidLoad {

View File

@ -10,7 +10,7 @@
#import "COSDetailViewController.h" #import "COSDetailViewController.h"
@interface COSMasterViewController () { @interface COSMasterViewController () {
NSMutableArray* _objects; NSMutableArray *_objects;
} }
@end @end
@ -21,7 +21,7 @@
// Do any additional setup after loading the view, typically from a nib. // Do any additional setup after loading the view, typically from a nib.
self.navigationItem.leftBarButtonItem = self.editButtonItem; self.navigationItem.leftBarButtonItem = self.editButtonItem;
UIBarButtonItem* addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)]; UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)];
self.navigationItem.rightBarButtonItem = addButton; self.navigationItem.rightBarButtonItem = addButton;
} }
@ -31,31 +31,32 @@
} }
- (void)insertNewObject:(id)sender { - (void)insertNewObject:(id)sender {
if (!_objects) _objects = [NSMutableArray new]; if (!_objects)
_objects = [NSMutableArray new];
[_objects insertObject:[NSDate date] atIndex:0]; [_objects insertObject:[NSDate date] atIndex:0];
NSIndexPath* indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView insertRowsAtIndexPaths:@[ indexPath ] withRowAnimation:UITableViewRowAnimationAutomatic]; [self.tableView insertRowsAtIndexPaths:@[ indexPath ] withRowAnimation:UITableViewRowAnimationAutomatic];
} }
#pragma mark - Table View #pragma mark - Table View
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section { - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return _objects.count; return _objects.count;
} }
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath { - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
NSDate* object = _objects[indexPath.row]; NSDate *object = _objects[indexPath.row];
cell.textLabel.text = [object description]; cell.textLabel.text = [object description];
return cell; return cell;
} }
- (BOOL)tableView:(UITableView*)tableView canEditRowAtIndexPath:(NSIndexPath*)indexPath { - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
return YES; return YES;
} }
- (void)tableView:(UITableView*)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath*)indexPath { - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) { if (editingStyle == UITableViewCellEditingStyleDelete) {
[_objects removeObjectAtIndex:indexPath.row]; [_objects removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:@[ indexPath ] withRowAnimation:UITableViewRowAnimationFade]; [tableView deleteRowsAtIndexPaths:@[ indexPath ] withRowAnimation:UITableViewRowAnimationFade];
@ -64,10 +65,10 @@
} }
} }
- (void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender { - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"showDetail"]) { if ([segue.identifier isEqualToString:@"showDetail"]) {
NSIndexPath* indexPath = [self.tableView indexPathForSelectedRow]; NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
NSDate* object = _objects[indexPath.row]; NSDate *object = _objects[indexPath.row];
[[segue destinationViewController] setDetailItem:object]; [[segue destinationViewController] setDetailItem:object];
} }
} }

View File

@ -14,6 +14,11 @@
"idiom" : "iphone", "idiom" : "iphone",
"size" : "60x60", "size" : "60x60",
"scale" : "2x" "scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
} }
], ],
"info" : { "info" : {

View File

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="6751" systemVersion="14C1510" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6736"/>
<capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="iN0-l3-epB">
<rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text=" Copyright (c) 2015 conopsys. All rights reserved." textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye">
<rect key="frame" x="20" y="439" width="441" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
<variation key="widthClass=compact">
<fontDescription key="fontDescription" type="system" pointSize="11"/>
</variation>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="TouchVisualizer" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
<rect key="frame" x="20" y="140" width="441" height="43"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="Kid-kn-2rF"/>
<constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk"/>
<constraint firstAttribute="bottom" secondItem="8ie-xW-0ye" secondAttribute="bottom" constant="20" id="Kzo-t9-V3l"/>
<constraint firstItem="8ie-xW-0ye" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="MfP-vx-nX0"/>
<constraint firstAttribute="centerX" secondItem="8ie-xW-0ye" secondAttribute="centerX" id="ZEH-qu-HZ9"/>
<constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g"/>
</constraints>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="404" y="445"/>
</view>
</objects>
</document>

View File

@ -0,0 +1,140 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6751" systemVersion="14C1510" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="Wpx-gg-SGr">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6736"/>
</dependencies>
<scenes>
<!--Navigation Controller-->
<scene sceneID="T2d-xJ-baS">
<objects>
<navigationController id="Wpx-gg-SGr" sceneMemberID="viewController">
<navigationBar key="navigationBar" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="ffC-Zf-B6t">
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<connections>
<segue destination="7NJ-en-M5G" kind="relationship" relationship="rootViewController" id="ppK-26-0eh"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="ut3-Ih-Hvq" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-1" y="64"/>
</scene>
<!--Master-->
<scene sceneID="86B-d4-lSn">
<objects>
<tableViewController title="Master" id="7NJ-en-M5G" customClass="COSMasterViewController" sceneMemberID="viewController">
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="KWu-jj-tZx">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" accessoryType="disclosureIndicator" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="Cell" textLabel="vZ5-VW-GJi" style="IBUITableViewCellStyleDefault" id="38Z-nc-7TB">
<rect key="frame" x="0.0" y="86" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="38Z-nc-7TB" id="D9R-Ko-H7Z">
<rect key="frame" x="0.0" y="0.0" width="287" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="vZ5-VW-GJi">
<rect key="frame" x="15" y="0.0" width="270" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="20"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</label>
</subviews>
</tableViewCellContentView>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<connections>
<segue destination="Gw0-zm-eCg" kind="push" identifier="showDetail" id="t9s-oE-8oV"/>
</connections>
</tableViewCell>
</prototypes>
<sections/>
<connections>
<outlet property="dataSource" destination="7NJ-en-M5G" id="Z3Y-tp-9Is"/>
<outlet property="delegate" destination="7NJ-en-M5G" id="KwG-Xz-wcT"/>
</connections>
</tableView>
<navigationItem key="navigationItem" title="Master" id="5IB-D0-oFC"/>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="13H-Mt-Pl9" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="781" y="64"/>
</scene>
<!--Detail-->
<scene sceneID="HBz-mL-S0U">
<objects>
<viewController title="Detail" id="Gw0-zm-eCg" customClass="COSDetailViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="IOe-fa-y74"/>
<viewControllerLayoutGuide type="bottom" id="clz-xl-zf5"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="5Bv-ow-0lT">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" text="Detail view content goes here" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="ClJ-ko-Drd">
<rect key="frame" x="20" y="292" width="560" height="17"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<fontDescription key="fontDescription" type="system" size="system"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="YgA-Ix-pFo">
<rect key="frame" x="239" y="351" width="122" height="30"/>
<state key="normal" title="Toggle Status Bar">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="toggleStatusBar:" destination="Gw0-zm-eCg" eventType="touchUpInside" id="yYS-8s-AIq"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="KTO-gU-YfQ">
<rect key="frame" x="20" y="220" width="127" height="30"/>
<state key="normal" title="Hold Down Button">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="releaseHoldAction:" destination="Gw0-zm-eCg" eventType="touchUpInside" id="1bJ-cD-zA7"/>
<action selector="releaseHoldAction:" destination="Gw0-zm-eCg" eventType="touchUpOutside" id="l2X-i3-mDk"/>
<action selector="startHoldAction:" destination="Gw0-zm-eCg" eventType="touchDown" id="TYF-6g-bra"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Not Pressed" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eFN-my-Qg9">
<rect key="frame" x="480" y="224" width="100" height="20.5"/>
<constraints>
<constraint firstAttribute="width" constant="100" id="ut4-S4-j7q"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="ClJ-ko-Drd" secondAttribute="trailing" constant="20" symbolic="YES" id="KLS-h5-8Xt"/>
<constraint firstItem="ClJ-ko-Drd" firstAttribute="top" secondItem="KTO-gU-YfQ" secondAttribute="bottom" constant="42" id="R4K-XQ-1Vd"/>
<constraint firstItem="ClJ-ko-Drd" firstAttribute="centerY" secondItem="5Bv-ow-0lT" secondAttribute="centerY" id="RmA-4E-N45"/>
<constraint firstAttribute="centerX" secondItem="YgA-Ix-pFo" secondAttribute="centerX" id="U3b-Pf-WiR"/>
<constraint firstItem="ClJ-ko-Drd" firstAttribute="leading" secondItem="KTO-gU-YfQ" secondAttribute="leading" id="ci8-Bn-cMf"/>
<constraint firstAttribute="centerX" secondItem="ClJ-ko-Drd" secondAttribute="centerX" id="cxa-1p-wCf"/>
<constraint firstItem="ClJ-ko-Drd" firstAttribute="leading" secondItem="5Bv-ow-0lT" secondAttribute="leading" constant="20" symbolic="YES" id="glM-xI-6L7"/>
<constraint firstItem="eFN-my-Qg9" firstAttribute="centerY" secondItem="KTO-gU-YfQ" secondAttribute="centerY" constant="-0.5" id="lcq-uR-Xoe"/>
<constraint firstItem="YgA-Ix-pFo" firstAttribute="top" secondItem="ClJ-ko-Drd" secondAttribute="bottom" constant="42" id="wZi-Xd-xuO"/>
<constraint firstItem="eFN-my-Qg9" firstAttribute="trailing" secondItem="ClJ-ko-Drd" secondAttribute="trailing" id="ybX-o4-Flu"/>
</constraints>
</view>
<navigationItem key="navigationItem" title="Detail" id="NMf-W9-2Hp"/>
<connections>
<outlet property="detailDescriptionLabel" destination="ClJ-ko-Drd" id="fM3-dV-mjX"/>
<outlet property="holding" destination="eFN-my-Qg9" id="Dsj-Rf-jqZ"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="6r1-KD-fbi" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1564" y="64"/>
</scene>
</scenes>
</document>

View File

@ -24,6 +24,8 @@
<string>1.0</string> <string>1.0</string>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>
<true/> <true/>
<key>UILaunchStoryboardName</key>
<string>Launch Screen</string>
<key>UIMainStoryboardFile</key> <key>UIMainStoryboardFile</key>
<string>Main</string> <string>Main</string>
<key>UIRequiredDeviceCapabilities</key> <key>UIRequiredDeviceCapabilities</key>
@ -46,5 +48,7 @@
<string>UIInterfaceOrientationLandscapeLeft</string> <string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string> <string>UIInterfaceOrientationLandscapeRight</string>
</array> </array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict> </dict>
</plist> </plist>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 KiB

After

Width:  |  Height:  |  Size: 601 KiB