72 Commits

Author SHA1 Message Date
shu223 c4cdee6a36 Update storyboards with Xcode 13 2021-10-12 18:37:02 +09:00
shu223 553e235389 Delete launch images from the asset catalog. 2021-10-12 18:34:16 +09:00
shu223 cb4bc7ecd7 Update the project settings with Xcode 13 2021-10-12 18:32:17 +09:00
Shuichi Tsutsumi 8a4176470b Merge pull request #49 from faimin/master
fix misjudgment import
2021-10-12 18:12:30 +09:00
Zero.D.Saber d2a273d5ca fix misjudgment import 2021-10-12 13:51:56 +08:00
shu223 40fb22d7ff Update podspec 2020-07-03 18:59:51 +09:00
shu223 3e6b2fed63 Enable to set the effect's borderWidth and borderColor. 2020-07-03 18:59:12 +09:00
shu223 a146adf67e Update podspec 2020-07-03 18:23:40 +09:00
shu223 603155e62d Fix leaks 2020-07-03 18:22:04 +09:00
Shuichi Tsutsumi 1a10a75797 Create FUNDING.yml 2020-03-29 07:35:58 +09:00
shu223 001605f85f Update project settings with Xcode 10.2 2019-04-11 13:42:44 +09:00
shu223 5d17f1ece9 Fix the layout 2018-09-15 11:53:54 +09:00
shu223 c1d9c432aa Update README 2018-09-15 11:40:41 +09:00
shu223 31fd76852b Updated with Xcode 9.3 2018-05-24 13:57:02 -07:00
shu223 8a8a527cdd Merge branch 'master' of github.com:shu223/PulsingHalo 2018-01-23 13:50:53 -08:00
shu223 7d39995a9e Fixes with Xcode 9 2018-01-23 13:50:38 -08:00
Shuichi Tsutsumi 926af87bae Update README.md 2017-10-02 23:05:38 -05:00
shu223 255eacebdf Fixed podspec 2017-09-09 08:21:35 +09:00
shu223 42cf015108 Update README.md 2017-05-07 00:48:16 +09:00
shu223 a9c3563112 Update README.md 2017-05-07 00:47:35 +09:00
shu223 d7dc0523e0 Updated the version in the podspec 2017-05-07 00:05:06 +09:00
shu223 f2ef50c1eb Updated a storyboard 2017-04-07 17:29:45 -07:00
shu223 2dc6f0d809 updated podspec 2017-01-17 12:47:32 -08:00
shu223 3323f9f122 updated podspec 2017-01-15 17:57:07 -08:00
shu223 045ee21f6a added a property to disable resume 2017-01-15 17:52:35 -08:00
shu223 ddd93811b5 supported resuming 2017-01-15 17:46:57 -08:00
shu223 2d84f15758 Updated podspec. 2016-09-07 11:46:01 +09:00
shu223 80ac3fbcc4 http://stackoverflow.com/questions/19789958/xcode-preprocessor-macro-to-check-if-base-sdk-ios-7-0 2016-09-07 11:34:58 +09:00
shu223 457e4406e9 Enabled to be built with both iOS 9 or lower and 10. 2016-09-07 11:24:38 +09:00
shu223 25aa12f9c2 Enabled to be built by both iOS target 10 and 9 or lower. 2016-09-07 11:19:16 +09:00
shu223 cfcce191df Updated podspec. 2016-09-07 11:00:59 +09:00
shu223 9de09941a5 Changes by Xcode 8 2016-09-07 11:00:22 +09:00
shu223 d3dedae77e Resolved a warning 2016-09-03 11:12:34 +09:00
shu223 ac8d81f1f3 Updated the podspec 2016-08-04 12:40:35 +09:00
shu223 1f75b98748 Fixed a bug of repeatCount 2016-08-04 12:40:03 +09:00
shu223 43a5363c11 Updated the podspec 2016-08-04 11:43:52 +09:00
shu223 cd85593a0e Updated README 2016-08-04 11:43:34 +09:00
shu223 499f05f8c4 Fixed a bug of repeatConunt property. 2016-08-04 11:33:14 +09:00
shu223 51f20ee16e Resolved warnings for demo 2016-08-04 11:28:41 +09:00
shu223 eed177243f Disabled fromValueForAlpha 2016-08-04 11:25:01 +09:00
shu223 4d1071ddb7 Updated with Xcode 7.3.1 2016-08-04 11:05:37 +09:00
shu223 0799f509e1 Update README 2016-05-04 16:14:46 +09:00
shu223 c0a303b656 Updated README 2016-05-04 15:35:23 +09:00
shu223 968d1850c6 Updated with Xcode 7.3 2016-05-04 15:35:12 +09:00
shu223 68887786b4 Merge pull request #35 from harryworld/patch-1
Omitting headers for pods in duplicate imports
2016-03-22 08:52:45 +01:00
Harry Ng 6cffb57e63 Omitting headers for pods in duplicate imports 2016-03-22 09:59:34 +08:00
shu223 4e500461bf Update README for Carthage support. 2016-03-11 22:54:13 +09:00
shu223 807f317776 Create shared framework 2016-03-11 22:46:35 +09:00
shu223 51522193ba Updated README 2016-03-11 18:06:07 +09:00
shu223 bd18e04b04 Update podspec 2016-03-11 16:58:48 +09:00
shu223 29a5f78adb Update podspec 2016-03-11 16:53:35 +09:00
shu223 b10f9ccb97 Updated demo for new API. 2016-03-11 16:52:47 +09:00
shu223 fff46e1432 Updated APIs for dynamic customization 2016-03-11 16:36:37 +09:00
shu223 bf45450801 Updated README 2015-10-20 05:31:44 +09:00
shu223 5ed5c00a21 Minor update 2015-10-20 05:29:00 +09:00
shu223 eaf042515b Replaced demo.gif 2015-10-20 05:24:57 +09:00
shu223 f1585e98d8 - Enabled to change duration dynamically
- Updated demo & README
2015-10-20 05:15:03 +09:00
shu223 6a1098f3f6 Merge pull request #26 from dealforest/topic/CAReplicatorLayer
Modify using CAReplicatorLayer
2015-10-14 09:00:30 +09:00
Toshihiro Morimoto 5f58d7b601 Update README 2015-10-13 22:27:19 +09:00
Toshihiro Morimoto 71ffc48e02 Modify using CAReplicatorLayer 2015-10-13 22:22:41 +09:00
shu223 d07b140881 Minor changes for Xcode 7 2015-09-12 23:04:57 +09:00
shu223 c782ea35db Merge pull request #25 from ahui2823/master
fixed memory leak in haloLayerColor setter
2015-09-12 23:01:46 +09:00
Tianhui Huang b2d2571835 fixed memory leak in haloLayerColor setter 2015-09-10 17:28:05 +08:00
shu223 2bb83787b1 Merge pull request #22 from revolter/master
Added properties documentation
2015-05-31 09:37:03 +09:00
Iulian Onofrei 4aaf75924d This fixes shu223/PulsingHalo#16 2015-05-26 12:56:45 +03:00
Iulian Onofrei 5bffb487ab Added properties documentation 2015-05-26 12:39:31 +03:00
shu223 ebc6a477da Merge pull request #17 from jurvis/master
fixed xcode compiler warning
2015-05-01 10:12:02 +09:00
Jurvis Tan 721231790d fixed xcode compiler warning 2015-04-14 15:49:49 +08:00
shu223 ec864e8459 Update PulsingHalo.podspec 2015-03-26 14:14:20 +09:00
shu223 f3dbe609e6 Remove after finishing the animation 2015-02-18 21:08:43 +09:00
shu223 f8362bea17 Added UIKit import 2015-02-18 20:48:31 +09:00
shu223 2a923a618d Suppressed a warning 2015-02-18 20:44:03 +09:00
32 changed files with 1100 additions and 439 deletions
+4
View File
@@ -0,0 +1,4 @@
# These are supported funding model platforms
github: [shu223]
custom: ['https://paypal.me/shu223']
+32 -11
View File
@@ -1,6 +1,12 @@
# Xcode
.DS_Store
*/build/*
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
## Build generated
build/
DerivedData/
## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
@@ -9,13 +15,28 @@
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
profile
*.moved-aside
DerivedData
.idea/
*.hmap
*.xccheckout
xcuserdata/
#CocoaPods
Pods
## Other
*.moved-aside
*.xcuserstate
## Obj-C/Swift specific
*.hmap
*.ipa
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
Pods/
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Build
PulsingHaloDemo.xccheckout
+5 -4
View File
@@ -1,12 +1,13 @@
Pod::Spec.new do |s|
s.name = "PulsingHalo"
s.version = "0.0.4"
s.summary = "iOS Component For Creating A Pulsing Animation Great For Map Annotations And Beacons"
s.version = "0.2.10"
s.platform = :ios
s.ios.deployment_target = '8.0'
s.summary = "iOS Component to create Pulsating Animations."
s.homepage = "https://github.com/shu223/PulsingHalo"
s.license = 'MIT'
s.author = { "shu223" => "shuichi0526@gmail.com" }
s.platform = :ios
s.source = { :git => "https://github.com/shu223/PulsingHalo.git", :tag => "0.0.4" }
s.source = { :git => "https://github.com/shu223/PulsingHalo.git", :tag => "0.2.10" }
s.source_files = 'PulsingHalo/*.{h,m}'
s.framework = 'QuartzCore'
s.requires_arc = true
+26
View File
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>
-38
View File
@@ -1,38 +0,0 @@
//
// MultiplePulsingHaloLayer.h
// PulsingHaloDemo
//
// Created by ShannonChou on 14-7-7.
// Copyright (c) 2014年 jiecao.fm. All rights reserved.
//
#import <QuartzCore/QuartzCore.h>
@interface MultiplePulsingHaloLayer : CALayer
@property (nonatomic, assign) CGFloat radius; // default: 60pt
@property (nonatomic, assign) CGColorRef haloLayerColor; // color of halo layers
/* properties below should be set before calling "buildSublayers" */
@property (nonatomic, assign) CGFloat fromValueForRadius; // default: 0.0
@property (nonatomic, assign) CGFloat fromValueForAlpha; // default: 0.45
@property (nonatomic, assign) CGFloat keyTimeForHalfOpacity; // default: 0.2 (range: 0 < keyTime < 1)
@property (nonatomic, assign) NSTimeInterval animationDuration; // default: 3s
@property (nonatomic, assign) NSTimeInterval pulseInterval; // default: 0s
@property (nonatomic, assign) NSTimeInterval startInterval; // if there are two more halo layer, this value presents the interval between their first start time, default: 1s
@property (nonatomic, assign) CGFloat animationRepeatCount; // default: INFINITY
@property (nonatomic, assign) int haloLayerNumber; // default: 3
@property (nonatomic, assign) BOOL useTimingFunction; // default: YES should use timingFunction for animation
- (id)initWithHaloLayerNum:(int)num andStartInterval:(NSTimeInterval)interval;
/**
Some properties must be set before calling this method. Like "haloLayerNumber" "startInterval" "animationDuration" and so on
except "radius" "haloLayerColor" "backgroundColor". If you want to change some properties like "haloLayerNumber" when the
animation is running, you have to create a new instance.
*/
- (void)buildSublayers;
@end
-85
View File
@@ -1,85 +0,0 @@
//
// MultiplePulsingHaloLayer.m
// PulsingHaloDemo
//
// Created by ShannonChou on 14-7-7.
// Copyright (c) 2014年 jiecao.fm. All rights reserved.
//
#import "MultiplePulsingHaloLayer.h"
#import "PulsingHaloLayer.h"
@implementation MultiplePulsingHaloLayer
- (id)init {
return [self initWithHaloLayerNum:3 andStartInterval:1];
}
- (id)initWithHaloLayerNum:(int)num andStartInterval:(NSTimeInterval)interval {
if (self = [super init]) {
self.haloLayerNumber = num;
self.startInterval = interval;
// default
_fromValueForRadius = 0.0;
_fromValueForAlpha = 0.45;
_keyTimeForHalfOpacity = 0.2;
_animationDuration = 3;
_pulseInterval = 0;
_animationRepeatCount = INFINITY;
_radius = 60;
_useTimingFunction = YES;
self.backgroundColor = [[UIColor clearColor] CGColor];
}
return self;
}
- (void)setHaloLayerColor:(CGColorRef)backgroundColor {
_haloLayerColor = CGColorRetain(backgroundColor);
for (PulsingHaloLayer *layer in self.sublayers) {
layer.backgroundColor = backgroundColor;
}
}
- (void)setRadius:(CGFloat)radius {
_radius = radius;
CGPoint tempPos = self.position;
CGFloat diameter = self.radius * 2;
self.bounds = CGRectMake(0, 0, diameter, diameter);
self.cornerRadius = self.radius;
self.position = tempPos;
//ajust sublayer
for (PulsingHaloLayer *layer in self.sublayers) {
layer.radius = radius;
layer.position = CGPointMake(self.frame.size.width / 2, self.frame.size.height / 2);
}
}
- (void)buildSublayers {
for (int i = 0; i < self.haloLayerNumber; i++) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.startInterval* i * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
PulsingHaloLayer *layer = [PulsingHaloLayer layer];
layer.animationDuration = self.animationDuration;
layer.repeatCount = self.animationRepeatCount;
layer.position = CGPointMake(self.frame.size.width / 2, self.frame.size.height / 2);
layer.radius = self.radius;
layer.fromValueForAlpha = self.fromValueForAlpha;
layer.fromValueForRadius = self.fromValueForRadius;
layer.keyTimeForHalfOpacity = self.keyTimeForHalfOpacity;
layer.pulseInterval = self.pulseInterval;
layer.backgroundColor = self.haloLayerColor;
layer.useTimingFunction = self.useTimingFunction;
[self addSublayer:layer];
});
}
NSLog(@"sub count:%i", self.sublayers.count);
}
- (void)dealloc {
CGColorRelease(_haloLayerColor);
}
@end
+25
View File
@@ -0,0 +1,25 @@
//
// PulsingHalo.h
// PulsingHalo
//
// Created by Shuichi Tsutsumi on 3/11/16.
// Copyright © 2016 Shuichi Tsutsumi. All rights reserved.
//
#import <UIKit/UIKit.h>
//! Project version number for PulsingHalo.
FOUNDATION_EXPORT double PulsingHaloVersionNumber;
//! Project version string for PulsingHalo.
FOUNDATION_EXPORT const unsigned char PulsingHaloVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <PulsingHalo/PublicHeader.h>
#if __has_include(<PulsingHalo/PulsingHaloLayer.h>)
#import <PulsingHalo/PulsingHaloLayer.h>
#else
#import "PulsingHaloLayer.h"
#endif
+63 -10
View File
@@ -8,20 +8,73 @@
// Inspired by https://github.com/samvermette/SVPulsingAnnotationView
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
@interface PulsingHaloLayer : CALayer
@interface PulsingHaloLayer : CAReplicatorLayer
@property (nonatomic, assign) CGFloat radius; // default: 60pt
@property (nonatomic, assign) CGFloat fromValueForRadius; // default: 0.0
@property (nonatomic, assign) CGFloat fromValueForAlpha; // default: 0.45
@property (nonatomic, assign) CGFloat keyTimeForHalfOpacity; // default: 0.2 (range: 0 < keyTime < 1)
@property (nonatomic, assign) NSTimeInterval animationDuration; // default: 3s
@property (nonatomic, assign) NSTimeInterval pulseInterval; // default: 0s
@property (nonatomic, assign) float repeatCount; // default: INFINITY
@property (nonatomic, assign) BOOL useTimingFunction; // default: YES should use timingFunction for animation
/**
* The default value of this property is @c 60pt.
*/
@property (nonatomic, assign) CGFloat radius;
- (id)initWithRepeatCount:(float)repeatCount;
/**
* The default value of this property is @c 0.0.
*/
@property (nonatomic, assign) CGFloat fromValueForRadius;
/**
* The default value of this property is @c 0.45.
*/
@property (nonatomic, assign) CGFloat fromValueForAlpha __attribute__ ((unavailable("Now the alpha channel of the backgroundColor is used.")));
/**
* The value of this property should be ranging from @c 0 to @c 1 (exclusive).
*
* The default value of this property is @c 0.2.
*/
@property (nonatomic, assign) CGFloat keyTimeForHalfOpacity;
/**
* The animation duration in seconds.
*
* The default value of this property is @c 3.
*/
@property (nonatomic, assign) NSTimeInterval animationDuration;
/**
* The animation interval in seconds.
*
* The default value of this property is @c 0.
*/
@property (nonatomic, assign) NSTimeInterval pulseInterval;
/**
* The default value of this property is @c YES.
*/
@property (nonatomic, assign) BOOL useTimingFunction;
/**
* The default value of this property is @c 1.
*/
@property (nonatomic, assign) NSInteger haloLayerNumber;
/**
* The animation delay in seconds.
*
* The default value of this property is @c 1.
*/
@property (nonatomic, assign) NSTimeInterval startInterval;
/**
* When this value is true, the halo will be automatically resumed after entering foreground.
*
* The default value of this property is YES.
*/
@property (nonatomic, assign) BOOL shouldResume;
- (void)start;
- (void)stop;
@end
+161 -45
View File
@@ -10,76 +10,169 @@
#import "PulsingHaloLayer.h"
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000
@interface PulsingHaloLayer () <CAAnimationDelegate>
#else
@interface PulsingHaloLayer ()
#endif
@property (nonatomic, strong) CALayer *effect;
@property (nonatomic, strong) CAAnimationGroup *animationGroup;
// for resume
@property (nonatomic, weak) CALayer *prevSuperlayer;
@property (nonatomic, assign) unsigned int prevLayerIndex;
@property (nonatomic, strong) CAAnimation *prevAnimation;
@end
@implementation PulsingHaloLayer
@dynamic repeatCount;
- (id)initWithRepeatCount:(float) repeatCount
- (instancetype)init
{
self = [super init];
if (self) {
self.contentsScale = [UIScreen mainScreen].scale;
self.opacity = 0;
self.effect = [CALayer new];
self.effect.contentsScale = [UIScreen mainScreen].scale;
self.effect.opacity = 0;
[self addSublayer:self.effect];
// default
self.radius = 60;
self.fromValueForRadius = 0.0;
self.fromValueForAlpha = 0.45;
self.keyTimeForHalfOpacity = 0.2;
self.animationDuration = 3;
self.pulseInterval = 0;
self.repeatCount = repeatCount;
self.backgroundColor = [[UIColor colorWithRed:0.000 green:0.478 blue:1.000 alpha:1] CGColor];
self.useTimingFunction = YES;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
[self setupAnimationGroup];
if(self.pulseInterval != INFINITY) {
dispatch_async(dispatch_get_main_queue(), ^(void) {
[self addAnimation:self.animationGroup forKey:@"pulse"];
});
}
});
[self _setupDefaults];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(onDidEnterBackground:)
name:UIApplicationDidEnterBackgroundNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(onWillEnterForeground:)
name:UIApplicationWillEnterForegroundNotification object:nil];
}
return self;
}
- (id)init {
return [self initWithRepeatCount:INFINITY];
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)onDidEnterBackground:(NSNotification *)notification {
self.prevSuperlayer = self.superlayer;
if (self.prevSuperlayer) {
unsigned int layerIndex = 0;
for (CALayer *aSublayer in self.superlayer.sublayers) {
if (aSublayer == self) {
self.prevLayerIndex = layerIndex;
break;
}
layerIndex++;
}
}
self.prevAnimation = [self.effect animationForKey:@"pulse"];
}
- (void)onWillEnterForeground:(NSNotification *)notification {
if (self.shouldResume) {
[self _resume];
}
}
// =============================================================================
#pragma mark - Accessor
- (void)start {
[self _setupAnimationGroup];
[self.effect addAnimation:self.animationGroup forKey:@"pulse"];
}
- (void)stop {
[self removeAllAnimations];
self.animationGroup.delegate = nil;
}
- (void)setFrame:(CGRect)frame {
[super setFrame:frame];
self.effect.frame = frame;
}
- (void)setBorderWidth:(CGFloat)borderWidth {
[super setBorderWidth:borderWidth];
self.effect.borderWidth = borderWidth;
}
- (void)setBorderColor:(CGColorRef)borderColor {
[super setBorderColor:borderColor];
self.effect.borderColor = borderColor;
}
- (void)setBackgroundColor:(CGColorRef)backgroundColor {
[super setBackgroundColor:backgroundColor];
self.effect.backgroundColor = backgroundColor;
}
- (void)setRadius:(CGFloat)radius {
_radius = radius;
CGPoint tempPos = self.position;
CGFloat diameter = self.radius * 2;
self.bounds = CGRectMake(0, 0, diameter, diameter);
self.cornerRadius = self.radius;
self.position = tempPos;
self.effect.bounds = CGRectMake(0, 0, diameter, diameter);
self.effect.cornerRadius = self.radius;
}
- (void)setupAnimationGroup {
- (void)setPulseInterval:(NSTimeInterval)pulseInterval {
_pulseInterval = pulseInterval;
if (_pulseInterval == INFINITY) {
[self.effect removeAnimationForKey:@"pulse"];
}
}
- (void)setHaloLayerNumber:(NSInteger)haloLayerNumber {
_haloLayerNumber = haloLayerNumber;
self.instanceCount = haloLayerNumber;
self.instanceDelay = (self.animationDuration + self.pulseInterval) / haloLayerNumber;
}
- (void)setStartInterval:(NSTimeInterval)startInterval {
_startInterval = startInterval;
self.instanceDelay = startInterval;
}
- (void)setAnimationDuration:(NSTimeInterval)animationDuration {
_animationDuration = animationDuration;
self.animationGroup = [CAAnimationGroup animation];
self.animationGroup.duration = self.animationDuration + self.pulseInterval;
self.animationGroup.repeatCount = self.repeatCount;
self.animationGroup.removedOnCompletion = NO;
self.instanceDelay = (self.animationDuration + self.pulseInterval) / self.haloLayerNumber;
}
- (void)setRepeatCount:(float)repeatCount {
[super setRepeatCount:repeatCount];
self.animationGroup.repeatCount = repeatCount;
}
// =============================================================================
#pragma mark - Private
- (void)_setupDefaults {
_shouldResume = YES;
_fromValueForRadius = 0.0;
_keyTimeForHalfOpacity = 0.2;
_animationDuration = 3;
_pulseInterval = 0;
_useTimingFunction = YES;
self.repeatCount = INFINITY;
self.radius = 60;
self.haloLayerNumber = 1;
self.startInterval = 1;
self.backgroundColor = [[UIColor colorWithRed:0.000 green:0.455 blue:0.756 alpha:0.45] CGColor];
}
- (void)_setupAnimationGroup {
CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
animationGroup.duration = self.animationDuration + self.pulseInterval;
animationGroup.repeatCount = self.repeatCount;
if (self.useTimingFunction) {
CAMediaTimingFunction *defaultCurve = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault];
self.animationGroup.timingFunction = defaultCurve;
animationGroup.timingFunction = defaultCurve;
}
CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale.xy"];
@@ -89,13 +182,36 @@
CAKeyframeAnimation *opacityAnimation = [CAKeyframeAnimation animationWithKeyPath:@"opacity"];
opacityAnimation.duration = self.animationDuration;
opacityAnimation.values = @[@(self.fromValueForAlpha), @0.45, @0];
CGFloat fromValueForAlpha = CGColorGetAlpha(self.backgroundColor);
opacityAnimation.values = @[@(fromValueForAlpha), @(fromValueForAlpha * 0.5), @0];
opacityAnimation.keyTimes = @[@0, @(self.keyTimeForHalfOpacity), @1];
opacityAnimation.removedOnCompletion = NO;
NSArray *animations = @[scaleAnimation, opacityAnimation];
self.animationGroup.animations = animations;
animationGroup.animations = animations;
self.animationGroup = animationGroup;
self.animationGroup.delegate = self;
}
- (void)_resume {
[self addSublayer:self.effect];
[self.prevSuperlayer insertSublayer:self atIndex:self.prevLayerIndex];
if (self.prevAnimation) {
[self.effect addAnimation:self.prevAnimation forKey:@"pulse"];
}
}
// =============================================================================
#pragma mark - CAAnimationDelegate
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
if ([self.effect.animationKeys count]) {
[self.effect removeAllAnimations];
}
[self.effect removeFromSuperlayer];
[self removeFromSuperlayer];
}
@end
+214 -31
View File
@@ -7,6 +7,10 @@
objects = {
/* Begin PBXBuildFile section */
8A76D79E1BD4CC6B00C3881D /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8A76D79D1BD4CC6B00C3881D /* Launch Screen.storyboard */; };
8AB7E7DC1C92DD87009A3BB6 /* PulsingHalo.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AB7E7DB1C92DD87009A3BB6 /* PulsingHalo.h */; settings = {ATTRIBUTES = (Public, ); }; };
8AB7E80A1C92F6FB009A3BB6 /* PulsingHaloLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AC9074B185065DB00A74F2E /* PulsingHaloLayer.m */; };
8AB7E8121C92FEB1009A3BB6 /* PulsingHaloLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AC9074A185065DB00A74F2E /* PulsingHaloLayer.h */; settings = {ATTRIBUTES = (Public, ); }; };
8AC907151850659E00A74F2E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8AC907141850659E00A74F2E /* Foundation.framework */; };
8AC907171850659E00A74F2E /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8AC907161850659E00A74F2E /* CoreGraphics.framework */; };
8AC907191850659E00A74F2E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8AC907181850659E00A74F2E /* UIKit.framework */; };
@@ -22,7 +26,6 @@
8AC9073E1850659E00A74F2E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8AC9073C1850659E00A74F2E /* InfoPlist.strings */; };
8AC907401850659E00A74F2E /* PulsingHaloDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AC9073F1850659E00A74F2E /* PulsingHaloDemoTests.m */; };
8AC9074C185065DB00A74F2E /* PulsingHaloLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AC9074B185065DB00A74F2E /* PulsingHaloLayer.m */; };
FBB13471196A7775001DBCB7 /* MultiplePulsingHaloLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = FBB13470196A7775001DBCB7 /* MultiplePulsingHaloLayer.m */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -35,7 +38,24 @@
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
8AB7E7E51C92DD88009A3BB6 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
8A76D79D1BD4CC6B00C3881D /* Launch Screen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = "<group>"; };
8AB7E7D91C92DD87009A3BB6 /* PulsingHalo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PulsingHalo.framework; sourceTree = BUILT_PRODUCTS_DIR; };
8AB7E7DB1C92DD87009A3BB6 /* PulsingHalo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PulsingHalo.h; sourceTree = "<group>"; };
8AB7E7DD1C92DD87009A3BB6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
8AC907111850659E00A74F2E /* PulsingHaloDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PulsingHaloDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
8AC907141850659E00A74F2E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
8AC907161850659E00A74F2E /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
@@ -57,11 +77,16 @@
8AC9073F1850659E00A74F2E /* PulsingHaloDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PulsingHaloDemoTests.m; sourceTree = "<group>"; };
8AC9074A185065DB00A74F2E /* PulsingHaloLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PulsingHaloLayer.h; sourceTree = "<group>"; };
8AC9074B185065DB00A74F2E /* PulsingHaloLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PulsingHaloLayer.m; sourceTree = "<group>"; };
FBB1346F196A7775001DBCB7 /* MultiplePulsingHaloLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiplePulsingHaloLayer.h; sourceTree = "<group>"; };
FBB13470196A7775001DBCB7 /* MultiplePulsingHaloLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MultiplePulsingHaloLayer.m; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
8AB7E7D51C92DD87009A3BB6 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
8AC9070E1850659E00A74F2E /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
@@ -85,10 +110,21 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
8AB7E7DA1C92DD87009A3BB6 /* PulsingHalo */ = {
isa = PBXGroup;
children = (
8AB7E7DB1C92DD87009A3BB6 /* PulsingHalo.h */,
8AC9074A185065DB00A74F2E /* PulsingHaloLayer.h */,
8AC9074B185065DB00A74F2E /* PulsingHaloLayer.m */,
8AB7E7DD1C92DD87009A3BB6 /* Info.plist */,
);
path = PulsingHalo;
sourceTree = "<group>";
};
8AC907081850659E00A74F2E = {
isa = PBXGroup;
children = (
8AC90749185065DB00A74F2E /* PulsingHalo */,
8AB7E7DA1C92DD87009A3BB6 /* PulsingHalo */,
8AC9071A1850659E00A74F2E /* PulsingHaloDemo */,
8AC907391850659E00A74F2E /* PulsingHaloDemoTests */,
8AC907131850659E00A74F2E /* Frameworks */,
@@ -101,6 +137,7 @@
children = (
8AC907111850659E00A74F2E /* PulsingHaloDemo.app */,
8AC907321850659E00A74F2E /* PulsingHaloDemoTests.xctest */,
8AB7E7D91C92DD87009A3BB6 /* PulsingHalo.framework */,
);
name = Products;
sourceTree = "<group>";
@@ -119,13 +156,14 @@
8AC9071A1850659E00A74F2E /* PulsingHaloDemo */ = {
isa = PBXGroup;
children = (
8AC9071B1850659E00A74F2E /* Supporting Files */,
8AC9072C1850659E00A74F2E /* Images.xcassets */,
8AC907261850659E00A74F2E /* Main.storyboard */,
8A76D79D1BD4CC6B00C3881D /* Launch Screen.storyboard */,
8AC907231850659E00A74F2E /* AppDelegate.h */,
8AC907241850659E00A74F2E /* AppDelegate.m */,
8AC907261850659E00A74F2E /* Main.storyboard */,
8AC907291850659E00A74F2E /* ViewController.h */,
8AC9072A1850659E00A74F2E /* ViewController.m */,
8AC9072C1850659E00A74F2E /* Images.xcassets */,
8AC9071B1850659E00A74F2E /* Supporting Files */,
);
path = PulsingHaloDemo;
sourceTree = "<group>";
@@ -159,20 +197,39 @@
name = "Supporting Files";
sourceTree = "<group>";
};
8AC90749185065DB00A74F2E /* PulsingHalo */ = {
isa = PBXGroup;
children = (
8AC9074A185065DB00A74F2E /* PulsingHaloLayer.h */,
8AC9074B185065DB00A74F2E /* PulsingHaloLayer.m */,
FBB1346F196A7775001DBCB7 /* MultiplePulsingHaloLayer.h */,
FBB13470196A7775001DBCB7 /* MultiplePulsingHaloLayer.m */,
);
path = PulsingHalo;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
8AB7E7D61C92DD87009A3BB6 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
8AB7E7DC1C92DD87009A3BB6 /* PulsingHalo.h in Headers */,
8AB7E8121C92FEB1009A3BB6 /* PulsingHaloLayer.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
8AB7E7D81C92DD87009A3BB6 /* PulsingHalo */ = {
isa = PBXNativeTarget;
buildConfigurationList = 8AB7E7E41C92DD88009A3BB6 /* Build configuration list for PBXNativeTarget "PulsingHalo" */;
buildPhases = (
8AB7E7D41C92DD87009A3BB6 /* Sources */,
8AB7E7D51C92DD87009A3BB6 /* Frameworks */,
8AB7E7D61C92DD87009A3BB6 /* Headers */,
8AB7E7D71C92DD87009A3BB6 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = PulsingHalo;
productName = PulsingHalo;
productReference = 8AB7E7D91C92DD87009A3BB6 /* PulsingHalo.framework */;
productType = "com.apple.product-type.framework";
};
8AC907101850659E00A74F2E /* PulsingHaloDemo */ = {
isa = PBXNativeTarget;
buildConfigurationList = 8AC907431850659E00A74F2E /* Build configuration list for PBXNativeTarget "PulsingHaloDemo" */;
@@ -180,6 +237,7 @@
8AC9070D1850659E00A74F2E /* Sources */,
8AC9070E1850659E00A74F2E /* Frameworks */,
8AC9070F1850659E00A74F2E /* Resources */,
8AB7E7E51C92DD88009A3BB6 /* Embed Frameworks */,
);
buildRules = (
);
@@ -214,9 +272,16 @@
8AC907091850659E00A74F2E /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0500;
LastUpgradeCheck = 1300;
ORGANIZATIONNAME = "Shuichi Tsutsumi";
TargetAttributes = {
8AB7E7D81C92DD87009A3BB6 = {
CreatedOnToolsVersion = 7.2.1;
};
8AC907101850659E00A74F2E = {
DevelopmentTeam = 9Z86A4AWDE;
ProvisioningStyle = Automatic;
};
8AC907311850659E00A74F2E = {
TestTargetID = 8AC907101850659E00A74F2E;
};
@@ -224,7 +289,7 @@
};
buildConfigurationList = 8AC9070C1850659E00A74F2E /* Build configuration list for PBXProject "PulsingHaloDemo" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
@@ -237,17 +302,26 @@
targets = (
8AC907101850659E00A74F2E /* PulsingHaloDemo */,
8AC907311850659E00A74F2E /* PulsingHaloDemoTests */,
8AB7E7D81C92DD87009A3BB6 /* PulsingHalo */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
8AB7E7D71C92DD87009A3BB6 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
8AC9070F1850659E00A74F2E /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8AC9072D1850659E00A74F2E /* Images.xcassets in Resources */,
8AC9071F1850659E00A74F2E /* InfoPlist.strings in Resources */,
8A76D79E1BD4CC6B00C3881D /* Launch Screen.storyboard in Resources */,
8AC907281850659E00A74F2E /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -263,12 +337,19 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
8AB7E7D41C92DD87009A3BB6 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8AB7E80A1C92F6FB009A3BB6 /* PulsingHaloLayer.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
8AC9070D1850659E00A74F2E /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8AC9074C185065DB00A74F2E /* PulsingHaloLayer.m in Sources */,
FBB13471196A7775001DBCB7 /* MultiplePulsingHaloLayer.m in Sources */,
8AC9072B1850659E00A74F2E /* ViewController.m in Sources */,
8AC907251850659E00A74F2E /* AppDelegate.m in Sources */,
8AC907211850659E00A74F2E /* main.m in Sources */,
@@ -321,27 +402,100 @@
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
8AB7E7E21C92DD88009A3BB6 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_WARN_UNREACHABLE_CODE = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = dwarf;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
INFOPLIST_FILE = PulsingHalo/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MTL_ENABLE_DEBUG_INFO = YES;
PRODUCT_BUNDLE_IDENTIFIER = "Shuichi-Tsutsumi.PulsingHalo";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
8AB7E7E31C92DD88009A3BB6 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_WARN_UNREACHABLE_CODE = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
INFOPLIST_FILE = PulsingHalo/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MTL_ENABLE_DEBUG_INFO = NO;
PRODUCT_BUNDLE_IDENTIFIER = "Shuichi-Tsutsumi.PulsingHalo";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Release;
};
8AC907411850659E00A74F2E /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)";
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
@@ -354,7 +508,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
};
@@ -364,30 +518,44 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)";
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = YES;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
};
@@ -397,11 +565,14 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
DEVELOPMENT_TEAM = 9Z86A4AWDE;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "PulsingHaloDemo/PulsingHaloDemo-Prefix.pch";
INFOPLIST_FILE = "PulsingHaloDemo/PulsingHaloDemo-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "Shuichi-Tsutsumi.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app;
};
@@ -411,11 +582,14 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
DEVELOPMENT_TEAM = 9Z86A4AWDE;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "PulsingHaloDemo/PulsingHaloDemo-Prefix.pch";
INFOPLIST_FILE = "PulsingHaloDemo/PulsingHaloDemo-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "Shuichi-Tsutsumi.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app;
};
@@ -424,7 +598,6 @@
8AC907471850659E00A74F2E /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)";
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/PulsingHaloDemo.app/PulsingHaloDemo";
FRAMEWORK_SEARCH_PATHS = (
"$(SDKROOT)/Developer/Library/Frameworks",
@@ -438,6 +611,7 @@
"$(inherited)",
);
INFOPLIST_FILE = "PulsingHaloDemoTests/PulsingHaloDemoTests-Info.plist";
PRODUCT_BUNDLE_IDENTIFIER = "Shuichi-Tsutsumi.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUNDLE_LOADER)";
WRAPPER_EXTENSION = xctest;
@@ -447,7 +621,6 @@
8AC907481850659E00A74F2E /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)";
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/PulsingHaloDemo.app/PulsingHaloDemo";
FRAMEWORK_SEARCH_PATHS = (
"$(SDKROOT)/Developer/Library/Frameworks",
@@ -457,6 +630,7 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "PulsingHaloDemo/PulsingHaloDemo-Prefix.pch";
INFOPLIST_FILE = "PulsingHaloDemoTests/PulsingHaloDemoTests-Info.plist";
PRODUCT_BUNDLE_IDENTIFIER = "Shuichi-Tsutsumi.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUNDLE_LOADER)";
WRAPPER_EXTENSION = xctest;
@@ -466,6 +640,15 @@
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
8AB7E7E41C92DD88009A3BB6 /* Build configuration list for PBXNativeTarget "PulsingHalo" */ = {
isa = XCConfigurationList;
buildConfigurations = (
8AB7E7E21C92DD88009A3BB6 /* Debug */,
8AB7E7E31C92DD88009A3BB6 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
8AC9070C1850659E00A74F2E /* Build configuration list for PBXProject "PulsingHaloDemo" */ = {
isa = XCConfigurationList;
buildConfigurations = (
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
@@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1300"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8AB7E7D81C92DD87009A3BB6"
BuildableName = "PulsingHalo.framework"
BlueprintName = "PulsingHalo"
ReferencedContainer = "container:PulsingHaloDemo.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8AB7E7D81C92DD87009A3BB6"
BuildableName = "PulsingHalo.framework"
BlueprintName = "PulsingHalo"
ReferencedContainer = "container:PulsingHaloDemo.xcodeproj">
</BuildableReference>
</MacroExpansion>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8AB7E7D81C92DD87009A3BB6"
BuildableName = "PulsingHalo.framework"
BlueprintName = "PulsingHalo"
ReferencedContainer = "container:PulsingHaloDemo.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
+229 -110
View File
@@ -1,123 +1,244 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="5056" systemVersion="13D65" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="vXZ-lx-hvc">
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19162" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="vXZ-lx-hvc">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3733"/>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19144"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="ufC-wZ-h7g">
<objects>
<viewController id="vXZ-lx-hvc" customClass="ViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="eWr-5e-3jC"/>
<viewControllerLayoutGuide type="bottom" id="H6a-sA-qU6"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="kh9-bI-dsS">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="Image" translatesAutoresizingMaskIntoConstraints="NO" id="b02-F2-S1G">
<rect key="frame" x="55" y="141" width="50" height="50"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
</imageView>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="Image" translatesAutoresizingMaskIntoConstraints="NO" id="urQ-AR-AKo">
<rect key="frame" x="215" y="141" width="50" height="50"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
</imageView>
<slider opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="AGT-ka-xWt">
<rect key="frame" x="100" y="311" width="118" height="34"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<connections>
<action selector="radiusChanged:" destination="vXZ-lx-hvc" eventType="valueChanged" id="SlZ-3n-qKu"/>
</connections>
</slider>
<slider opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="rzu-Eg-unI">
<rect key="frame" x="100" y="352" width="118" height="34"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<connections>
<action selector="colorChanged:" destination="vXZ-lx-hvc" eventType="valueChanged" id="vfj-vk-Eq8"/>
</connections>
</slider>
<slider opaque="NO" tag="1" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="2mN-dD-yv5">
<rect key="frame" x="100" y="393" width="118" height="34"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<connections>
<action selector="colorChanged:" destination="vXZ-lx-hvc" eventType="valueChanged" id="9O5-24-Xz0"/>
</connections>
</slider>
<slider opaque="NO" tag="2" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="Wh3-AW-Xwr">
<rect key="frame" x="100" y="434" width="118" height="34"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<connections>
<action selector="colorChanged:" destination="vXZ-lx-hvc" eventType="valueChanged" id="gsI-WD-P9h"/>
</connections>
</slider>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Radius" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="XHK-dc-rMm">
<rect key="frame" x="44" y="321" width="50" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="1.00" lineBreakMode="clip" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5Ae-iF-Uo2">
<rect key="frame" x="224" y="321" width="50" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="1.00" lineBreakMode="clip" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="byo-ur-zAu">
<rect key="frame" x="224" y="362" width="50" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="1.00" lineBreakMode="clip" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="16G-0A-ZRR">
<rect key="frame" x="224" y="403" width="50" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="1.00" lineBreakMode="clip" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Cr8-K3-bbK">
<rect key="frame" x="224" y="444" width="50" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="R" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="272-O8-NYD">
<rect key="frame" x="44" y="360" width="50" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="G" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="BhV-bI-fTv">
<rect key="frame" x="44" y="401" width="50" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="B" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7O2-Ri-YuD">
<rect key="frame" x="44" y="442" width="50" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fl3-yd-NIN">
<rect key="frame" x="0.0" y="0.0" width="375" height="372"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Image" translatesAutoresizingMaskIntoConstraints="NO" id="b02-F2-S1G">
<rect key="frame" x="162.5" y="161" width="50" height="50"/>
<constraints>
<constraint firstAttribute="width" constant="50" id="AbO-K8-a2R"/>
<constraint firstAttribute="height" constant="50" id="Ui7-Oz-DkV"/>
</constraints>
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="b02-F2-S1G" firstAttribute="centerX" secondItem="fl3-yd-NIN" secondAttribute="centerX" id="KX5-HO-kIP"/>
<constraint firstItem="b02-F2-S1G" firstAttribute="centerY" secondItem="fl3-yd-NIN" secondAttribute="centerY" id="upR-Wu-743"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="H5o-9G-3fm">
<rect key="frame" x="0.0" y="372" width="375" height="275"/>
<subviews>
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="3" minValue="1" maxValue="10" translatesAutoresizingMaskIntoConstraints="NO" id="S4w-Qm-Uy5">
<rect key="frame" x="128.5" y="20" width="118" height="31"/>
<constraints>
<constraint firstAttribute="width" constant="114" id="fx1-cr-NOG"/>
</constraints>
<connections>
<action selector="countChanged:" destination="vXZ-lx-hvc" eventType="valueChanged" id="x6Y-R7-Kme"/>
</connections>
</slider>
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="AGT-ka-xWt">
<rect key="frame" x="128.5" y="61" width="118" height="31"/>
<constraints>
<constraint firstAttribute="width" constant="114" id="Nzw-s8-nHW"/>
</constraints>
<connections>
<action selector="radiusChanged:" destination="vXZ-lx-hvc" eventType="valueChanged" id="SlZ-3n-qKu"/>
</connections>
</slider>
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="OuG-Ah-VZZ">
<rect key="frame" x="128.5" y="102" width="118" height="31"/>
<constraints>
<constraint firstAttribute="width" constant="114" id="Mh3-0r-dlH"/>
</constraints>
<connections>
<action selector="durationChanged:" destination="vXZ-lx-hvc" eventType="valueChanged" id="XCr-dq-Ve7"/>
</connections>
</slider>
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="rzu-Eg-unI">
<rect key="frame" x="128.5" y="143" width="118" height="31"/>
<constraints>
<constraint firstAttribute="width" constant="114" id="hoD-XQ-jIb"/>
</constraints>
<connections>
<action selector="colorChanged:" destination="vXZ-lx-hvc" eventType="valueChanged" id="vfj-vk-Eq8"/>
</connections>
</slider>
<slider opaque="NO" tag="1" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="2mN-dD-yv5">
<rect key="frame" x="128.5" y="184" width="118" height="31"/>
<constraints>
<constraint firstAttribute="width" constant="114" id="fvx-4w-Xla"/>
</constraints>
<connections>
<action selector="colorChanged:" destination="vXZ-lx-hvc" eventType="valueChanged" id="9O5-24-Xz0"/>
</connections>
</slider>
<slider opaque="NO" tag="2" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="Wh3-AW-Xwr">
<rect key="frame" x="128.5" y="225" width="118" height="31"/>
<constraints>
<constraint firstAttribute="width" constant="114" id="Hoc-2U-Wfn"/>
</constraints>
<connections>
<action selector="colorChanged:" destination="vXZ-lx-hvc" eventType="valueChanged" id="gsI-WD-P9h"/>
</connections>
</slider>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Radius" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="XHK-dc-rMm">
<rect key="frame" x="81" y="67.5" width="41.5" height="17"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" systemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Duration" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="NTZ-GR-2Ti">
<rect key="frame" x="71.5" y="108.5" width="51" height="17"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" systemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="1.00" lineBreakMode="clip" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5Ae-iF-Uo2">
<rect key="frame" x="252.5" y="67.5" width="27.5" height="17"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" systemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="1.00" lineBreakMode="clip" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="enD-Za-KPs">
<rect key="frame" x="252.5" y="108.5" width="27.5" height="17"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" systemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="1.00" lineBreakMode="clip" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="byo-ur-zAu">
<rect key="frame" x="252.5" y="149.5" width="27.5" height="17"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" systemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="1.00" lineBreakMode="clip" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="16G-0A-ZRR">
<rect key="frame" x="252.5" y="190.5" width="27.5" height="17"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" systemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="1.00" lineBreakMode="clip" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Cr8-K3-bbK">
<rect key="frame" x="252.5" y="231.5" width="27.5" height="17"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" systemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="R" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="272-O8-NYD">
<rect key="frame" x="113" y="149.5" width="9.5" height="17"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" systemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="G" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="BhV-bI-fTv">
<rect key="frame" x="112" y="190.5" width="10.5" height="17"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" systemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="B" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7O2-Ri-YuD">
<rect key="frame" x="111.5" y="231.5" width="9.5" height="17"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" systemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Count" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2XQ-eP-qmu">
<rect key="frame" x="85.5" y="26.5" width="37" height="17"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" systemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="1.00" lineBreakMode="clip" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ike-SP-Oen">
<rect key="frame" x="252.5" y="26.5" width="27.5" height="17"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Light" family="Helvetica Neue" pointSize="14"/>
<color key="textColor" systemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="16G-0A-ZRR" firstAttribute="leading" secondItem="2mN-dD-yv5" secondAttribute="trailing" constant="8" symbolic="YES" id="0S0-mq-IaE"/>
<constraint firstItem="S4w-Qm-Uy5" firstAttribute="leading" secondItem="2XQ-eP-qmu" secondAttribute="trailing" constant="8" symbolic="YES" id="1VS-Be-eKf"/>
<constraint firstItem="NTZ-GR-2Ti" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="H5o-9G-3fm" secondAttribute="leading" id="2Tq-qu-ljd"/>
<constraint firstItem="S4w-Qm-Uy5" firstAttribute="centerX" secondItem="H5o-9G-3fm" secondAttribute="centerX" id="55O-hU-VsY"/>
<constraint firstItem="ike-SP-Oen" firstAttribute="leading" secondItem="S4w-Qm-Uy5" secondAttribute="trailing" constant="8" symbolic="YES" id="5vM-sn-DJh"/>
<constraint firstItem="272-O8-NYD" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="H5o-9G-3fm" secondAttribute="leading" id="7VK-Wg-BIJ"/>
<constraint firstItem="Cr8-K3-bbK" firstAttribute="centerY" secondItem="Wh3-AW-Xwr" secondAttribute="centerY" id="7yR-Ua-jfV"/>
<constraint firstItem="BhV-bI-fTv" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="H5o-9G-3fm" secondAttribute="leading" id="86e-fS-IkG"/>
<constraint firstItem="NTZ-GR-2Ti" firstAttribute="centerY" secondItem="OuG-Ah-VZZ" secondAttribute="centerY" id="C8m-g2-u6l"/>
<constraint firstItem="Wh3-AW-Xwr" firstAttribute="centerX" secondItem="H5o-9G-3fm" secondAttribute="centerX" id="DLb-lw-OeE"/>
<constraint firstItem="OuG-Ah-VZZ" firstAttribute="top" secondItem="AGT-ka-xWt" secondAttribute="bottom" constant="11" id="EIb-Hk-YLB"/>
<constraint firstItem="Cr8-K3-bbK" firstAttribute="leading" secondItem="Wh3-AW-Xwr" secondAttribute="trailing" constant="8" symbolic="YES" id="FmM-hA-vOJ"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="16G-0A-ZRR" secondAttribute="trailing" id="Hhe-mF-wVd"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="ike-SP-Oen" secondAttribute="trailing" id="I9c-pR-WFZ"/>
<constraint firstItem="AGT-ka-xWt" firstAttribute="centerX" secondItem="H5o-9G-3fm" secondAttribute="centerX" id="IWp-Bt-LxZ"/>
<constraint firstItem="2XQ-eP-qmu" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="H5o-9G-3fm" secondAttribute="leading" id="LOS-CA-iot"/>
<constraint firstItem="AGT-ka-xWt" firstAttribute="leading" secondItem="XHK-dc-rMm" secondAttribute="trailing" constant="8" symbolic="YES" id="Lf4-jM-fdC"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="enD-Za-KPs" secondAttribute="trailing" id="NAG-ki-arM"/>
<constraint firstItem="7O2-Ri-YuD" firstAttribute="leading" secondItem="H5o-9G-3fm" secondAttribute="leading" constant="111.5" id="NBt-Bg-HyJ"/>
<constraint firstItem="rzu-Eg-unI" firstAttribute="leading" secondItem="272-O8-NYD" secondAttribute="trailing" constant="8" symbolic="YES" id="Ohq-Ze-cX3"/>
<constraint firstItem="enD-Za-KPs" firstAttribute="leading" secondItem="OuG-Ah-VZZ" secondAttribute="trailing" constant="8" symbolic="YES" id="SBt-Oe-HHS"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Cr8-K3-bbK" secondAttribute="trailing" id="Sdp-fR-V3V"/>
<constraint firstItem="rzu-Eg-unI" firstAttribute="centerX" secondItem="H5o-9G-3fm" secondAttribute="centerX" id="T3G-09-8X8"/>
<constraint firstItem="XHK-dc-rMm" firstAttribute="centerY" secondItem="AGT-ka-xWt" secondAttribute="centerY" id="VHf-aA-PzG"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="5Ae-iF-Uo2" secondAttribute="trailing" id="Veg-Mb-PGI"/>
<constraint firstItem="S4w-Qm-Uy5" firstAttribute="top" secondItem="H5o-9G-3fm" secondAttribute="top" constant="20" id="X21-Qn-0zA"/>
<constraint firstItem="16G-0A-ZRR" firstAttribute="centerY" secondItem="2mN-dD-yv5" secondAttribute="centerY" id="XcJ-h3-lzT"/>
<constraint firstItem="5Ae-iF-Uo2" firstAttribute="leading" secondItem="AGT-ka-xWt" secondAttribute="trailing" constant="8" symbolic="YES" id="YDu-7d-Wce"/>
<constraint firstItem="Wh3-AW-Xwr" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="7O2-Ri-YuD" secondAttribute="trailing" constant="8" symbolic="YES" id="ZAE-JC-hXx"/>
<constraint firstAttribute="bottom" secondItem="Wh3-AW-Xwr" secondAttribute="bottom" constant="20" id="ZED-cL-keq"/>
<constraint firstItem="byo-ur-zAu" firstAttribute="centerY" secondItem="rzu-Eg-unI" secondAttribute="centerY" id="ZOK-zd-LpH"/>
<constraint firstItem="2XQ-eP-qmu" firstAttribute="centerY" secondItem="S4w-Qm-Uy5" secondAttribute="centerY" id="ZeT-be-2m9"/>
<constraint firstItem="XHK-dc-rMm" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="H5o-9G-3fm" secondAttribute="leading" id="dvy-nB-zgr"/>
<constraint firstItem="enD-Za-KPs" firstAttribute="centerY" secondItem="OuG-Ah-VZZ" secondAttribute="centerY" id="ho9-Jg-222"/>
<constraint firstItem="ike-SP-Oen" firstAttribute="centerY" secondItem="S4w-Qm-Uy5" secondAttribute="centerY" id="i00-Ha-wCf"/>
<constraint firstItem="byo-ur-zAu" firstAttribute="leading" secondItem="rzu-Eg-unI" secondAttribute="trailing" constant="8" symbolic="YES" id="jNP-0f-Feu"/>
<constraint firstItem="BhV-bI-fTv" firstAttribute="centerY" secondItem="2mN-dD-yv5" secondAttribute="centerY" id="jws-PN-t1M"/>
<constraint firstItem="7O2-Ri-YuD" firstAttribute="centerY" secondItem="Wh3-AW-Xwr" secondAttribute="centerY" id="kG2-Jk-BlG"/>
<constraint firstItem="5Ae-iF-Uo2" firstAttribute="centerY" secondItem="AGT-ka-xWt" secondAttribute="centerY" id="lPs-UT-dL7"/>
<constraint firstItem="2mN-dD-yv5" firstAttribute="top" secondItem="rzu-Eg-unI" secondAttribute="bottom" constant="11" id="mKc-zP-Nky"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="byo-ur-zAu" secondAttribute="trailing" id="nwE-Xw-55t"/>
<constraint firstItem="Wh3-AW-Xwr" firstAttribute="top" secondItem="2mN-dD-yv5" secondAttribute="bottom" constant="11" id="sVi-Fd-e6i"/>
<constraint firstItem="OuG-Ah-VZZ" firstAttribute="leading" secondItem="NTZ-GR-2Ti" secondAttribute="trailing" constant="8" symbolic="YES" id="sn1-zO-D3f"/>
<constraint firstItem="2mN-dD-yv5" firstAttribute="centerX" secondItem="H5o-9G-3fm" secondAttribute="centerX" id="t6Z-LF-pD7"/>
<constraint firstItem="2mN-dD-yv5" firstAttribute="leading" secondItem="BhV-bI-fTv" secondAttribute="trailing" constant="8" symbolic="YES" id="tD1-e9-jys"/>
<constraint firstItem="OuG-Ah-VZZ" firstAttribute="centerX" secondItem="H5o-9G-3fm" secondAttribute="centerX" id="uu5-4w-m4L"/>
<constraint firstItem="AGT-ka-xWt" firstAttribute="top" secondItem="S4w-Qm-Uy5" secondAttribute="bottom" constant="11" id="vf1-7j-qLC"/>
<constraint firstItem="272-O8-NYD" firstAttribute="centerY" secondItem="rzu-Eg-unI" secondAttribute="centerY" id="ygA-Fv-FUB"/>
<constraint firstItem="rzu-Eg-unI" firstAttribute="top" secondItem="OuG-Ah-VZZ" secondAttribute="bottom" constant="11" id="zbp-a6-hjL"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<viewLayoutGuide key="safeArea" id="JUs-QT-iwQ"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="fl3-yd-NIN" firstAttribute="leading" secondItem="kh9-bI-dsS" secondAttribute="leading" id="1s5-vF-55z"/>
<constraint firstItem="JUs-QT-iwQ" firstAttribute="bottom" secondItem="H5o-9G-3fm" secondAttribute="bottom" constant="20" id="8jE-Q9-oYO"/>
<constraint firstItem="H5o-9G-3fm" firstAttribute="top" secondItem="fl3-yd-NIN" secondAttribute="bottom" id="EJE-a6-ToD"/>
<constraint firstItem="fl3-yd-NIN" firstAttribute="top" secondItem="JUs-QT-iwQ" secondAttribute="top" id="MAG-EU-MsG"/>
<constraint firstItem="H5o-9G-3fm" firstAttribute="leading" secondItem="kh9-bI-dsS" secondAttribute="leading" id="TQv-SF-3bE"/>
<constraint firstAttribute="trailing" secondItem="fl3-yd-NIN" secondAttribute="trailing" id="Y9B-nw-fuL"/>
<constraint firstAttribute="trailing" secondItem="H5o-9G-3fm" secondAttribute="trailing" id="v3H-2m-SCt"/>
</constraints>
</view>
<connections>
<outlet property="bLabel" destination="Cr8-K3-bbK" id="bnR-Cq-Ix7"/>
<outlet property="bSlider" destination="Wh3-AW-Xwr" id="wSf-0R-oMf"/>
<outlet property="beaconView" destination="b02-F2-S1G" id="J6u-U8-tkr"/>
<outlet property="beaconViewMuti" destination="urQ-AR-AKo" id="MJg-z7-lol"/>
<outlet property="countLabel" destination="ike-SP-Oen" id="DLA-9U-YeR"/>
<outlet property="countSlider" destination="S4w-Qm-Uy5" id="dPk-j1-b6w"/>
<outlet property="durationLabel" destination="enD-Za-KPs" id="bri-wE-Ec3"/>
<outlet property="durationSlider" destination="OuG-Ah-VZZ" id="chi-ED-0hU"/>
<outlet property="gLabel" destination="16G-0A-ZRR" id="ZcK-ES-G54"/>
<outlet property="gSlider" destination="2mN-dD-yv5" id="2My-xV-6nP"/>
<outlet property="gSlider" destination="2mN-dD-yv5" id="1mW-tE-Jap"/>
<outlet property="rLabel" destination="byo-ur-zAu" id="rdc-zc-0qO"/>
<outlet property="rSlider" destination="rzu-Eg-unI" id="8Yn-se-50Q"/>
<outlet property="radiusLabel" destination="5Ae-iF-Uo2" id="rad-VL-EIU"/>
@@ -126,15 +247,13 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="x5A-6p-PRh" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="412" y="76"/>
<point key="canvasLocation" x="659.20000000000005" y="68.365817091454275"/>
</scene>
</scenes>
<resources>
<image name="Image" width="285" height="599"/>
<image name="Image" width="285" height="599.5"/>
<systemColor name="darkTextColor">
<color white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
</resources>
<simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/>
<simulatedScreenMetrics key="destination" type="retina4"/>
</simulatedMetricsContainer>
</document>
@@ -2,18 +2,55 @@
"images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-Small@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-Small@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-60@3x.png",
"scale" : "3x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-1024.png",
"scale" : "1x"
}
],
"info" : {
Binary file not shown.

After

Width:  |  Height:  |  Size: 295 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
@@ -6,8 +6,12 @@
},
{
"idiom" : "universal",
"scale" : "2x",
"filename" : "IPhone_5s.png"
"filename" : "IPhone_5s.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
@@ -1,23 +0,0 @@
{
"images" : [
{
"orientation" : "portrait",
"idiom" : "iphone",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"scale" : "2x"
},
{
"orientation" : "portrait",
"idiom" : "iphone",
"subtype" : "retina4",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "bluetooth_book.pdf",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
+41
View File
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19162" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19144"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/>
<viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="bluetooth_book" translatesAutoresizingMaskIntoConstraints="NO" id="KgX-hc-3sO">
<rect key="frame" x="104" y="250" width="167" height="167"/>
</imageView>
</subviews>
<color key="backgroundColor" red="0.0" green="0.45490196347236633" blue="0.75686275959014893" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="KgX-hc-3sO" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="KVD-eD-Cmd"/>
<constraint firstItem="KgX-hc-3sO" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="ogK-3c-PFR"/>
</constraints>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
<resources>
<image name="bluetooth_book" width="167" height="167"/>
</resources>
</document>
+3 -3
View File
@@ -9,7 +9,7 @@
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>Shuichi-Tsutsumi.${PRODUCT_NAME:rfc1034identifier}</string>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
@@ -24,6 +24,8 @@
<string>1.0</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>Launch Screen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
@@ -33,8 +35,6 @@
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>
+47 -28
View File
@@ -9,21 +9,23 @@
#import "ViewController.h"
#import "PulsingHaloLayer.h"
#import "MultiplePulsingHaloLayer.h"
#define kMaxRadius 160
#define kMaxRadius 200
#define kMaxDuration 10
@interface ViewController ()
@property (nonatomic, weak) MultiplePulsingHaloLayer *mutiHalo;
@property (nonatomic, weak) PulsingHaloLayer *halo;
@property (nonatomic, weak) IBOutlet UIImageView *beaconView;
@property (nonatomic, weak) IBOutlet UIImageView *beaconViewMuti;
@property (nonatomic, weak) IBOutlet UISlider *countSlider;
@property (nonatomic, weak) IBOutlet UISlider *radiusSlider;
@property (nonatomic, weak) IBOutlet UISlider *durationSlider;
@property (nonatomic, weak) IBOutlet UISlider *rSlider;
@property (nonatomic, weak) IBOutlet UISlider *gSlider;
@property (nonatomic, weak) IBOutlet UISlider *bSlider;
@property (nonatomic, weak) IBOutlet UILabel *countLabel;
@property (nonatomic, weak) IBOutlet UILabel *radiusLabel;
@property (nonatomic, weak) IBOutlet UILabel *durationLabel;
@property (nonatomic, weak) IBOutlet UILabel *rLabel;
@property (nonatomic, weak) IBOutlet UILabel *gLabel;
@property (nonatomic, weak) IBOutlet UILabel *bLabel;
@@ -35,29 +37,27 @@
- (void)viewDidLoad
{
[super viewDidLoad];
///setup single halo layer
// basic setup
PulsingHaloLayer *layer = [PulsingHaloLayer layer];
self.halo = layer;
self.halo.position = self.beaconView.center;
[self.view.layer insertSublayer:self.halo below:self.beaconView.layer];
///setup multiple halo layer
//you can specify the number of halos by initial method or by instance property "haloLayerNumber"
MultiplePulsingHaloLayer *multiLayer = [[MultiplePulsingHaloLayer alloc] initWithHaloLayerNum:3 andStartInterval:1];
self.mutiHalo = multiLayer;
self.mutiHalo.position = self.beaconViewMuti.center;
self.mutiHalo.useTimingFunction = NO;
[self.mutiHalo buildSublayers];
[self.view.layer insertSublayer:self.mutiHalo below:self.beaconViewMuti.layer];
[self.beaconView.superview.layer insertSublayer:self.halo below:self.beaconView.layer];
[self setupInitialValues];
[self.halo start];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
self.halo.position = self.beaconView.center;
}
@@ -65,13 +65,19 @@
#pragma mark - Private
- (void)setupInitialValues {
self.countSlider.value = 5;
[self countChanged:nil];
self.radiusSlider.value = 0.5;
self.radiusSlider.value = 0.7;
[self radiusChanged:nil];
self.rSlider.value = 0;
self.gSlider.value = 0.487;
self.bSlider.value = 1.0;
self.durationSlider.value = 0.5;
[self durationChanged:nil];
self.rSlider.value = 0.;
self.gSlider.value = 0.455;
self.bSlider.value = 0.756;
[self colorChanged:nil];
}
@@ -79,12 +85,26 @@
// =============================================================================
#pragma mark - IBAction
- (IBAction)countChanged:(UISlider *)sender {
//you can specify the number of halos by initial method or by instance property "haloLayerNumber"
float value = floor(self.countSlider.value);
self.halo.haloLayerNumber = value;
self.countLabel.text = [@(value) stringValue];
}
- (IBAction)radiusChanged:(UISlider *)sender {
self.mutiHalo.radius = self.radiusSlider.value * kMaxRadius;
self.halo.radius = self.radiusSlider.value * kMaxRadius;
self.radiusLabel.text = [@(self.radiusSlider.value) stringValue];
self.radiusLabel.text = [NSString stringWithFormat:@"%.0f", self.radiusSlider.value * kMaxRadius];
}
- (IBAction)durationChanged:(UISlider *)sender {
self.halo.animationDuration = self.durationSlider.value * kMaxDuration;
self.durationLabel.text = [NSString stringWithFormat:@"%.1f", self.durationSlider.value * kMaxDuration];
}
- (IBAction)colorChanged:(UISlider *)sender {
@@ -94,12 +114,11 @@
blue:self.bSlider.value
alpha:1.0];
[self.mutiHalo setHaloLayerColor:color.CGColor];
[self.halo setBackgroundColor:color.CGColor];
self.rLabel.text = [@(self.rSlider.value) stringValue];
self.gLabel.text = [@(self.gSlider.value) stringValue];
self.bLabel.text = [@(self.bSlider.value) stringValue];
self.rLabel.text = [NSString stringWithFormat:@"%.2f", self.rSlider.value];
self.gLabel.text = [NSString stringWithFormat:@"%.2f", self.gSlider.value];
self.bLabel.text = [NSString stringWithFormat:@"%.2f", self.bSlider.value];
}
@end
@@ -7,7 +7,7 @@
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>Shuichi-Tsutsumi.${PRODUCT_NAME:rfc1034identifier}</string>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
+95 -48
View File
@@ -1,100 +1,147 @@
PulsingHalo
===========
iOS Component For Creating A Pulsing Animation. It allows you to create single halo or multiple halos.
**PulsingHalo has been discontinued, and is no longer being maintained.** Please check out **[Pulsator](https://github.com/shu223/Pulsator)** which is the new version of this written with Swift.
![](http://f.cl.ly/items/2Q0X052p2m371m0w2O0C/halogif.gif "single halo | multiple halos")
[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)
[![Badge w/ Version](http://cocoapod-badges.herokuapp.com/v/PulsingHalo/badge.png)](http://cocoadocs.org/docsets/PulsingHalo)
[![License](http://img.shields.io/badge/license-MIT-lightgrey.svg?style=flat
)](http://mit-license.org)
iOS component for creating a pulsing animation. It allows you to create halos.
![](demo_.gif)
Great For:
- **Beacons for iBeacon**
- **Pulses of beacons (iBeacon)**
- Map Annotations
##How to use
## Installation
1. Add PulsingHaloLayer.h,m into your project
2. Initiate and add to your view.
### CocoaPods
####Single halo
````
Add into your Podfile.
```
pod "PulsingHalo"
```
Then `$ pod install`
### Carthage
Add into your Cartfile.
```
github "shu223/PulsingHalo"
```
Then `$ carthage update`
### Manual
Add PulsingHaloLayer.h,m into your project.
## How to use
Just **initiate and add** to your view layer.
### Swift
```swift
let halo = PulsingHaloLayer()
halo.position = view.center
view.layer.addSublayer(halo)
halo.start()
```
### Objective-C
```objc
PulsingHaloLayer *halo = [PulsingHaloLayer layer];
halo.position = self.view.center;
[self.view.layer addSublayer:halo];
````
####Multiple halos
````
//you can specify the number of halos by initial method or by instance property "haloLayerNumber"
MultiplePulsingHaloLayer *multiLayer = [[MultiplePulsingHaloLayer alloc] initWithHaloLayerNum:3 andStartInterval:1];
multiLayer.position = self.view.center;
[multiLayer buildSublayers];
[self.view.layer addSublayer:multiLayer];
````
##Install with CocoaPods
Add Podfile.
````
pod "PulsingHalo"
````
And
````
$ pod install
````
[halo start];
```
##Customization
###radius
## Customizations
### Number of Halos
Use `haloLayerNumber` property.
```objc
halo.haloLayerNumber = 3;
```
### radius
Use `radius` property.
````
```objc
self.halo.radius = 240.0;
````
```
###color
### color
Use `backgroundColor` property.
````
```objc
UIColor *color = [UIColor colorWithRed:0.7
green:0.9
blue:0.3
alpha:1.0];
self.halo.backgroundColor = color.CGColor;
````
```
###animation duration
### animation duration
Use `animationDuration` or `pulseInterval` property.
###animation repeat count
### animation repeat count
Initialize using `initWithRepeatCount:` method, or set `repeatCount` property. The default value is `INFINITY`.
###animation key values and times
### animation key values and times
Use properties `fromValueForRadius`, `fromValueForAlpha` and `keyTimeForHalfOpacity`.
Use properties `fromValueForRadius` or `keyTimeForHalfOpacity`.
### enable/disable timing function for animation
###enable/disable timing function for animation
Use property `useTimingFunction`
##Demo
## Demo
You can try to change the radius and color properties with demo app.
![](http://f.cl.ly/items/0u3c211i2g372c390p44/halodemo.jpg)
##Special Thanks
## Special Thanks
Inspired by [SVPulsingAnnotationView](https://github.com/samvermette/SVPulsingAnnotationView).
## Author
**Shuichi Tsutsumi**
iOS freelancer in Japan. Welcome works from abroad!
<a href="https://paypal.me/shu223">
<img alt="Support via PayPal" src="https://cdn.rawgit.com/twolfson/paypal-github-button/1.0.0/dist/button.svg"/>
</a>
- PAST WORKS: [My Profile Summary](https://medium.com/@shu223/my-profile-summary-f14bfc1e7099#.vdh0i7clr)
- PROFILES: [LinkedIn](https://www.linkedin.com/in/shuichi-tsutsumi-525b755b/)
- BLOG: [English](https://medium.com/@shu223/) / [Japanese](http://d.hatena.ne.jp/shu223/)
- CONTACTS:
- [Twitter](https://twitter.com/shu223)
- [Facebook](https://www.facebook.com/shuichi.tsutsumi)
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB