mirror of
https://github.com/joeblau/COSTouchVisualizer.git
synced 2024-09-11 12:36:58 +03:00
Fixed UI issies and updated to universal storyboards
This commit is contained in:
parent
2306412316
commit
393debeb77
@ -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
|
|
||||||
...
|
...
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
@ -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 = (
|
||||||
|
@ -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>
|
|
@ -8,6 +8,6 @@
|
|||||||
|
|
||||||
@interface COSAppDelegate : UIResponder <UIApplicationDelegate>
|
@interface COSAppDelegate : UIResponder <UIApplicationDelegate>
|
||||||
|
|
||||||
@property (nonatomic) UIWindow* window;
|
@property (nonatomic) UIWindow *window;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,11 @@
|
|||||||
"idiom" : "iphone",
|
"idiom" : "iphone",
|
||||||
"size" : "60x60",
|
"size" : "60x60",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"size" : "60x60",
|
||||||
|
"scale" : "3x"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info" : {
|
"info" : {
|
||||||
|
45
Example/TouchVisualizer/Launch Screen.xib
Normal file
45
Example/TouchVisualizer/Launch Screen.xib
Normal 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>
|
140
Example/TouchVisualizer/Main.storyboard
Normal file
140
Example/TouchVisualizer/Main.storyboard
Normal 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>
|
@ -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>
|
||||||
|
BIN
touchvisdemo.gif
BIN
touchvisdemo.gif
Binary file not shown.
Before Width: | Height: | Size: 287 KiB After Width: | Height: | Size: 601 KiB |
Loading…
Reference in New Issue
Block a user