├── 心形雷达波纹.gif ├── README.md └── Radarcorrugated ├── Radarcorrugated.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── yunxiang.xcuserdatad │ │ └── UserInterfaceState.xcuserstate ├── xcuserdata │ └── yunxiang.xcuserdatad │ │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ └── Radarcorrugated.xcscheme └── project.pbxproj ├── Radarcorrugated ├── heartView.h ├── ViewController.h ├── AppDelegate.h ├── main.m ├── ViewController.m ├── Assets.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── Info.plist ├── Base.lproj │ ├── Main.storyboard │ └── LaunchScreen.storyboard ├── AppDelegate.m └── heartView.m ├── RadarcorrugatedTests ├── Info.plist └── RadarcorrugatedTests.m └── RadarcorrugatedUITests ├── Info.plist └── RadarcorrugatedUITests.m /心形雷达波纹.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shuaishuaihenan/Heart-shapedRadarCorrugated/HEAD/心形雷达波纹.gif -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Heart-shapedRadarCorrugated 2 | Heart-shaped radar corrugated Demo 3 | ![image](https://github.com/shuaishuaihenan/Heart-shapedRadarCorrugated/blob/master/%E5%BF%83%E5%BD%A2%E9%9B%B7%E8%BE%BE%E6%B3%A2%E7%BA%B9.gif) 4 | # 用法 5 | 导入头文件 #import "heartView.h" 即可 6 | -------------------------------------------------------------------------------- /Radarcorrugated/Radarcorrugated.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Radarcorrugated/Radarcorrugated.xcodeproj/project.xcworkspace/xcuserdata/yunxiang.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shuaishuaihenan/Heart-shapedRadarCorrugated/HEAD/Radarcorrugated/Radarcorrugated.xcodeproj/project.xcworkspace/xcuserdata/yunxiang.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Radarcorrugated/Radarcorrugated/heartView.h: -------------------------------------------------------------------------------- 1 | // 2 | // heartView.h 3 | // fitness 4 | // 5 | // Created by 李帅 on 2016/11/23. 6 | // Copyright © 2016年 YunXiang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface heartView : UIView 12 | 13 | - (void)animate:(BOOL)animate; 14 | @end 15 | -------------------------------------------------------------------------------- /Radarcorrugated/Radarcorrugated/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // Radarcorrugated 4 | // 5 | // Created by yunxiang on 2017/8/29. 6 | // Copyright © 2017年 yunxiang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /Radarcorrugated/Radarcorrugated/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // Radarcorrugated 4 | // 5 | // Created by yunxiang on 2017/8/29. 6 | // Copyright © 2017年 yunxiang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /Radarcorrugated/Radarcorrugated/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // Radarcorrugated 4 | // 5 | // Created by yunxiang on 2017/8/29. 6 | // Copyright © 2017年 yunxiang. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Radarcorrugated/RadarcorrugatedTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Radarcorrugated/RadarcorrugatedUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Radarcorrugated/Radarcorrugated.xcodeproj/xcuserdata/yunxiang.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Radarcorrugated.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | D63B59CD1F550A4300209225 16 | 17 | primary 18 | 19 | 20 | D63B59E61F550A4300209225 21 | 22 | primary 23 | 24 | 25 | D63B59F11F550A4300209225 26 | 27 | primary 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /Radarcorrugated/RadarcorrugatedTests/RadarcorrugatedTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // RadarcorrugatedTests.m 3 | // RadarcorrugatedTests 4 | // 5 | // Created by yunxiang on 2017/8/29. 6 | // Copyright © 2017年 yunxiang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface RadarcorrugatedTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation RadarcorrugatedTests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | // Put setup code here. This method is called before the invocation of each test method in the class. 20 | } 21 | 22 | - (void)tearDown { 23 | // Put teardown code here. This method is called after the invocation of each test method in the class. 24 | [super tearDown]; 25 | } 26 | 27 | - (void)testExample { 28 | // This is an example of a functional test case. 29 | // Use XCTAssert and related functions to verify your tests produce the correct results. 30 | } 31 | 32 | - (void)testPerformanceExample { 33 | // This is an example of a performance test case. 34 | [self measureBlock:^{ 35 | // Put the code you want to measure the time of here. 36 | }]; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /Radarcorrugated/Radarcorrugated/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // Radarcorrugated 4 | // 5 | // Created by yunxiang on 2017/8/29. 6 | // Copyright © 2017年 yunxiang. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | #import "heartView.h" 11 | @interface ViewController () 12 | 13 | @end 14 | 15 | @implementation ViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | 20 | UIView *backgroundView = [[UIView alloc]initWithFrame:CGRectMake(0, 200, self.view.frame.size.width, self.view.frame.size.width)]; 21 | backgroundView.backgroundColor = [UIColor whiteColor]; 22 | [self.view addSubview:backgroundView]; 23 | 24 | 25 | heartView *radarView = [[heartView alloc]initWithFrame:CGRectMake((self.view.frame.size.width - 80)/2,0, 80, 80)]; 26 | radarView.backgroundColor = [UIColor clearColor]; 27 | [radarView animate:YES]; 28 | [backgroundView addSubview:radarView]; 29 | 30 | // Do any additional setup after loading the view, typically from a nib. 31 | } 32 | 33 | 34 | - (void)didReceiveMemoryWarning { 35 | [super didReceiveMemoryWarning]; 36 | // Dispose of any resources that can be recreated. 37 | } 38 | 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /Radarcorrugated/Radarcorrugated/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "ipad", 35 | "size" : "29x29", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "29x29", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "40x40", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "40x40", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "76x76", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "76x76", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /Radarcorrugated/RadarcorrugatedUITests/RadarcorrugatedUITests.m: -------------------------------------------------------------------------------- 1 | // 2 | // RadarcorrugatedUITests.m 3 | // RadarcorrugatedUITests 4 | // 5 | // Created by yunxiang on 2017/8/29. 6 | // Copyright © 2017年 yunxiang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface RadarcorrugatedUITests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation RadarcorrugatedUITests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | 22 | // In UI tests it is usually best to stop immediately when a failure occurs. 23 | self.continueAfterFailure = NO; 24 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. 25 | [[[XCUIApplication alloc] init] launch]; 26 | 27 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 28 | } 29 | 30 | - (void)tearDown { 31 | // Put teardown code here. This method is called after the invocation of each test method in the class. 32 | [super tearDown]; 33 | } 34 | 35 | - (void)testExample { 36 | // Use recording to get started writing UI tests. 37 | // Use XCTAssert and related functions to verify your tests produce the correct results. 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /Radarcorrugated/Radarcorrugated/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | Radar corrugated 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /Radarcorrugated/Radarcorrugated/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Radarcorrugated/Radarcorrugated/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Radarcorrugated/Radarcorrugated/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // Radarcorrugated 4 | // 5 | // Created by yunxiang on 2017/8/29. 6 | // Copyright © 2017年 yunxiang. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | // Override point for customization after application launch. 20 | return YES; 21 | } 22 | 23 | 24 | - (void)applicationWillResignActive:(UIApplication *)application { 25 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 26 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 27 | } 28 | 29 | 30 | - (void)applicationDidEnterBackground:(UIApplication *)application { 31 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 32 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 33 | } 34 | 35 | 36 | - (void)applicationWillEnterForeground:(UIApplication *)application { 37 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 38 | } 39 | 40 | 41 | - (void)applicationDidBecomeActive:(UIApplication *)application { 42 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 43 | } 44 | 45 | 46 | - (void)applicationWillTerminate:(UIApplication *)application { 47 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 48 | } 49 | 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /Radarcorrugated/Radarcorrugated.xcodeproj/xcuserdata/yunxiang.xcuserdatad/xcschemes/Radarcorrugated.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 43 | 49 | 50 | 51 | 52 | 53 | 59 | 60 | 61 | 62 | 63 | 64 | 74 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 95 | 101 | 102 | 103 | 104 | 106 | 107 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /Radarcorrugated/Radarcorrugated/heartView.m: -------------------------------------------------------------------------------- 1 | // 2 | // heartView.m 3 | // fitness 4 | // 5 | // Created by 李帅 on 2016/11/23. 6 | // Copyright © 2016年 YunXiang. All rights reserved. 7 | // 8 | 9 | #import "heartView.h" 10 | 11 | @interface heartView() 12 | { 13 | NSTimer *_timer;//定时器 14 | BOOL isStart; 15 | } 16 | @property (nonatomic,strong) CAShapeLayer *shapeLayer; 17 | @property (nonatomic,weak)CALayer * animationLayer; 18 | @end 19 | 20 | @implementation heartView 21 | - (instancetype)initWithFrame:(CGRect)frame 22 | { 23 | self = [super initWithFrame:frame]; 24 | if (self) { 25 | [self customView]; 26 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resumes) name:UIApplicationDidBecomeActiveNotification object:nil]; 27 | } 28 | return self; 29 | } 30 | - (void)resumes{ 31 | 32 | if (self.animationLayer) { 33 | [self.animationLayer removeFromSuperlayer]; 34 | [self setNeedsDisplay]; 35 | } 36 | } 37 | -(void)dealloc{ 38 | [[NSNotificationCenter defaultCenter]removeObserver:self]; 39 | } 40 | - (void)customView 41 | { 42 | CGFloat endAngle = M_PI_4; 43 | CGFloat radius = MIN(self.bounds.size.width * 0.25, self.bounds.size.height * 0.5) - 10; 44 | CGPoint center1 = CGPointMake(self.bounds.size.width * 0.5 + radius, self.bounds.size.height * 0.35); 45 | CGPoint center2 = CGPointMake(self.bounds.size.width * 0.5 - radius, self.bounds.size.height * 0.35); 46 | UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center1 radius:radius startAngle:-M_PI endAngle:endAngle clockwise:1]; 47 | [path addLineToPoint:CGPointMake(center1.x - radius, center1.y + radius * tan((M_PI - endAngle)*0.5))]; 48 | [path addArcWithCenter:center2 radius:radius startAngle:M_PI - endAngle endAngle:0 clockwise:1]; 49 | [path addClip]; 50 | [path setLineWidth:1]; 51 | [path setLineCapStyle:kCGLineCapRound]; 52 | [[UIColor clearColor] setStroke]; 53 | [path stroke]; 54 | 55 | self.shapeLayer = [CAShapeLayer layer]; 56 | self.shapeLayer.frame = CGRectMake(0, 0, self.frame.size.width/2, self.frame.size.height/2);//设置shapeLayer的尺寸和位置 57 | self.shapeLayer.fillColor = [[UIColor redColor] colorWithAlphaComponent:1].CGColor;//填充颜色为ClearColor 58 | //设置线条的宽度和颜色 59 | // self.shapeLayer.lineWidth = 1.0f; 60 | self.shapeLayer.strokeColor = [UIColor clearColor].CGColor; 61 | //让贝塞尔曲线与CAShapeLayer产生联系 62 | self.shapeLayer.path = path.CGPath; 63 | //添加并显示 64 | [self.layer addSublayer:self.shapeLayer]; 65 | } 66 | - (void)animate:(BOOL)animate 67 | { 68 | isStart = animate; 69 | if (animate) { 70 | if (!_timer) { 71 | _timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(reDraw:) userInfo:nil repeats:NO] ; 72 | }else{ 73 | [_timer invalidate]; 74 | _timer = nil; 75 | [self.animationLayer removeFromSuperlayer]; 76 | _timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(reDraw:) userInfo:nil repeats:NO] ; 77 | } 78 | }else{ 79 | [_timer invalidate]; 80 | _timer = nil; 81 | [self.animationLayer removeFromSuperlayer]; 82 | 83 | } 84 | } 85 | - (void)reDraw:(NSTimer*)t 86 | { 87 | [self.animationLayer removeFromSuperlayer]; 88 | [self setNeedsDisplay]; 89 | } 90 | // Only override drawRect: if you perform custom drawing. 91 | // An empty implementation adversely affects performance during animation. 92 | - (void)drawRect:(CGRect)rect { 93 | // Drawing code 94 | if (isStart) { 95 | [[UIColor clearColor] setFill]; 96 | UIRectFill(rect); 97 | NSInteger pulsingCount = 2;//雷达上波纹的条数 98 | double animationDuration = 3;//一组动画持续的时间,直接决定了动画运行快慢。 99 | 100 | CALayer * animationLayer = [[CALayer alloc]init]; 101 | self.animationLayer = animationLayer; 102 | for (int i = 0; i < pulsingCount; i++) { 103 | CGFloat endAngle = M_PI_4; 104 | CGFloat radius = MIN(self.bounds.size.width * 0.4, self.bounds.size.height * 0.5) ; 105 | CGPoint center1 = CGPointMake(self.bounds.size.width * 0.5 + radius, self.bounds.size.height * 0.1 ); 106 | CGPoint center2 = CGPointMake(self.bounds.size.width * 0.5 - radius, self.bounds.size.height * 0.1 ); 107 | UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center1 radius:radius startAngle:-M_PI endAngle:endAngle clockwise:1]; 108 | [path addLineToPoint:CGPointMake(center1.x - radius, center1.y + radius * tan((M_PI - endAngle)*0.5))]; 109 | [path addArcWithCenter:center2 radius:radius startAngle:M_PI - endAngle endAngle:0 clockwise:1]; 110 | [path addClip]; 111 | [path setLineWidth:1]; 112 | [path setLineCapStyle:kCGLineCapRound]; 113 | // 设置描边色 114 | [[UIColor clearColor] setStroke]; 115 | // 设置填充色 116 | // [[UIColor colorWithHex:0XFE6969] setFill]; 117 | [path stroke]; 118 | 119 | CAShapeLayer *shaperLayer = [CAShapeLayer layer]; 120 | shaperLayer.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);//设置shapeLayer的尺寸和位置 121 | 122 | shaperLayer.fillColor = [[UIColor redColor] colorWithAlphaComponent:1].CGColor;//填充颜色为ClearColor 123 | //设置线条的宽度和颜色 124 | // self.shapeLayer.lineWidth = 1.0f; 125 | shaperLayer.strokeColor = [UIColor clearColor].CGColor; 126 | //让贝塞尔曲线与CAShapeLayer产生联系 127 | shaperLayer.path = path.CGPath; 128 | 129 | CAMediaTimingFunction * defaultCurve = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 130 | 131 | CAAnimationGroup * animationGroup = [[CAAnimationGroup alloc]init]; 132 | animationGroup.fillMode = kCAFillModeBoth; 133 | //因为雷达中每个圈圈的大小不一致,故需要他们在一定的相位差的时刻开始运行。 134 | animationGroup.beginTime = CACurrentMediaTime() + (double)i * animationDuration/(double)pulsingCount; 135 | animationGroup.duration = animationDuration;//每个圈圈从生成到消失使用时常,也即动画组每轮动画持续时常 136 | animationGroup.repeatCount = HUGE_VAL;//表示动画组持续时间为无限大,也即动画无限循环。 137 | animationGroup.timingFunction = defaultCurve; 138 | 139 | //雷达圆圈初始大小以及最终大小比率。 140 | CABasicAnimation * scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 141 | scaleAnimation.autoreverses = NO; 142 | scaleAnimation.fromValue = [NSNumber numberWithDouble:0.35]; 143 | scaleAnimation.toValue = [NSNumber numberWithDouble:1.0]; 144 | 145 | //雷达圆圈在n个运行阶段的透明度,n为数组长度。 146 | CAKeyframeAnimation * opacityAnimation = [CAKeyframeAnimation animationWithKeyPath:@"opacity"]; 147 | //雷达运行四个阶段不同的透明度。 148 | opacityAnimation.values = @[[NSNumber numberWithDouble:1.0],[NSNumber numberWithDouble:0.5],[NSNumber numberWithDouble:0.3],[NSNumber numberWithDouble:0.0]]; 149 | //雷达运行的不同的四个阶段,为0.0表示刚运行,0.5表示运行了一半,1.0表示运行结束。 150 | opacityAnimation.keyTimes = @[[NSNumber numberWithDouble:0.0],[NSNumber numberWithDouble:0.25],[NSNumber numberWithDouble:0.5],[NSNumber numberWithDouble:1.0]]; 151 | //将两组动画(大小比率变化动画,透明度渐变动画)组合到一个动画组。 152 | animationGroup.animations = @[scaleAnimation,opacityAnimation]; 153 | 154 | [shaperLayer addAnimation:animationGroup forKey:@"pulsing"]; 155 | [animationLayer addSublayer:shaperLayer]; 156 | } 157 | [self.layer addSublayer:self.animationLayer]; 158 | //以下部分为雷达中心的图。雷达圈圈也是从该图中心发出。 159 | CALayer * thumbnailLayer = [[CALayer alloc]init]; 160 | thumbnailLayer.backgroundColor = [UIColor whiteColor].CGColor; 161 | CGRect thumbnailRect = CGRectMake(0, 0, 0, 0); 162 | thumbnailLayer.frame = thumbnailRect; 163 | thumbnailLayer.masksToBounds = YES; 164 | thumbnailLayer.borderColor = [UIColor whiteColor].CGColor; 165 | [self.layer addSublayer:thumbnailLayer]; 166 | } 167 | 168 | } 169 | 170 | 171 | @end 172 | -------------------------------------------------------------------------------- /Radarcorrugated/Radarcorrugated.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | D63B59D31F550A4300209225 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D63B59D21F550A4300209225 /* main.m */; }; 11 | D63B59D61F550A4300209225 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D63B59D51F550A4300209225 /* AppDelegate.m */; }; 12 | D63B59D91F550A4300209225 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D63B59D81F550A4300209225 /* ViewController.m */; }; 13 | D63B59DC1F550A4300209225 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D63B59DA1F550A4300209225 /* Main.storyboard */; }; 14 | D63B59DE1F550A4300209225 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D63B59DD1F550A4300209225 /* Assets.xcassets */; }; 15 | D63B59E11F550A4300209225 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D63B59DF1F550A4300209225 /* LaunchScreen.storyboard */; }; 16 | D63B59EC1F550A4300209225 /* RadarcorrugatedTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D63B59EB1F550A4300209225 /* RadarcorrugatedTests.m */; }; 17 | D63B59F71F550A4300209225 /* RadarcorrugatedUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = D63B59F61F550A4300209225 /* RadarcorrugatedUITests.m */; }; 18 | D63B5A071F550A8900209225 /* heartView.m in Sources */ = {isa = PBXBuildFile; fileRef = D63B5A061F550A8900209225 /* heartView.m */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | D63B59E81F550A4300209225 /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = D63B59C61F550A4300209225 /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = D63B59CD1F550A4300209225; 27 | remoteInfo = Radarcorrugated; 28 | }; 29 | D63B59F31F550A4300209225 /* PBXContainerItemProxy */ = { 30 | isa = PBXContainerItemProxy; 31 | containerPortal = D63B59C61F550A4300209225 /* Project object */; 32 | proxyType = 1; 33 | remoteGlobalIDString = D63B59CD1F550A4300209225; 34 | remoteInfo = Radarcorrugated; 35 | }; 36 | /* End PBXContainerItemProxy section */ 37 | 38 | /* Begin PBXFileReference section */ 39 | D63B59CE1F550A4300209225 /* Radarcorrugated.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Radarcorrugated.app; sourceTree = BUILT_PRODUCTS_DIR; }; 40 | D63B59D21F550A4300209225 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 41 | D63B59D41F550A4300209225 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 42 | D63B59D51F550A4300209225 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 43 | D63B59D71F550A4300209225 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 44 | D63B59D81F550A4300209225 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 45 | D63B59DB1F550A4300209225 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 46 | D63B59DD1F550A4300209225 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 47 | D63B59E01F550A4300209225 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 48 | D63B59E21F550A4300209225 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 49 | D63B59E71F550A4300209225 /* RadarcorrugatedTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RadarcorrugatedTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 50 | D63B59EB1F550A4300209225 /* RadarcorrugatedTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RadarcorrugatedTests.m; sourceTree = ""; }; 51 | D63B59ED1F550A4300209225 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 52 | D63B59F21F550A4300209225 /* RadarcorrugatedUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RadarcorrugatedUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 53 | D63B59F61F550A4300209225 /* RadarcorrugatedUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RadarcorrugatedUITests.m; sourceTree = ""; }; 54 | D63B59F81F550A4300209225 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 55 | D63B5A051F550A8900209225 /* heartView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = heartView.h; sourceTree = ""; }; 56 | D63B5A061F550A8900209225 /* heartView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = heartView.m; sourceTree = ""; }; 57 | /* End PBXFileReference section */ 58 | 59 | /* Begin PBXFrameworksBuildPhase section */ 60 | D63B59CB1F550A4300209225 /* Frameworks */ = { 61 | isa = PBXFrameworksBuildPhase; 62 | buildActionMask = 2147483647; 63 | files = ( 64 | ); 65 | runOnlyForDeploymentPostprocessing = 0; 66 | }; 67 | D63B59E41F550A4300209225 /* Frameworks */ = { 68 | isa = PBXFrameworksBuildPhase; 69 | buildActionMask = 2147483647; 70 | files = ( 71 | ); 72 | runOnlyForDeploymentPostprocessing = 0; 73 | }; 74 | D63B59EF1F550A4300209225 /* Frameworks */ = { 75 | isa = PBXFrameworksBuildPhase; 76 | buildActionMask = 2147483647; 77 | files = ( 78 | ); 79 | runOnlyForDeploymentPostprocessing = 0; 80 | }; 81 | /* End PBXFrameworksBuildPhase section */ 82 | 83 | /* Begin PBXGroup section */ 84 | D63B59C51F550A4300209225 = { 85 | isa = PBXGroup; 86 | children = ( 87 | D63B59D01F550A4300209225 /* Radarcorrugated */, 88 | D63B59EA1F550A4300209225 /* RadarcorrugatedTests */, 89 | D63B59F51F550A4300209225 /* RadarcorrugatedUITests */, 90 | D63B59CF1F550A4300209225 /* Products */, 91 | ); 92 | sourceTree = ""; 93 | }; 94 | D63B59CF1F550A4300209225 /* Products */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | D63B59CE1F550A4300209225 /* Radarcorrugated.app */, 98 | D63B59E71F550A4300209225 /* RadarcorrugatedTests.xctest */, 99 | D63B59F21F550A4300209225 /* RadarcorrugatedUITests.xctest */, 100 | ); 101 | name = Products; 102 | sourceTree = ""; 103 | }; 104 | D63B59D01F550A4300209225 /* Radarcorrugated */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | D63B5A041F550A7800209225 /* RadarView */, 108 | D63B59D41F550A4300209225 /* AppDelegate.h */, 109 | D63B59D51F550A4300209225 /* AppDelegate.m */, 110 | D63B59D71F550A4300209225 /* ViewController.h */, 111 | D63B59D81F550A4300209225 /* ViewController.m */, 112 | D63B59DA1F550A4300209225 /* Main.storyboard */, 113 | D63B59DD1F550A4300209225 /* Assets.xcassets */, 114 | D63B59DF1F550A4300209225 /* LaunchScreen.storyboard */, 115 | D63B59E21F550A4300209225 /* Info.plist */, 116 | D63B59D11F550A4300209225 /* Supporting Files */, 117 | ); 118 | path = Radarcorrugated; 119 | sourceTree = ""; 120 | }; 121 | D63B59D11F550A4300209225 /* Supporting Files */ = { 122 | isa = PBXGroup; 123 | children = ( 124 | D63B59D21F550A4300209225 /* main.m */, 125 | ); 126 | name = "Supporting Files"; 127 | sourceTree = ""; 128 | }; 129 | D63B59EA1F550A4300209225 /* RadarcorrugatedTests */ = { 130 | isa = PBXGroup; 131 | children = ( 132 | D63B59EB1F550A4300209225 /* RadarcorrugatedTests.m */, 133 | D63B59ED1F550A4300209225 /* Info.plist */, 134 | ); 135 | path = RadarcorrugatedTests; 136 | sourceTree = ""; 137 | }; 138 | D63B59F51F550A4300209225 /* RadarcorrugatedUITests */ = { 139 | isa = PBXGroup; 140 | children = ( 141 | D63B59F61F550A4300209225 /* RadarcorrugatedUITests.m */, 142 | D63B59F81F550A4300209225 /* Info.plist */, 143 | ); 144 | path = RadarcorrugatedUITests; 145 | sourceTree = ""; 146 | }; 147 | D63B5A041F550A7800209225 /* RadarView */ = { 148 | isa = PBXGroup; 149 | children = ( 150 | D63B5A051F550A8900209225 /* heartView.h */, 151 | D63B5A061F550A8900209225 /* heartView.m */, 152 | ); 153 | name = RadarView; 154 | sourceTree = ""; 155 | }; 156 | /* End PBXGroup section */ 157 | 158 | /* Begin PBXNativeTarget section */ 159 | D63B59CD1F550A4300209225 /* Radarcorrugated */ = { 160 | isa = PBXNativeTarget; 161 | buildConfigurationList = D63B59FB1F550A4300209225 /* Build configuration list for PBXNativeTarget "Radarcorrugated" */; 162 | buildPhases = ( 163 | D63B59CA1F550A4300209225 /* Sources */, 164 | D63B59CB1F550A4300209225 /* Frameworks */, 165 | D63B59CC1F550A4300209225 /* Resources */, 166 | ); 167 | buildRules = ( 168 | ); 169 | dependencies = ( 170 | ); 171 | name = Radarcorrugated; 172 | productName = Radarcorrugated; 173 | productReference = D63B59CE1F550A4300209225 /* Radarcorrugated.app */; 174 | productType = "com.apple.product-type.application"; 175 | }; 176 | D63B59E61F550A4300209225 /* RadarcorrugatedTests */ = { 177 | isa = PBXNativeTarget; 178 | buildConfigurationList = D63B59FE1F550A4300209225 /* Build configuration list for PBXNativeTarget "RadarcorrugatedTests" */; 179 | buildPhases = ( 180 | D63B59E31F550A4300209225 /* Sources */, 181 | D63B59E41F550A4300209225 /* Frameworks */, 182 | D63B59E51F550A4300209225 /* Resources */, 183 | ); 184 | buildRules = ( 185 | ); 186 | dependencies = ( 187 | D63B59E91F550A4300209225 /* PBXTargetDependency */, 188 | ); 189 | name = RadarcorrugatedTests; 190 | productName = RadarcorrugatedTests; 191 | productReference = D63B59E71F550A4300209225 /* RadarcorrugatedTests.xctest */; 192 | productType = "com.apple.product-type.bundle.unit-test"; 193 | }; 194 | D63B59F11F550A4300209225 /* RadarcorrugatedUITests */ = { 195 | isa = PBXNativeTarget; 196 | buildConfigurationList = D63B5A011F550A4300209225 /* Build configuration list for PBXNativeTarget "RadarcorrugatedUITests" */; 197 | buildPhases = ( 198 | D63B59EE1F550A4300209225 /* Sources */, 199 | D63B59EF1F550A4300209225 /* Frameworks */, 200 | D63B59F01F550A4300209225 /* Resources */, 201 | ); 202 | buildRules = ( 203 | ); 204 | dependencies = ( 205 | D63B59F41F550A4300209225 /* PBXTargetDependency */, 206 | ); 207 | name = RadarcorrugatedUITests; 208 | productName = RadarcorrugatedUITests; 209 | productReference = D63B59F21F550A4300209225 /* RadarcorrugatedUITests.xctest */; 210 | productType = "com.apple.product-type.bundle.ui-testing"; 211 | }; 212 | /* End PBXNativeTarget section */ 213 | 214 | /* Begin PBXProject section */ 215 | D63B59C61F550A4300209225 /* Project object */ = { 216 | isa = PBXProject; 217 | attributes = { 218 | LastUpgradeCheck = 0830; 219 | ORGANIZATIONNAME = yunxiang; 220 | TargetAttributes = { 221 | D63B59CD1F550A4300209225 = { 222 | CreatedOnToolsVersion = 8.3.3; 223 | DevelopmentTeam = J4N9H827FQ; 224 | ProvisioningStyle = Manual; 225 | }; 226 | D63B59E61F550A4300209225 = { 227 | CreatedOnToolsVersion = 8.3.3; 228 | ProvisioningStyle = Automatic; 229 | TestTargetID = D63B59CD1F550A4300209225; 230 | }; 231 | D63B59F11F550A4300209225 = { 232 | CreatedOnToolsVersion = 8.3.3; 233 | ProvisioningStyle = Automatic; 234 | TestTargetID = D63B59CD1F550A4300209225; 235 | }; 236 | }; 237 | }; 238 | buildConfigurationList = D63B59C91F550A4300209225 /* Build configuration list for PBXProject "Radarcorrugated" */; 239 | compatibilityVersion = "Xcode 3.2"; 240 | developmentRegion = English; 241 | hasScannedForEncodings = 0; 242 | knownRegions = ( 243 | en, 244 | Base, 245 | ); 246 | mainGroup = D63B59C51F550A4300209225; 247 | productRefGroup = D63B59CF1F550A4300209225 /* Products */; 248 | projectDirPath = ""; 249 | projectRoot = ""; 250 | targets = ( 251 | D63B59CD1F550A4300209225 /* Radarcorrugated */, 252 | D63B59E61F550A4300209225 /* RadarcorrugatedTests */, 253 | D63B59F11F550A4300209225 /* RadarcorrugatedUITests */, 254 | ); 255 | }; 256 | /* End PBXProject section */ 257 | 258 | /* Begin PBXResourcesBuildPhase section */ 259 | D63B59CC1F550A4300209225 /* Resources */ = { 260 | isa = PBXResourcesBuildPhase; 261 | buildActionMask = 2147483647; 262 | files = ( 263 | D63B59E11F550A4300209225 /* LaunchScreen.storyboard in Resources */, 264 | D63B59DE1F550A4300209225 /* Assets.xcassets in Resources */, 265 | D63B59DC1F550A4300209225 /* Main.storyboard in Resources */, 266 | ); 267 | runOnlyForDeploymentPostprocessing = 0; 268 | }; 269 | D63B59E51F550A4300209225 /* Resources */ = { 270 | isa = PBXResourcesBuildPhase; 271 | buildActionMask = 2147483647; 272 | files = ( 273 | ); 274 | runOnlyForDeploymentPostprocessing = 0; 275 | }; 276 | D63B59F01F550A4300209225 /* Resources */ = { 277 | isa = PBXResourcesBuildPhase; 278 | buildActionMask = 2147483647; 279 | files = ( 280 | ); 281 | runOnlyForDeploymentPostprocessing = 0; 282 | }; 283 | /* End PBXResourcesBuildPhase section */ 284 | 285 | /* Begin PBXSourcesBuildPhase section */ 286 | D63B59CA1F550A4300209225 /* Sources */ = { 287 | isa = PBXSourcesBuildPhase; 288 | buildActionMask = 2147483647; 289 | files = ( 290 | D63B59D91F550A4300209225 /* ViewController.m in Sources */, 291 | D63B5A071F550A8900209225 /* heartView.m in Sources */, 292 | D63B59D61F550A4300209225 /* AppDelegate.m in Sources */, 293 | D63B59D31F550A4300209225 /* main.m in Sources */, 294 | ); 295 | runOnlyForDeploymentPostprocessing = 0; 296 | }; 297 | D63B59E31F550A4300209225 /* Sources */ = { 298 | isa = PBXSourcesBuildPhase; 299 | buildActionMask = 2147483647; 300 | files = ( 301 | D63B59EC1F550A4300209225 /* RadarcorrugatedTests.m in Sources */, 302 | ); 303 | runOnlyForDeploymentPostprocessing = 0; 304 | }; 305 | D63B59EE1F550A4300209225 /* Sources */ = { 306 | isa = PBXSourcesBuildPhase; 307 | buildActionMask = 2147483647; 308 | files = ( 309 | D63B59F71F550A4300209225 /* RadarcorrugatedUITests.m in Sources */, 310 | ); 311 | runOnlyForDeploymentPostprocessing = 0; 312 | }; 313 | /* End PBXSourcesBuildPhase section */ 314 | 315 | /* Begin PBXTargetDependency section */ 316 | D63B59E91F550A4300209225 /* PBXTargetDependency */ = { 317 | isa = PBXTargetDependency; 318 | target = D63B59CD1F550A4300209225 /* Radarcorrugated */; 319 | targetProxy = D63B59E81F550A4300209225 /* PBXContainerItemProxy */; 320 | }; 321 | D63B59F41F550A4300209225 /* PBXTargetDependency */ = { 322 | isa = PBXTargetDependency; 323 | target = D63B59CD1F550A4300209225 /* Radarcorrugated */; 324 | targetProxy = D63B59F31F550A4300209225 /* PBXContainerItemProxy */; 325 | }; 326 | /* End PBXTargetDependency section */ 327 | 328 | /* Begin PBXVariantGroup section */ 329 | D63B59DA1F550A4300209225 /* Main.storyboard */ = { 330 | isa = PBXVariantGroup; 331 | children = ( 332 | D63B59DB1F550A4300209225 /* Base */, 333 | ); 334 | name = Main.storyboard; 335 | sourceTree = ""; 336 | }; 337 | D63B59DF1F550A4300209225 /* LaunchScreen.storyboard */ = { 338 | isa = PBXVariantGroup; 339 | children = ( 340 | D63B59E01F550A4300209225 /* Base */, 341 | ); 342 | name = LaunchScreen.storyboard; 343 | sourceTree = ""; 344 | }; 345 | /* End PBXVariantGroup section */ 346 | 347 | /* Begin XCBuildConfiguration section */ 348 | D63B59F91F550A4300209225 /* Debug */ = { 349 | isa = XCBuildConfiguration; 350 | buildSettings = { 351 | ALWAYS_SEARCH_USER_PATHS = NO; 352 | CLANG_ANALYZER_NONNULL = YES; 353 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 354 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 355 | CLANG_CXX_LIBRARY = "libc++"; 356 | CLANG_ENABLE_MODULES = YES; 357 | CLANG_ENABLE_OBJC_ARC = YES; 358 | CLANG_WARN_BOOL_CONVERSION = YES; 359 | CLANG_WARN_CONSTANT_CONVERSION = YES; 360 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 361 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 362 | CLANG_WARN_EMPTY_BODY = YES; 363 | CLANG_WARN_ENUM_CONVERSION = YES; 364 | CLANG_WARN_INFINITE_RECURSION = YES; 365 | CLANG_WARN_INT_CONVERSION = YES; 366 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 367 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 368 | CLANG_WARN_UNREACHABLE_CODE = YES; 369 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 370 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 371 | COPY_PHASE_STRIP = NO; 372 | DEBUG_INFORMATION_FORMAT = dwarf; 373 | ENABLE_STRICT_OBJC_MSGSEND = YES; 374 | ENABLE_TESTABILITY = YES; 375 | GCC_C_LANGUAGE_STANDARD = gnu99; 376 | GCC_DYNAMIC_NO_PIC = NO; 377 | GCC_NO_COMMON_BLOCKS = YES; 378 | GCC_OPTIMIZATION_LEVEL = 0; 379 | GCC_PREPROCESSOR_DEFINITIONS = ( 380 | "DEBUG=1", 381 | "$(inherited)", 382 | ); 383 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 384 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 385 | GCC_WARN_UNDECLARED_SELECTOR = YES; 386 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 387 | GCC_WARN_UNUSED_FUNCTION = YES; 388 | GCC_WARN_UNUSED_VARIABLE = YES; 389 | IPHONEOS_DEPLOYMENT_TARGET = 10.3; 390 | MTL_ENABLE_DEBUG_INFO = YES; 391 | ONLY_ACTIVE_ARCH = YES; 392 | SDKROOT = iphoneos; 393 | TARGETED_DEVICE_FAMILY = "1,2"; 394 | }; 395 | name = Debug; 396 | }; 397 | D63B59FA1F550A4300209225 /* Release */ = { 398 | isa = XCBuildConfiguration; 399 | buildSettings = { 400 | ALWAYS_SEARCH_USER_PATHS = NO; 401 | CLANG_ANALYZER_NONNULL = YES; 402 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 403 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 404 | CLANG_CXX_LIBRARY = "libc++"; 405 | CLANG_ENABLE_MODULES = YES; 406 | CLANG_ENABLE_OBJC_ARC = YES; 407 | CLANG_WARN_BOOL_CONVERSION = YES; 408 | CLANG_WARN_CONSTANT_CONVERSION = YES; 409 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 410 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 411 | CLANG_WARN_EMPTY_BODY = YES; 412 | CLANG_WARN_ENUM_CONVERSION = YES; 413 | CLANG_WARN_INFINITE_RECURSION = YES; 414 | CLANG_WARN_INT_CONVERSION = YES; 415 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 416 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 417 | CLANG_WARN_UNREACHABLE_CODE = YES; 418 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 419 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 420 | COPY_PHASE_STRIP = NO; 421 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 422 | ENABLE_NS_ASSERTIONS = NO; 423 | ENABLE_STRICT_OBJC_MSGSEND = YES; 424 | GCC_C_LANGUAGE_STANDARD = gnu99; 425 | GCC_NO_COMMON_BLOCKS = YES; 426 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 427 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 428 | GCC_WARN_UNDECLARED_SELECTOR = YES; 429 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 430 | GCC_WARN_UNUSED_FUNCTION = YES; 431 | GCC_WARN_UNUSED_VARIABLE = YES; 432 | IPHONEOS_DEPLOYMENT_TARGET = 10.3; 433 | MTL_ENABLE_DEBUG_INFO = NO; 434 | SDKROOT = iphoneos; 435 | TARGETED_DEVICE_FAMILY = "1,2"; 436 | VALIDATE_PRODUCT = YES; 437 | }; 438 | name = Release; 439 | }; 440 | D63B59FC1F550A4300209225 /* Debug */ = { 441 | isa = XCBuildConfiguration; 442 | buildSettings = { 443 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 444 | DEVELOPMENT_TEAM = J4N9H827FQ; 445 | INFOPLIST_FILE = Radarcorrugated/Info.plist; 446 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 447 | PRODUCT_BUNDLE_IDENTIFIER = com.yunxiang.Radarcorrugated; 448 | PRODUCT_NAME = "$(TARGET_NAME)"; 449 | PROVISIONING_PROFILE = "949d9e5b-6586-48cd-8f13-3d51c913c0bb"; 450 | PROVISIONING_PROFILE_SPECIFIER = mySelfTongyong; 451 | }; 452 | name = Debug; 453 | }; 454 | D63B59FD1F550A4300209225 /* Release */ = { 455 | isa = XCBuildConfiguration; 456 | buildSettings = { 457 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 458 | DEVELOPMENT_TEAM = J4N9H827FQ; 459 | INFOPLIST_FILE = Radarcorrugated/Info.plist; 460 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 461 | PRODUCT_BUNDLE_IDENTIFIER = com.yunxiang.Radarcorrugated; 462 | PRODUCT_NAME = "$(TARGET_NAME)"; 463 | PROVISIONING_PROFILE = "949d9e5b-6586-48cd-8f13-3d51c913c0bb"; 464 | PROVISIONING_PROFILE_SPECIFIER = mySelfTongyong; 465 | }; 466 | name = Release; 467 | }; 468 | D63B59FF1F550A4300209225 /* Debug */ = { 469 | isa = XCBuildConfiguration; 470 | buildSettings = { 471 | BUNDLE_LOADER = "$(TEST_HOST)"; 472 | INFOPLIST_FILE = RadarcorrugatedTests/Info.plist; 473 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 474 | PRODUCT_BUNDLE_IDENTIFIER = com.yunxiang.RadarcorrugatedTests; 475 | PRODUCT_NAME = "$(TARGET_NAME)"; 476 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Radarcorrugated.app/Radarcorrugated"; 477 | }; 478 | name = Debug; 479 | }; 480 | D63B5A001F550A4300209225 /* Release */ = { 481 | isa = XCBuildConfiguration; 482 | buildSettings = { 483 | BUNDLE_LOADER = "$(TEST_HOST)"; 484 | INFOPLIST_FILE = RadarcorrugatedTests/Info.plist; 485 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 486 | PRODUCT_BUNDLE_IDENTIFIER = com.yunxiang.RadarcorrugatedTests; 487 | PRODUCT_NAME = "$(TARGET_NAME)"; 488 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Radarcorrugated.app/Radarcorrugated"; 489 | }; 490 | name = Release; 491 | }; 492 | D63B5A021F550A4300209225 /* Debug */ = { 493 | isa = XCBuildConfiguration; 494 | buildSettings = { 495 | INFOPLIST_FILE = RadarcorrugatedUITests/Info.plist; 496 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 497 | PRODUCT_BUNDLE_IDENTIFIER = com.yunxiang.RadarcorrugatedUITests; 498 | PRODUCT_NAME = "$(TARGET_NAME)"; 499 | TEST_TARGET_NAME = Radarcorrugated; 500 | }; 501 | name = Debug; 502 | }; 503 | D63B5A031F550A4300209225 /* Release */ = { 504 | isa = XCBuildConfiguration; 505 | buildSettings = { 506 | INFOPLIST_FILE = RadarcorrugatedUITests/Info.plist; 507 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 508 | PRODUCT_BUNDLE_IDENTIFIER = com.yunxiang.RadarcorrugatedUITests; 509 | PRODUCT_NAME = "$(TARGET_NAME)"; 510 | TEST_TARGET_NAME = Radarcorrugated; 511 | }; 512 | name = Release; 513 | }; 514 | /* End XCBuildConfiguration section */ 515 | 516 | /* Begin XCConfigurationList section */ 517 | D63B59C91F550A4300209225 /* Build configuration list for PBXProject "Radarcorrugated" */ = { 518 | isa = XCConfigurationList; 519 | buildConfigurations = ( 520 | D63B59F91F550A4300209225 /* Debug */, 521 | D63B59FA1F550A4300209225 /* Release */, 522 | ); 523 | defaultConfigurationIsVisible = 0; 524 | defaultConfigurationName = Release; 525 | }; 526 | D63B59FB1F550A4300209225 /* Build configuration list for PBXNativeTarget "Radarcorrugated" */ = { 527 | isa = XCConfigurationList; 528 | buildConfigurations = ( 529 | D63B59FC1F550A4300209225 /* Debug */, 530 | D63B59FD1F550A4300209225 /* Release */, 531 | ); 532 | defaultConfigurationIsVisible = 0; 533 | }; 534 | D63B59FE1F550A4300209225 /* Build configuration list for PBXNativeTarget "RadarcorrugatedTests" */ = { 535 | isa = XCConfigurationList; 536 | buildConfigurations = ( 537 | D63B59FF1F550A4300209225 /* Debug */, 538 | D63B5A001F550A4300209225 /* Release */, 539 | ); 540 | defaultConfigurationIsVisible = 0; 541 | }; 542 | D63B5A011F550A4300209225 /* Build configuration list for PBXNativeTarget "RadarcorrugatedUITests" */ = { 543 | isa = XCConfigurationList; 544 | buildConfigurations = ( 545 | D63B5A021F550A4300209225 /* Debug */, 546 | D63B5A031F550A4300209225 /* Release */, 547 | ); 548 | defaultConfigurationIsVisible = 0; 549 | }; 550 | /* End XCConfigurationList section */ 551 | }; 552 | rootObject = D63B59C61F550A4300209225 /* Project object */; 553 | } 554 | --------------------------------------------------------------------------------