├── Podfile.lock ├── Pods ├── FXBlurView │ ├── FXBlurView │ │ ├── FXBlurView.h │ │ └── FXBlurView.m │ ├── LICENCE.md │ └── README.md ├── Headers │ ├── Private │ │ └── FXBlurView │ │ │ └── FXBlurView.h │ └── Public │ │ └── FXBlurView │ │ └── FXBlurView.h ├── Manifest.lock ├── Pods.xcodeproj │ ├── project.pbxproj │ └── xcuserdata │ │ └── andezhou.xcuserdatad │ │ └── xcschemes │ │ ├── Pods-FXBlurView.xcscheme │ │ ├── Pods.xcscheme │ │ └── xcschememanagement.plist └── Target Support Files │ ├── Pods-FXBlurView │ ├── Pods-FXBlurView-Private.xcconfig │ ├── Pods-FXBlurView-dummy.m │ ├── Pods-FXBlurView-prefix.pch │ └── Pods-FXBlurView.xcconfig │ └── Pods │ ├── Pods-acknowledgements.markdown │ ├── Pods-acknowledgements.plist │ ├── Pods-dummy.m │ ├── Pods-environment.h │ ├── Pods-resources.sh │ ├── Pods.debug.xcconfig │ └── Pods.release.xcconfig ├── README.md ├── TLCollectionViewLineLayout-Demo.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── xcuserdata │ └── andezhou.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ ├── TLCollectionViewLineLayout-Demo.xcscheme │ └── xcschememanagement.plist ├── TLCollectionViewLineLayout-Demo.xcworkspace ├── contents.xcworkspacedata ├── xcshareddata │ └── TLCollectionViewLineLayout-Demo.xccheckout └── xcuserdata │ └── andezhou.xcuserdatad │ ├── UserInterfaceState.xcuserstate │ └── xcdebugger │ └── Breakpoints_v2.xcbkptlist ├── TLCollectionViewLineLayout-Demo ├── AppDelegate.h ├── AppDelegate.m ├── Base.lproj │ ├── LaunchScreen.xib │ └── Main.storyboard ├── Images.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── Info.plist ├── TLCollectionViewCell.h ├── TLCollectionViewCell.m ├── TLCollectionViewController.h ├── TLCollectionViewController.m ├── TLCollectionViewLineLayout.h ├── TLCollectionViewLineLayout.m ├── bg0.jpg ├── bg1.jpg ├── bg2.jpg └── main.m ├── TLCollectionViewLineLayout-DemoTests ├── Info.plist └── TLCollectionViewLineLayout_DemoTests.m └── podfile /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - FXBlurView (1.6.3) 3 | 4 | DEPENDENCIES: 5 | - FXBlurView 6 | 7 | SPEC CHECKSUMS: 8 | FXBlurView: c6d23f3d35af2c6282296a2930f61c6e2c788d01 9 | 10 | COCOAPODS: 0.37.2 11 | -------------------------------------------------------------------------------- /Pods/FXBlurView/FXBlurView/FXBlurView.h: -------------------------------------------------------------------------------- 1 | // 2 | // FXBlurView.h 3 | // 4 | // Version 1.6.3 5 | // 6 | // Created by Nick Lockwood on 25/08/2013. 7 | // Copyright (c) 2013 Charcoal Design 8 | // 9 | // Distributed under the permissive zlib License 10 | // Get the latest version from here: 11 | // 12 | // https://github.com/nicklockwood/FXBlurView 13 | // 14 | // This software is provided 'as-is', without any express or implied 15 | // warranty. In no event will the authors be held liable for any damages 16 | // arising from the use of this software. 17 | // 18 | // Permission is granted to anyone to use this software for any purpose, 19 | // including commercial applications, and to alter it and redistribute it 20 | // freely, subject to the following restrictions: 21 | // 22 | // 1. The origin of this software must not be misrepresented; you must not 23 | // claim that you wrote the original software. If you use this software 24 | // in a product, an acknowledgment in the product documentation would be 25 | // appreciated but is not required. 26 | // 27 | // 2. Altered source versions must be plainly marked as such, and must not be 28 | // misrepresented as being the original software. 29 | // 30 | // 3. This notice may not be removed or altered from any source distribution. 31 | // 32 | 33 | 34 | #import 35 | #import 36 | #import 37 | 38 | 39 | #pragma GCC diagnostic push 40 | #pragma GCC diagnostic ignored "-Wobjc-missing-property-synthesis" 41 | 42 | 43 | #import 44 | #undef weak_ref 45 | #if __has_feature(objc_arc) && __has_feature(objc_arc_weak) 46 | #define weak_ref weak 47 | #else 48 | #define weak_ref unsafe_unretained 49 | #endif 50 | 51 | 52 | @interface UIImage (FXBlurView) 53 | 54 | - (UIImage *)blurredImageWithRadius:(CGFloat)radius iterations:(NSUInteger)iterations tintColor:(UIColor *)tintColor; 55 | 56 | @end 57 | 58 | 59 | @interface FXBlurView : UIView 60 | 61 | + (void)setBlurEnabled:(BOOL)blurEnabled; 62 | + (void)setUpdatesEnabled; 63 | + (void)setUpdatesDisabled; 64 | 65 | @property (nonatomic, getter = isBlurEnabled) BOOL blurEnabled; 66 | @property (nonatomic, getter = isDynamic) BOOL dynamic; 67 | @property (nonatomic, assign) NSUInteger iterations; 68 | @property (nonatomic, assign) NSTimeInterval updateInterval; 69 | @property (nonatomic, assign) CGFloat blurRadius; 70 | @property (nonatomic, strong) UIColor *tintColor; 71 | @property (nonatomic, weak_ref) IBOutlet UIView *underlyingView; 72 | 73 | - (void)updateAsynchronously:(BOOL)async completion:(void (^)())completion; 74 | 75 | @end 76 | 77 | 78 | #pragma GCC diagnostic pop 79 | 80 | -------------------------------------------------------------------------------- /Pods/FXBlurView/FXBlurView/FXBlurView.m: -------------------------------------------------------------------------------- 1 | // 2 | // FXBlurView.m 3 | // 4 | // Version 1.6.3 5 | // 6 | // Created by Nick Lockwood on 25/08/2013. 7 | // Copyright (c) 2013 Charcoal Design 8 | // 9 | // Distributed under the permissive zlib License 10 | // Get the latest version from here: 11 | // 12 | // https://github.com/nicklockwood/FXBlurView 13 | // 14 | // This software is provided 'as-is', without any express or implied 15 | // warranty. In no event will the authors be held liable for any damages 16 | // arising from the use of this software. 17 | // 18 | // Permission is granted to anyone to use this software for any purpose, 19 | // including commercial applications, and to alter it and redistribute it 20 | // freely, subject to the following restrictions: 21 | // 22 | // 1. The origin of this software must not be misrepresented; you must not 23 | // claim that you wrote the original software. If you use this software 24 | // in a product, an acknowledgment in the product documentation would be 25 | // appreciated but is not required. 26 | // 27 | // 2. Altered source versions must be plainly marked as such, and must not be 28 | // misrepresented as being the original software. 29 | // 30 | // 3. This notice may not be removed or altered from any source distribution. 31 | // 32 | 33 | 34 | #import "FXBlurView.h" 35 | #import 36 | 37 | 38 | #pragma GCC diagnostic ignored "-Wobjc-missing-property-synthesis" 39 | #pragma GCC diagnostic ignored "-Wdirect-ivar-access" 40 | #pragma GCC diagnostic ignored "-Wgnu" 41 | 42 | 43 | #import 44 | #if !__has_feature(objc_arc) 45 | #error This class requires automatic reference counting 46 | #endif 47 | 48 | 49 | @implementation UIImage (FXBlurView) 50 | 51 | - (UIImage *)blurredImageWithRadius:(CGFloat)radius iterations:(NSUInteger)iterations tintColor:(UIColor *)tintColor 52 | { 53 | //image must be nonzero size 54 | if (floorf(self.size.width) * floorf(self.size.height) <= 0.0f) return self; 55 | 56 | //boxsize must be an odd integer 57 | uint32_t boxSize = (uint32_t)(radius * self.scale); 58 | if (boxSize % 2 == 0) boxSize ++; 59 | 60 | //create image buffers 61 | CGImageRef imageRef = self.CGImage; 62 | vImage_Buffer buffer1, buffer2; 63 | buffer1.width = buffer2.width = CGImageGetWidth(imageRef); 64 | buffer1.height = buffer2.height = CGImageGetHeight(imageRef); 65 | buffer1.rowBytes = buffer2.rowBytes = CGImageGetBytesPerRow(imageRef); 66 | size_t bytes = buffer1.rowBytes * buffer1.height; 67 | buffer1.data = malloc(bytes); 68 | buffer2.data = malloc(bytes); 69 | 70 | //create temp buffer 71 | void *tempBuffer = malloc((size_t)vImageBoxConvolve_ARGB8888(&buffer1, &buffer2, NULL, 0, 0, boxSize, boxSize, 72 | NULL, kvImageEdgeExtend + kvImageGetTempBufferSize)); 73 | 74 | //copy image data 75 | CFDataRef dataSource = CGDataProviderCopyData(CGImageGetDataProvider(imageRef)); 76 | memcpy(buffer1.data, CFDataGetBytePtr(dataSource), bytes); 77 | CFRelease(dataSource); 78 | 79 | for (NSUInteger i = 0; i < iterations; i++) 80 | { 81 | //perform blur 82 | vImageBoxConvolve_ARGB8888(&buffer1, &buffer2, tempBuffer, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend); 83 | 84 | //swap buffers 85 | void *temp = buffer1.data; 86 | buffer1.data = buffer2.data; 87 | buffer2.data = temp; 88 | } 89 | 90 | //free buffers 91 | free(buffer2.data); 92 | free(tempBuffer); 93 | 94 | //create image context from buffer 95 | CGContextRef ctx = CGBitmapContextCreate(buffer1.data, buffer1.width, buffer1.height, 96 | 8, buffer1.rowBytes, CGImageGetColorSpace(imageRef), 97 | CGImageGetBitmapInfo(imageRef)); 98 | 99 | //apply tint 100 | if (tintColor && CGColorGetAlpha(tintColor.CGColor) > 0.0f) 101 | { 102 | CGContextSetFillColorWithColor(ctx, [tintColor colorWithAlphaComponent:0.25].CGColor); 103 | CGContextSetBlendMode(ctx, kCGBlendModePlusLighter); 104 | CGContextFillRect(ctx, CGRectMake(0, 0, buffer1.width, buffer1.height)); 105 | } 106 | 107 | //create image from context 108 | imageRef = CGBitmapContextCreateImage(ctx); 109 | UIImage *image = [UIImage imageWithCGImage:imageRef scale:self.scale orientation:self.imageOrientation]; 110 | CGImageRelease(imageRef); 111 | CGContextRelease(ctx); 112 | free(buffer1.data); 113 | return image; 114 | } 115 | 116 | @end 117 | 118 | 119 | @interface FXBlurScheduler : NSObject 120 | 121 | @property (nonatomic, strong) NSMutableArray *views; 122 | @property (nonatomic, assign) NSUInteger viewIndex; 123 | @property (nonatomic, assign) NSUInteger updatesEnabled; 124 | @property (nonatomic, assign) BOOL blurEnabled; 125 | @property (nonatomic, assign) BOOL updating; 126 | 127 | @end 128 | 129 | 130 | @interface FXBlurLayer: CALayer 131 | 132 | @property (nonatomic, assign) CGFloat blurRadius; 133 | 134 | @end 135 | 136 | 137 | @implementation FXBlurLayer 138 | 139 | @dynamic blurRadius; 140 | 141 | + (BOOL)needsDisplayForKey:(NSString *)key 142 | { 143 | if ([@[@"blurRadius", @"bounds", @"position"] containsObject:key]) 144 | { 145 | return YES; 146 | } 147 | return [super needsDisplayForKey:key]; 148 | } 149 | 150 | @end 151 | 152 | 153 | @interface FXBlurView () 154 | 155 | @property (nonatomic, assign) BOOL iterationsSet; 156 | @property (nonatomic, assign) BOOL blurRadiusSet; 157 | @property (nonatomic, assign) BOOL dynamicSet; 158 | @property (nonatomic, assign) BOOL blurEnabledSet; 159 | @property (nonatomic, strong) NSDate *lastUpdate; 160 | 161 | - (UIImage *)snapshotOfUnderlyingView; 162 | - (BOOL)shouldUpdate; 163 | 164 | @end 165 | 166 | 167 | @implementation FXBlurScheduler 168 | 169 | + (instancetype)sharedInstance 170 | { 171 | static FXBlurScheduler *sharedInstance = nil; 172 | if (!sharedInstance) 173 | { 174 | sharedInstance = [[FXBlurScheduler alloc] init]; 175 | } 176 | return sharedInstance; 177 | } 178 | 179 | - (instancetype)init 180 | { 181 | if ((self = [super init])) 182 | { 183 | _updatesEnabled = 1; 184 | _blurEnabled = YES; 185 | _views = [[NSMutableArray alloc] init]; 186 | } 187 | return self; 188 | } 189 | 190 | - (void)setBlurEnabled:(BOOL)blurEnabled 191 | { 192 | _blurEnabled = blurEnabled; 193 | if (blurEnabled) 194 | { 195 | for (FXBlurView *view in self.views) 196 | { 197 | [view setNeedsDisplay]; 198 | } 199 | [self updateAsynchronously]; 200 | } 201 | } 202 | 203 | - (void)setUpdatesEnabled 204 | { 205 | _updatesEnabled ++; 206 | [self updateAsynchronously]; 207 | } 208 | 209 | - (void)setUpdatesDisabled 210 | { 211 | _updatesEnabled --; 212 | } 213 | 214 | - (void)addView:(FXBlurView *)view 215 | { 216 | if (![self.views containsObject:view]) 217 | { 218 | [self.views addObject:view]; 219 | [self updateAsynchronously]; 220 | } 221 | } 222 | 223 | - (void)removeView:(FXBlurView *)view 224 | { 225 | NSUInteger index = [self.views indexOfObject:view]; 226 | if (index != NSNotFound) 227 | { 228 | if (index <= self.viewIndex) 229 | { 230 | self.viewIndex --; 231 | } 232 | [self.views removeObjectAtIndex:index]; 233 | } 234 | } 235 | 236 | - (void)updateAsynchronously 237 | { 238 | if (self.blurEnabled && !self.updating && self.updatesEnabled > 0 && [self.views count]) 239 | { 240 | NSTimeInterval timeUntilNextUpdate = 1.0 / 60; 241 | 242 | //loop through until we find a view that's ready to be drawn 243 | self.viewIndex = self.viewIndex % [self.views count]; 244 | for (NSUInteger i = self.viewIndex; i < [self.views count]; i++) 245 | { 246 | FXBlurView *view = self.views[i]; 247 | if (view.dynamic && !view.hidden && view.window && [view shouldUpdate]) 248 | { 249 | NSTimeInterval nextUpdate = [view.lastUpdate timeIntervalSinceNow] + view.updateInterval; 250 | if (!view.lastUpdate || nextUpdate <= 0) 251 | { 252 | self.updating = YES; 253 | [view updateAsynchronously:YES completion:^{ 254 | 255 | //render next view 256 | self.updating = NO; 257 | self.viewIndex = i + 1; 258 | [self updateAsynchronously]; 259 | }]; 260 | return; 261 | } 262 | else 263 | { 264 | timeUntilNextUpdate = MIN(timeUntilNextUpdate, nextUpdate); 265 | } 266 | } 267 | } 268 | 269 | //try again, delaying until the time when the next view needs an update. 270 | self.viewIndex = 0; 271 | [self performSelector:@selector(updateAsynchronously) 272 | withObject:nil 273 | afterDelay:timeUntilNextUpdate 274 | inModes:@[NSDefaultRunLoopMode, UITrackingRunLoopMode]]; 275 | } 276 | } 277 | 278 | @end 279 | 280 | 281 | @implementation FXBlurView 282 | 283 | + (void)setBlurEnabled:(BOOL)blurEnabled 284 | { 285 | [FXBlurScheduler sharedInstance].blurEnabled = blurEnabled; 286 | } 287 | 288 | + (void)setUpdatesEnabled 289 | { 290 | [[FXBlurScheduler sharedInstance] setUpdatesEnabled]; 291 | } 292 | 293 | + (void)setUpdatesDisabled 294 | { 295 | [[FXBlurScheduler sharedInstance] setUpdatesDisabled]; 296 | } 297 | 298 | + (Class)layerClass 299 | { 300 | return [FXBlurLayer class]; 301 | } 302 | 303 | - (void)setUp 304 | { 305 | if (!_iterationsSet) _iterations = 3; 306 | if (!_blurRadiusSet) [self blurLayer].blurRadius = 40; 307 | if (!_dynamicSet) _dynamic = YES; 308 | if (!_blurEnabledSet) _blurEnabled = YES; 309 | self.updateInterval = _updateInterval; 310 | self.layer.magnificationFilter = @"linear"; // kCAFilterLinear 311 | 312 | unsigned int numberOfMethods; 313 | Method *methods = class_copyMethodList([UIView class], &numberOfMethods); 314 | for (unsigned int i = 0; i < numberOfMethods; i++) 315 | { 316 | Method method = methods[i]; 317 | SEL selector = method_getName(method); 318 | if (selector == @selector(tintColor)) 319 | { 320 | _tintColor = ((id (*)(id,SEL))method_getImplementation(method))(self, selector); 321 | break; 322 | } 323 | } 324 | free(methods); 325 | } 326 | 327 | - (id)initWithFrame:(CGRect)frame 328 | { 329 | if ((self = [super initWithFrame:frame])) 330 | { 331 | [self setUp]; 332 | self.clipsToBounds = YES; 333 | } 334 | return self; 335 | } 336 | 337 | - (id)initWithCoder:(NSCoder *)aDecoder 338 | { 339 | if ((self = [super initWithCoder:aDecoder])) 340 | { 341 | [self setUp]; 342 | } 343 | return self; 344 | } 345 | 346 | - (void)dealloc 347 | { 348 | [[NSNotificationCenter defaultCenter] removeObserver:self]; 349 | } 350 | 351 | - (void)setIterations:(NSUInteger)iterations 352 | { 353 | _iterationsSet = YES; 354 | _iterations = iterations; 355 | [self setNeedsDisplay]; 356 | } 357 | 358 | - (void)setBlurRadius:(CGFloat)blurRadius 359 | { 360 | _blurRadiusSet = YES; 361 | [self blurLayer].blurRadius = blurRadius; 362 | } 363 | 364 | - (CGFloat)blurRadius 365 | { 366 | return [self blurLayer].blurRadius; 367 | } 368 | 369 | - (void)setBlurEnabled:(BOOL)blurEnabled 370 | { 371 | _blurEnabledSet = YES; 372 | if (_blurEnabled != blurEnabled) 373 | { 374 | _blurEnabled = blurEnabled; 375 | [self schedule]; 376 | if (_blurEnabled) 377 | { 378 | [self setNeedsDisplay]; 379 | } 380 | } 381 | } 382 | 383 | - (void)setDynamic:(BOOL)dynamic 384 | { 385 | _dynamicSet = YES; 386 | if (_dynamic != dynamic) 387 | { 388 | _dynamic = dynamic; 389 | [self schedule]; 390 | if (!dynamic) 391 | { 392 | [self setNeedsDisplay]; 393 | } 394 | } 395 | } 396 | 397 | - (UIView *)underlyingView 398 | { 399 | return _underlyingView ?: self.superview; 400 | } 401 | 402 | - (CALayer *)underlyingLayer 403 | { 404 | return self.underlyingView.layer; 405 | } 406 | 407 | - (FXBlurLayer *)blurLayer 408 | { 409 | return (FXBlurLayer *)self.layer; 410 | } 411 | 412 | - (FXBlurLayer *)blurPresentationLayer 413 | { 414 | FXBlurLayer *blurLayer = [self blurLayer]; 415 | return (FXBlurLayer *)blurLayer.presentationLayer ?: blurLayer; 416 | } 417 | 418 | - (void)setUpdateInterval:(NSTimeInterval)updateInterval 419 | { 420 | _updateInterval = updateInterval; 421 | if (_updateInterval <= 0) _updateInterval = 1.0/60; 422 | } 423 | 424 | - (void)setTintColor:(UIColor *)tintColor 425 | { 426 | _tintColor = tintColor; 427 | [self setNeedsDisplay]; 428 | } 429 | 430 | - (void)didMoveToSuperview 431 | { 432 | [super didMoveToSuperview]; 433 | [self.layer setNeedsDisplay]; 434 | } 435 | 436 | - (void)didMoveToWindow 437 | { 438 | [super didMoveToWindow]; 439 | [self schedule]; 440 | } 441 | 442 | - (void)schedule 443 | { 444 | if (self.window && self.dynamic && self.blurEnabled) 445 | { 446 | [[FXBlurScheduler sharedInstance] addView:self]; 447 | } 448 | else 449 | { 450 | [[FXBlurScheduler sharedInstance] removeView:self]; 451 | } 452 | } 453 | 454 | - (void)setNeedsDisplay 455 | { 456 | [super setNeedsDisplay]; 457 | [self.layer setNeedsDisplay]; 458 | } 459 | 460 | - (BOOL)shouldUpdate 461 | { 462 | __strong CALayer *underlyingLayer = [self underlyingLayer]; 463 | 464 | return 465 | underlyingLayer && !underlyingLayer.hidden && 466 | self.blurEnabled && [FXBlurScheduler sharedInstance].blurEnabled && 467 | !CGRectIsEmpty([self.layer.presentationLayer ?: self.layer bounds]) && !CGRectIsEmpty(underlyingLayer.bounds); 468 | } 469 | 470 | - (void)displayLayer:(__unused CALayer *)layer 471 | { 472 | [self updateAsynchronously:NO completion:NULL]; 473 | } 474 | 475 | - (id)actionForLayer:(CALayer *)layer forKey:(NSString *)key 476 | { 477 | if ([key isEqualToString:@"blurRadius"]) 478 | { 479 | //animations are enabled 480 | CAAnimation *action = (CAAnimation *)[super actionForLayer:layer forKey:@"backgroundColor"]; 481 | if ((NSNull *)action != [NSNull null]) 482 | { 483 | CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:key]; 484 | animation.fromValue = [layer.presentationLayer valueForKey:key]; 485 | 486 | //CAMediatiming attributes 487 | animation.beginTime = action.beginTime; 488 | animation.duration = action.duration; 489 | animation.speed = action.speed; 490 | animation.timeOffset = action.timeOffset; 491 | animation.repeatCount = action.repeatCount; 492 | animation.repeatDuration = action.repeatDuration; 493 | animation.autoreverses = action.autoreverses; 494 | animation.fillMode = action.fillMode; 495 | 496 | //CAAnimation attributes 497 | animation.timingFunction = action.timingFunction; 498 | animation.delegate = action.delegate; 499 | 500 | return animation; 501 | } 502 | } 503 | return [super actionForLayer:layer forKey:key]; 504 | } 505 | 506 | - (UIImage *)snapshotOfUnderlyingView 507 | { 508 | __strong FXBlurLayer *blurLayer = [self blurPresentationLayer]; 509 | __strong CALayer *underlyingLayer = [self underlyingLayer]; 510 | CGRect bounds = [blurLayer convertRect:blurLayer.bounds toLayer:underlyingLayer]; 511 | 512 | self.lastUpdate = [NSDate date]; 513 | CGFloat scale = 0.5; 514 | if (self.iterations) 515 | { 516 | CGFloat blockSize = 12.0f/self.iterations; 517 | scale = blockSize/MAX(blockSize * 2, blurLayer.blurRadius); 518 | scale = 1.0f/floorf(1.0f/scale); 519 | } 520 | CGSize size = bounds.size; 521 | if (self.contentMode == UIViewContentModeScaleToFill || 522 | self.contentMode == UIViewContentModeScaleAspectFill || 523 | self.contentMode == UIViewContentModeScaleAspectFit || 524 | self.contentMode == UIViewContentModeRedraw) 525 | { 526 | //prevents edge artefacts 527 | size.width = floorf(size.width * scale) / scale; 528 | size.height = floorf(size.height * scale) / scale; 529 | } 530 | else if ([[UIDevice currentDevice].systemVersion floatValue] < 7.0f && [UIScreen mainScreen].scale == 1.0f) 531 | { 532 | //prevents pixelation on old devices 533 | scale = 1.0f; 534 | } 535 | UIGraphicsBeginImageContextWithOptions(size, NO, scale); 536 | CGContextRef context = UIGraphicsGetCurrentContext(); 537 | CGContextTranslateCTM(context, -bounds.origin.x, -bounds.origin.y); 538 | 539 | NSArray *hiddenViews = [self prepareUnderlyingViewForSnapshot]; 540 | [underlyingLayer renderInContext:context]; 541 | [self restoreSuperviewAfterSnapshot:hiddenViews]; 542 | UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext(); 543 | UIGraphicsEndImageContext(); 544 | return snapshot; 545 | } 546 | 547 | - (NSArray *)prepareUnderlyingViewForSnapshot 548 | { 549 | __strong CALayer *blurlayer = [self blurLayer]; 550 | __strong CALayer *underlyingLayer = [self underlyingLayer]; 551 | while (blurlayer.superlayer && blurlayer.superlayer != underlyingLayer) 552 | { 553 | blurlayer = blurlayer.superlayer; 554 | } 555 | NSMutableArray *layers = [NSMutableArray array]; 556 | NSUInteger index = [underlyingLayer.sublayers indexOfObject:blurlayer]; 557 | if (index != NSNotFound) 558 | { 559 | for (NSUInteger i = index; i < [underlyingLayer.sublayers count]; i++) 560 | { 561 | CALayer *layer = underlyingLayer.sublayers[i]; 562 | if (!layer.hidden) 563 | { 564 | layer.hidden = YES; 565 | [layers addObject:layer]; 566 | } 567 | } 568 | } 569 | return layers; 570 | } 571 | 572 | - (void)restoreSuperviewAfterSnapshot:(NSArray *)hiddenLayers 573 | { 574 | for (CALayer *layer in hiddenLayers) 575 | { 576 | layer.hidden = NO; 577 | } 578 | } 579 | 580 | - (UIImage *)blurredSnapshot:(UIImage *)snapshot radius:(CGFloat)blurRadius 581 | { 582 | return [snapshot blurredImageWithRadius:blurRadius 583 | iterations:self.iterations 584 | tintColor:self.tintColor]; 585 | } 586 | 587 | - (void)setLayerContents:(UIImage *)image 588 | { 589 | self.layer.contents = (id)image.CGImage; 590 | self.layer.contentsScale = image.scale; 591 | } 592 | 593 | - (void)updateAsynchronously:(BOOL)async completion:(void (^)())completion 594 | { 595 | if ([self shouldUpdate]) 596 | { 597 | UIImage *snapshot = [self snapshotOfUnderlyingView]; 598 | if (async) 599 | { 600 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 601 | 602 | UIImage *blurredImage = [self blurredSnapshot:snapshot radius:self.blurRadius]; 603 | dispatch_sync(dispatch_get_main_queue(), ^{ 604 | 605 | [self setLayerContents:blurredImage]; 606 | if (completion) completion(); 607 | }); 608 | }); 609 | } 610 | else 611 | { 612 | [self setLayerContents:[self blurredSnapshot:snapshot radius:[self blurPresentationLayer].blurRadius]]; 613 | if (completion) completion(); 614 | } 615 | } 616 | else if (completion) 617 | { 618 | completion(); 619 | } 620 | } 621 | 622 | @end 623 | -------------------------------------------------------------------------------- /Pods/FXBlurView/LICENCE.md: -------------------------------------------------------------------------------- 1 | FXBlurView 2 | 3 | Version 1.6.3, November 1st, 2014 4 | 5 | Copyright (C) 2013 Charcoal Design 6 | 7 | This software is provided 'as-is', without any express or implied 8 | warranty. In no event will the authors be held liable for any damages 9 | arising from the use of this software. 10 | 11 | Permission is granted to anyone to use this software for any purpose, 12 | including commercial applications, and to alter it and redistribute it 13 | freely, subject to the following restrictions: 14 | 15 | 1. The origin of this software must not be misrepresented; you must not 16 | claim that you wrote the original software. If you use this software 17 | in a product, an acknowledgment in the product documentation would be 18 | appreciated but is not required. 19 | 2. Altered source versions must be plainly marked as such, and must not be 20 | misrepresented as being the original software. 21 | 3. This notice may not be removed or altered from any source distribution. -------------------------------------------------------------------------------- /Pods/FXBlurView/README.md: -------------------------------------------------------------------------------- 1 | Purpose 2 | -------------- 3 | 4 | FXBlurView is a UIView subclass that replicates the iOS 7 realtime background blur effect, but works on iOS 5 and above. It is designed to be as fast and as simple to use as possible. FXBlurView offers two modes of operation: static, where the view is rendered only once when it is added to a superview (though it can be updated by calling `setNeedsDisplay` or `updateAsynchronously:completion:`) or dynamic, where it will automatically redraw itself on a background thread as often as possible. 5 | 6 | 7 | Supported iOS & SDK Versions 8 | ----------------------------- 9 | 10 | * Supported build target - iOS 8.1 (Xcode 6.1, Apple LLVM compiler 6.0) 11 | * Earliest supported deployment target - iOS 6.0 12 | * Earliest compatible deployment target - iOS 4.3 13 | 14 | NOTE: 'Supported' means that the library has been tested with this version. 'Compatible' means that the library should work on this iOS version (i.e. it doesn't rely on any unavailable SDK features) but is no longer being tested for compatibility and may require tweaking or bug fixes to run correctly. 15 | 16 | 17 | ARC Compatibility 18 | ------------------ 19 | 20 | As of version 1.3, FXBlurView requires ARC. If you wish to use FXBlurView in a non-ARC project, just add the -fobjc-arc compiler flag to the FXBlurView.m class. To do this, go to the Build Phases tab in your target settings, open the Compile Sources group, double-click FXBlurView.m in the list and type -fobjc-arc into the popover. 21 | 22 | If you wish to convert your whole project to ARC, comment out the #error line in FXBlurView.m, then run the Edit > Refactor > Convert to Objective-C ARC... tool in Xcode and make sure all files that you wish to use ARC for (including FXBlurView.m) are checked. 23 | 24 | 25 | Installation 26 | --------------- 27 | 28 | To use FXBlurView, just drag the class files into your project and add the Accelerate framework. You can create FXBlurView instances programatically, or create them in Interface Builder by dragging an ordinary UIView into your view and setting its class to FXBlurView. 29 | 30 | If you are using Interface Builder, to set the custom properties of FXBlurView (ones that are not supported by regular UIViews) either create an IBOutlet for your view and set the properties in code, or use the User Defined Runtime Attributes feature in Interface Builder (introduced in Xcode 4.2 for iOS 5+). 31 | 32 | 33 | UIImage extensions 34 | -------------------- 35 | 36 | FXBlurView extends UIImage with the following method: 37 | 38 | - (UIImage *)blurredImageWithRadius:(CGFloat)radius 39 | iterations:(NSUInteger)iterations 40 | tintColor:(UIColor *)tintColor; 41 | 42 | This method applies a blur effect and returns the resultant blurred image without modifying the original. The radius property controls the extent of the blur effect. The iterations property controls the number of iterations. More iterations means higher quality. The tintColor is an optional color that will be blended with the resultant image. Note that the alpha component of the tintColor is ignored. 43 | 44 | 45 | FXBlurView methods 46 | ----------------------- 47 | 48 | + (void)setBlurEnabled:(BOOL)blurEnabled; 49 | 50 | This method can be used to globally enable/disable the blur effect on all FXBlurView instances. This is useful for testing, or if you wish to disable blurring on iPhone 4 and below (for consistency with iOS7 blur view behavior). By default blurring is enabled. 51 | 52 | + (void)setUpdatesEnabled; 53 | + (void)setUpdatesDisabled; 54 | 55 | These methods can be used to enable and disable updates for all dynamic FXBlurView instances with a single command. Useful for disabling updates immediately before performing an animation so that the FXBlurView updates don't cause the animation to stutter. Calls can be nested, but ensure that the enabled/disabled calls are balanced, or the updates will be left permanently enabled or disabled. 56 | 57 | - (void)updateAsynchronously:(BOOL)async completion:(void (^)())completion; 58 | 59 | This method can be used to trigger an update of the blur effect (useful when `dynamic = NO`). The async argument controls whether the blur will be redrawn on the main thread or in the background. The completion argument is an optional callback block that will be called when the blur is completed. 60 | 61 | - (void)setNeedsDisplay; 62 | 63 | Inherited from UIView, this method can be used to trigger a (synchronous) update of the view. Calling this method is more-or-less equivalent to calling `[view updateAsynchronously:NO completion:NULL]`. 64 | 65 | 66 | FXBlurView properties 67 | ---------------- 68 | 69 | @property (nonatomic, getter = isBlurEnabled) BOOL blurEnabled; 70 | 71 | This property toggles blurring on and off for an individual FXBlurView instance. Blurring is enabled by default. Note that if you disable blurring using the `+setBlurEnabled` method then that will override this setting. 72 | 73 | @property (nonatomic, getter = isDynamic) BOOL dynamic; 74 | 75 | This property controls whether the FXBlurView updates dynamically, or only once when the view is added to its superview. Defaults to YES. Note that if dynamic is set to NO, you can still force the view to update by calling `setNeedsDisplay` or `updateAsynchronously:completion:`. Dynamic blurring is extremely cpu-intensive, so you should always disable dynamic views immediately prior to performing an animation to avoid stuttering. However, if you have multiple FXBlurViews on screen then it is simpler to disable updates using the `setUpdatesDisabled` method rather than setting the `dynamic` property to NO. 76 | 77 | @property (nonatomic, assign) NSUInteger iterations; 78 | 79 | The number of blur iterations. More iterations improves the quality but reduces the performance. Defaults to 2 iterations. 80 | 81 | @property (nonatomic, assign) NSTimeInterval updateInterval; 82 | 83 | This controls the interval (in seconds) between successive updates when the FXBlurView is operating in dynamic mode. This defaults to zero, which means that the FXBlurView will update as fast as possible. This yields the best frame rate, but is also extremely CPU intensive and may cause the rest of your app's performance to degrade, especially on older devices. To alleviate this, try increasing the `updateInterval` value. 84 | 85 | @property (nonatomic, assign) CGFloat blurRadius; 86 | 87 | This property controls the radius of the blur effect (in points). Defaults to a 40 point radius, which is similar to the iOS 7 blur effect. 88 | 89 | @property (nonatomic, strong) UIColor *tintColor; 90 | 91 | This in an optional tint color to be applied to the FXBlurView. The RGB components of the color will be blended with the blurred image, resulting in a gentle tint. To vary the intensity of the tint effect, use brighter or darker colors. The alpha component of the tintColor is ignored. If you do not wish to apply a tint, set this value to nil or [UIColor clearColor]. Note that if you are using Xcode 5 or above, FXBlurViews created in Interface Builder will have a blue tint by default. 92 | 93 | @property (nonatomic, weak) UIView *underlyingView; 94 | 95 | This property specifies the view that the FXBlurView will sample to create the blur effect. If set to nil (the default), this will be the superview of the blur view itself, but you can override this if you need to. 96 | 97 | 98 | FAQ 99 | ---------------- 100 | 101 | Q. Why are my views all blue-tinted on iOS 7? 102 | A. FXBlurView uses the `UIView` `tintColor` property, which does not exist on iOS 6 and below, but defaults to blue on iOS 7. Just set this property to `[UIColor clearColor]` to disable the tint. To retain iOS 6 compatibility, you can either set this using code, or by using the User Defined Runtime Attributes feature of Interface Builder, which will override the standard `tintColor` value (see the example project nibs for how to do this). 103 | 104 | Q. FXBlurView makes my whole app run slowly on [old device], what can I do? 105 | A. To improve performance, try increasing the `updatePeriod` property, reducing the `iterations` property or disabling `dynamic` unless you really need it. If all else fails, set `blurEnabled` to NO on older devices. 106 | 107 | Q. My SpriteKit/OpenGL/Video/3D transformed content isn't showing up properly when placed underneath an FXBlurView, why not? 108 | A. This is a limitation of a the `CALayer` `renderInContext:` method used to capture the view contents. There is no workaround for this on iOS 6 and earlier. On iOS 7 you can make use of the `UIView` `drawViewHierarchyInRect:afterScreenUpdates:` method to capture an view and apply the blur effect yourself, but this it too slow for realtime use, so FXBlurView does not use this method by default. 109 | 110 | Q. FXBlurView is not capturing some ordinary view content that is behind it, why not? 111 | A. FXBlurView captures the contents of its immediate superview by default. If the superview is transparent or partially transparent, content shown behind it will not be captured. You can override the `underlyingView` property to capture the contents of a different view if you need to. 112 | 113 | 114 | Release Notes 115 | ----------------- 116 | 117 | Version 1.6.3 118 | 119 | - FXBlurView image background is no longer opaque/black, so it can be used as a translucent overlay 120 | - underlyingView property is now an IBOutlet, so it can be connected in Interface Builder 121 | - Moved imports into header for better Swift compatibility 122 | 123 | Version 1.6.2 124 | 125 | - Fixed crash on iOS 8 when animating blur 126 | - Fixed issue when using FXBlurView with Swift 127 | 128 | Version 1.6.1 129 | 130 | - Fixed issue with animation completion block not firing 131 | 132 | Version 1.6 133 | 134 | - It is now possible to animate blurRadius 135 | - Now requires QuartzCore framework 136 | 137 | Version 1.5.6 138 | 139 | - Fixed bug introduced in 1.5.4 where snapshot would always be taken from top-left corner of superview 140 | 141 | Version 1.5.5 142 | 143 | - Fixed zero-sized context warning in console when view has no presentationLayer 144 | 145 | Version 1.5.4 146 | 147 | - It is now possible to animate the FXBlurView frame using ordinary UIView animations 148 | 149 | Version 1.5.3 150 | 151 | - Fixed pixelation issue on non-Retina devices running iOS 6 or earlier 152 | 153 | Version 1.5.2 154 | 155 | - Fixed bug where edge of blur could be cropped short when using content modes other than scale to fit 156 | 157 | Version 1.5.1 158 | 159 | - Fixed bug where completion handler was not called for synchronous blur. 160 | 161 | Version 1.5 162 | 163 | - Added underlyingView property to specify source view 164 | - Added updateAsynchronously:completion: method 165 | - Fixed glitch with edges on certain views 166 | - Now conforms to -Weverything warning level 167 | 168 | Version 1.4.4 169 | 170 | - Fixed pixelation issue on Retina iPads 171 | 172 | Version 1.4.3 173 | 174 | - Fixed error when compiling for iOS 6.1 SDK using Xcode 5 175 | 176 | Version 1.4.2 177 | 178 | - Fixed issue where shadow or ghosting could appear at edge of blur view 179 | - Now conforms to -Wextra warning level 180 | 181 | Version 1.4.1 182 | 183 | - Fixed minor memory leak in the setUp method 184 | 185 | Version 1.4 186 | 187 | - More intelligent scheduling when multiple dynamic FXBlurView instances are shown on screen at once 188 | - Added global and individual methods for disabling blur (e.g. so you can disable blur on iPhone 4 and below for consistency with other apps on iOS 7) 189 | - Added Multiples views example 190 | 191 | Version 1.3.3 192 | 193 | - Fixed console warning when adding an FXBlurView of zero size to the window 194 | 195 | Version 1.3.2 196 | 197 | - Fixed issue with pixelation on non-Retina devices 198 | - Tweaked performance/quality tradeoff 199 | 200 | Version 1.3.1 201 | 202 | - Improved blur quality (1.3 was slightly blocky) 203 | 204 | Version 1.3 205 | 206 | - Added tintColor property 207 | - Significant performance improvement by reducing snapshot scale based in proportion to blur radius 208 | - Views placed in front of the FXBlurView in the hierarchy are no longer included in the blur effect 209 | - Fixed issue where blurView was sometimes partially transparent 210 | - Added example showing how to implement an iOS7 control center-style overlay 211 | - FXBlurView now requires ARC 212 | 213 | Version 1.2 214 | 215 | - Added +setUpdatesEnabled and +setUpdatesDisabled methods to globally enable/disable dynamic blur updates (e.g. when performing an animation) 216 | - Added -updateInterval method to control CPU load when updating 217 | - Changed runloop mode to reduce interference with scrolling, etc 218 | 219 | Version 1.1 220 | 221 | - Added ability to set number of blur iterations 222 | - Fixed setNeedsDisplay behavior when dynamic = NO 223 | - Reduced memory allocations in blur algorithm 224 | - Added dynamic mode toggle to example app 225 | 226 | Version 1.0 227 | 228 | - Initial release 229 | -------------------------------------------------------------------------------- /Pods/Headers/Private/FXBlurView/FXBlurView.h: -------------------------------------------------------------------------------- 1 | ../../../FXBlurView/FXBlurView/FXBlurView.h -------------------------------------------------------------------------------- /Pods/Headers/Public/FXBlurView/FXBlurView.h: -------------------------------------------------------------------------------- 1 | ../../../FXBlurView/FXBlurView/FXBlurView.h -------------------------------------------------------------------------------- /Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - FXBlurView (1.6.3) 3 | 4 | DEPENDENCIES: 5 | - FXBlurView 6 | 7 | SPEC CHECKSUMS: 8 | FXBlurView: c6d23f3d35af2c6282296a2930f61c6e2c788d01 9 | 10 | COCOAPODS: 0.37.2 11 | -------------------------------------------------------------------------------- /Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1066BCF76503DBD8E95FBC17 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B04169D535728334DCFAAB66 /* Foundation.framework */; }; 11 | 6C28E306ADF5A8FD301F5BDC /* FXBlurView.h in Headers */ = {isa = PBXBuildFile; fileRef = F9B72320AB760383973FB261 /* FXBlurView.h */; }; 12 | 7DAC40A5B936706856F7D03B /* Pods-FXBlurView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FEAE7D61883302726F59BF6 /* Pods-FXBlurView-dummy.m */; }; 13 | 8601C376EB7E7CAC23836345 /* Pods-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 635C8E25198DEB4EFBCE824D /* Pods-dummy.m */; }; 14 | 86897CC92A02B7708A672970 /* FXBlurView.m in Sources */ = {isa = PBXBuildFile; fileRef = A95BAB7EE19C8D82327AE065 /* FXBlurView.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; 15 | 8B9707DF41BC5725ADA1A155 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5B37EE08F6D4E3D88A890E0 /* QuartzCore.framework */; }; 16 | BBFDEE29B5A128259E145006 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5713987342AD9912491229A8 /* Accelerate.framework */; }; 17 | DEC06FFA16CA60D220A6CABA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B04169D535728334DCFAAB66 /* Foundation.framework */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXContainerItemProxy section */ 21 | 7A539BF9E2930D6B7F14CF13 /* PBXContainerItemProxy */ = { 22 | isa = PBXContainerItemProxy; 23 | containerPortal = DA55394B8212AD4A673A6F16 /* Project object */; 24 | proxyType = 1; 25 | remoteGlobalIDString = 02816DF0B7B2A1C263387A20; 26 | remoteInfo = "Pods-FXBlurView"; 27 | }; 28 | /* End PBXContainerItemProxy section */ 29 | 30 | /* Begin PBXFileReference section */ 31 | 190039EBF0CDB0815175C5B1 /* Pods-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-acknowledgements.markdown"; sourceTree = ""; }; 32 | 293CEEB62A2D44C7B23B0A47 /* Pods-FXBlurView.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-FXBlurView.xcconfig"; sourceTree = ""; }; 33 | 3648750A1024B68D06481B6C /* Pods-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-resources.sh"; sourceTree = ""; }; 34 | 45D2D05DBFF0D7C131A98EE7 /* Pods-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-acknowledgements.plist"; sourceTree = ""; }; 35 | 53900202F482070D23161540 /* libPods-FXBlurView.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-FXBlurView.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 36 | 5713987342AD9912491229A8 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; }; 37 | 635C8E25198DEB4EFBCE824D /* Pods-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-dummy.m"; sourceTree = ""; }; 38 | 736701146E3AEED72DEC86B3 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; 39 | 8FEAE7D61883302726F59BF6 /* Pods-FXBlurView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-FXBlurView-dummy.m"; sourceTree = ""; }; 40 | 96B6AD0ED714695E41A11118 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.release.xcconfig; sourceTree = ""; }; 41 | A95BAB7EE19C8D82327AE065 /* FXBlurView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FXBlurView.m; path = FXBlurView/FXBlurView.m; sourceTree = ""; }; 42 | B04169D535728334DCFAAB66 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 43 | B8DE11557A18AB5E6449A831 /* Pods-FXBlurView-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-FXBlurView-Private.xcconfig"; sourceTree = ""; }; 44 | CEA6A81EF0693D5C3C1ED10F /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.debug.xcconfig; sourceTree = ""; }; 45 | D5B37EE08F6D4E3D88A890E0 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; 46 | DBD0375B1C7EBE170B0317A1 /* Pods-FXBlurView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-FXBlurView-prefix.pch"; sourceTree = ""; }; 47 | DBE22B1DFE33D98B52F19763 /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 48 | F438FF5EB06C6DB753080871 /* Pods-environment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-environment.h"; sourceTree = ""; }; 49 | F9B72320AB760383973FB261 /* FXBlurView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FXBlurView.h; path = FXBlurView/FXBlurView.h; sourceTree = ""; }; 50 | /* End PBXFileReference section */ 51 | 52 | /* Begin PBXFrameworksBuildPhase section */ 53 | AAF47695F8C27BE1DC5B250A /* Frameworks */ = { 54 | isa = PBXFrameworksBuildPhase; 55 | buildActionMask = 2147483647; 56 | files = ( 57 | BBFDEE29B5A128259E145006 /* Accelerate.framework in Frameworks */, 58 | DEC06FFA16CA60D220A6CABA /* Foundation.framework in Frameworks */, 59 | 8B9707DF41BC5725ADA1A155 /* QuartzCore.framework in Frameworks */, 60 | ); 61 | runOnlyForDeploymentPostprocessing = 0; 62 | }; 63 | C1ECFE722F25B8EFE43BCF0F /* Frameworks */ = { 64 | isa = PBXFrameworksBuildPhase; 65 | buildActionMask = 2147483647; 66 | files = ( 67 | 1066BCF76503DBD8E95FBC17 /* Foundation.framework in Frameworks */, 68 | ); 69 | runOnlyForDeploymentPostprocessing = 0; 70 | }; 71 | /* End PBXFrameworksBuildPhase section */ 72 | 73 | /* Begin PBXGroup section */ 74 | 14988C7762BAE85FB6C3BE2C /* Targets Support Files */ = { 75 | isa = PBXGroup; 76 | children = ( 77 | AB02F885E9ABC9F9837CBE0E /* Pods */, 78 | ); 79 | name = "Targets Support Files"; 80 | sourceTree = ""; 81 | }; 82 | 68351D28B48613307FC9D3DD = { 83 | isa = PBXGroup; 84 | children = ( 85 | DBE22B1DFE33D98B52F19763 /* Podfile */, 86 | D3CDF0911F6D9DE227D43505 /* Frameworks */, 87 | A769FF7795A7D411AE2E67DE /* Pods */, 88 | DED176F1A7489F898B361019 /* Products */, 89 | 14988C7762BAE85FB6C3BE2C /* Targets Support Files */, 90 | ); 91 | sourceTree = ""; 92 | }; 93 | 8C6FA09E12F2D1B5DB5E6866 /* iOS */ = { 94 | isa = PBXGroup; 95 | children = ( 96 | 5713987342AD9912491229A8 /* Accelerate.framework */, 97 | B04169D535728334DCFAAB66 /* Foundation.framework */, 98 | D5B37EE08F6D4E3D88A890E0 /* QuartzCore.framework */, 99 | ); 100 | name = iOS; 101 | sourceTree = ""; 102 | }; 103 | A769FF7795A7D411AE2E67DE /* Pods */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | DBB06600E9FF81682A0C9940 /* FXBlurView */, 107 | ); 108 | name = Pods; 109 | sourceTree = ""; 110 | }; 111 | AB02F885E9ABC9F9837CBE0E /* Pods */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | 190039EBF0CDB0815175C5B1 /* Pods-acknowledgements.markdown */, 115 | 45D2D05DBFF0D7C131A98EE7 /* Pods-acknowledgements.plist */, 116 | 635C8E25198DEB4EFBCE824D /* Pods-dummy.m */, 117 | F438FF5EB06C6DB753080871 /* Pods-environment.h */, 118 | 3648750A1024B68D06481B6C /* Pods-resources.sh */, 119 | CEA6A81EF0693D5C3C1ED10F /* Pods.debug.xcconfig */, 120 | 96B6AD0ED714695E41A11118 /* Pods.release.xcconfig */, 121 | ); 122 | name = Pods; 123 | path = "Target Support Files/Pods"; 124 | sourceTree = ""; 125 | }; 126 | D3CDF0911F6D9DE227D43505 /* Frameworks */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | 8C6FA09E12F2D1B5DB5E6866 /* iOS */, 130 | ); 131 | name = Frameworks; 132 | sourceTree = ""; 133 | }; 134 | D48DEBD5145220C50837A16F /* Support Files */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | 293CEEB62A2D44C7B23B0A47 /* Pods-FXBlurView.xcconfig */, 138 | B8DE11557A18AB5E6449A831 /* Pods-FXBlurView-Private.xcconfig */, 139 | 8FEAE7D61883302726F59BF6 /* Pods-FXBlurView-dummy.m */, 140 | DBD0375B1C7EBE170B0317A1 /* Pods-FXBlurView-prefix.pch */, 141 | ); 142 | name = "Support Files"; 143 | path = "../Target Support Files/Pods-FXBlurView"; 144 | sourceTree = ""; 145 | }; 146 | DBB06600E9FF81682A0C9940 /* FXBlurView */ = { 147 | isa = PBXGroup; 148 | children = ( 149 | F9B72320AB760383973FB261 /* FXBlurView.h */, 150 | A95BAB7EE19C8D82327AE065 /* FXBlurView.m */, 151 | D48DEBD5145220C50837A16F /* Support Files */, 152 | ); 153 | path = FXBlurView; 154 | sourceTree = ""; 155 | }; 156 | DED176F1A7489F898B361019 /* Products */ = { 157 | isa = PBXGroup; 158 | children = ( 159 | 736701146E3AEED72DEC86B3 /* libPods.a */, 160 | 53900202F482070D23161540 /* libPods-FXBlurView.a */, 161 | ); 162 | name = Products; 163 | sourceTree = ""; 164 | }; 165 | /* End PBXGroup section */ 166 | 167 | /* Begin PBXHeadersBuildPhase section */ 168 | 4C10A3E8BEF460611677A757 /* Headers */ = { 169 | isa = PBXHeadersBuildPhase; 170 | buildActionMask = 2147483647; 171 | files = ( 172 | 6C28E306ADF5A8FD301F5BDC /* FXBlurView.h in Headers */, 173 | ); 174 | runOnlyForDeploymentPostprocessing = 0; 175 | }; 176 | /* End PBXHeadersBuildPhase section */ 177 | 178 | /* Begin PBXNativeTarget section */ 179 | 02816DF0B7B2A1C263387A20 /* Pods-FXBlurView */ = { 180 | isa = PBXNativeTarget; 181 | buildConfigurationList = 36048EA7BA4268BF57CB1815 /* Build configuration list for PBXNativeTarget "Pods-FXBlurView" */; 182 | buildPhases = ( 183 | 85B7DBD468426FAB3CFA83A2 /* Sources */, 184 | AAF47695F8C27BE1DC5B250A /* Frameworks */, 185 | 4C10A3E8BEF460611677A757 /* Headers */, 186 | ); 187 | buildRules = ( 188 | ); 189 | dependencies = ( 190 | ); 191 | name = "Pods-FXBlurView"; 192 | productName = "Pods-FXBlurView"; 193 | productReference = 53900202F482070D23161540 /* libPods-FXBlurView.a */; 194 | productType = "com.apple.product-type.library.static"; 195 | }; 196 | 9AAB500354B0940F7990C2C2 /* Pods */ = { 197 | isa = PBXNativeTarget; 198 | buildConfigurationList = 5226FB3674CCC8EB2D44ACF8 /* Build configuration list for PBXNativeTarget "Pods" */; 199 | buildPhases = ( 200 | 606D011B6F4DA130BED57D01 /* Sources */, 201 | C1ECFE722F25B8EFE43BCF0F /* Frameworks */, 202 | ); 203 | buildRules = ( 204 | ); 205 | dependencies = ( 206 | 593F9CDFF2261A34ABF7089F /* PBXTargetDependency */, 207 | ); 208 | name = Pods; 209 | productName = Pods; 210 | productReference = 736701146E3AEED72DEC86B3 /* libPods.a */; 211 | productType = "com.apple.product-type.library.static"; 212 | }; 213 | /* End PBXNativeTarget section */ 214 | 215 | /* Begin PBXProject section */ 216 | DA55394B8212AD4A673A6F16 /* Project object */ = { 217 | isa = PBXProject; 218 | attributes = { 219 | LastUpgradeCheck = 0640; 220 | }; 221 | buildConfigurationList = 4A37E5BCBF7445CAF5B98836 /* Build configuration list for PBXProject "Pods" */; 222 | compatibilityVersion = "Xcode 3.2"; 223 | developmentRegion = English; 224 | hasScannedForEncodings = 0; 225 | knownRegions = ( 226 | en, 227 | ); 228 | mainGroup = 68351D28B48613307FC9D3DD; 229 | productRefGroup = DED176F1A7489F898B361019 /* Products */; 230 | projectDirPath = ""; 231 | projectRoot = ""; 232 | targets = ( 233 | 9AAB500354B0940F7990C2C2 /* Pods */, 234 | 02816DF0B7B2A1C263387A20 /* Pods-FXBlurView */, 235 | ); 236 | }; 237 | /* End PBXProject section */ 238 | 239 | /* Begin PBXSourcesBuildPhase section */ 240 | 606D011B6F4DA130BED57D01 /* Sources */ = { 241 | isa = PBXSourcesBuildPhase; 242 | buildActionMask = 2147483647; 243 | files = ( 244 | 8601C376EB7E7CAC23836345 /* Pods-dummy.m in Sources */, 245 | ); 246 | runOnlyForDeploymentPostprocessing = 0; 247 | }; 248 | 85B7DBD468426FAB3CFA83A2 /* Sources */ = { 249 | isa = PBXSourcesBuildPhase; 250 | buildActionMask = 2147483647; 251 | files = ( 252 | 86897CC92A02B7708A672970 /* FXBlurView.m in Sources */, 253 | 7DAC40A5B936706856F7D03B /* Pods-FXBlurView-dummy.m in Sources */, 254 | ); 255 | runOnlyForDeploymentPostprocessing = 0; 256 | }; 257 | /* End PBXSourcesBuildPhase section */ 258 | 259 | /* Begin PBXTargetDependency section */ 260 | 593F9CDFF2261A34ABF7089F /* PBXTargetDependency */ = { 261 | isa = PBXTargetDependency; 262 | name = "Pods-FXBlurView"; 263 | target = 02816DF0B7B2A1C263387A20 /* Pods-FXBlurView */; 264 | targetProxy = 7A539BF9E2930D6B7F14CF13 /* PBXContainerItemProxy */; 265 | }; 266 | /* End PBXTargetDependency section */ 267 | 268 | /* Begin XCBuildConfiguration section */ 269 | 42982C4B7639E9735B65627F /* Debug */ = { 270 | isa = XCBuildConfiguration; 271 | buildSettings = { 272 | ALWAYS_SEARCH_USER_PATHS = NO; 273 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 274 | CLANG_CXX_LIBRARY = "libc++"; 275 | CLANG_ENABLE_MODULES = YES; 276 | CLANG_ENABLE_OBJC_ARC = YES; 277 | CLANG_WARN_BOOL_CONVERSION = YES; 278 | CLANG_WARN_CONSTANT_CONVERSION = YES; 279 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; 280 | CLANG_WARN_EMPTY_BODY = YES; 281 | CLANG_WARN_ENUM_CONVERSION = YES; 282 | CLANG_WARN_INT_CONVERSION = YES; 283 | CLANG_WARN_OBJC_ROOT_CLASS = YES; 284 | CLANG_WARN_UNREACHABLE_CODE = YES; 285 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 286 | COPY_PHASE_STRIP = NO; 287 | GCC_C_LANGUAGE_STANDARD = gnu99; 288 | GCC_DYNAMIC_NO_PIC = NO; 289 | GCC_OPTIMIZATION_LEVEL = 0; 290 | GCC_PREPROCESSOR_DEFINITIONS = ( 291 | "DEBUG=1", 292 | "$(inherited)", 293 | ); 294 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 295 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 296 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 297 | GCC_WARN_UNDECLARED_SELECTOR = YES; 298 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 299 | GCC_WARN_UNUSED_FUNCTION = YES; 300 | GCC_WARN_UNUSED_VARIABLE = YES; 301 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 302 | ONLY_ACTIVE_ARCH = YES; 303 | STRIP_INSTALLED_PRODUCT = NO; 304 | SYMROOT = "${SRCROOT}/../build"; 305 | }; 306 | name = Debug; 307 | }; 308 | 43237E3F431DCF47D55B0735 /* Release */ = { 309 | isa = XCBuildConfiguration; 310 | buildSettings = { 311 | ALWAYS_SEARCH_USER_PATHS = NO; 312 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 313 | CLANG_CXX_LIBRARY = "libc++"; 314 | CLANG_ENABLE_MODULES = YES; 315 | CLANG_ENABLE_OBJC_ARC = YES; 316 | CLANG_WARN_BOOL_CONVERSION = YES; 317 | CLANG_WARN_CONSTANT_CONVERSION = YES; 318 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; 319 | CLANG_WARN_EMPTY_BODY = YES; 320 | CLANG_WARN_ENUM_CONVERSION = YES; 321 | CLANG_WARN_INT_CONVERSION = YES; 322 | CLANG_WARN_OBJC_ROOT_CLASS = YES; 323 | CLANG_WARN_UNREACHABLE_CODE = YES; 324 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 325 | COPY_PHASE_STRIP = YES; 326 | ENABLE_NS_ASSERTIONS = NO; 327 | GCC_C_LANGUAGE_STANDARD = gnu99; 328 | GCC_PREPROCESSOR_DEFINITIONS = "RELEASE=1"; 329 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 330 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 331 | GCC_WARN_UNDECLARED_SELECTOR = YES; 332 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 333 | GCC_WARN_UNUSED_FUNCTION = YES; 334 | GCC_WARN_UNUSED_VARIABLE = YES; 335 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 336 | STRIP_INSTALLED_PRODUCT = NO; 337 | SYMROOT = "${SRCROOT}/../build"; 338 | VALIDATE_PRODUCT = YES; 339 | }; 340 | name = Release; 341 | }; 342 | 53CD3D59C537415652D6A551 /* Release */ = { 343 | isa = XCBuildConfiguration; 344 | baseConfigurationReference = 96B6AD0ED714695E41A11118 /* Pods.release.xcconfig */; 345 | buildSettings = { 346 | ENABLE_STRICT_OBJC_MSGSEND = YES; 347 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 348 | MTL_ENABLE_DEBUG_INFO = NO; 349 | OTHER_LDFLAGS = ""; 350 | OTHER_LIBTOOLFLAGS = ""; 351 | PODS_ROOT = "$(SRCROOT)"; 352 | PRODUCT_NAME = "$(TARGET_NAME)"; 353 | SDKROOT = iphoneos; 354 | SKIP_INSTALL = YES; 355 | }; 356 | name = Release; 357 | }; 358 | 6F560D63CCE02BB965BDF82E /* Release */ = { 359 | isa = XCBuildConfiguration; 360 | baseConfigurationReference = B8DE11557A18AB5E6449A831 /* Pods-FXBlurView-Private.xcconfig */; 361 | buildSettings = { 362 | ENABLE_STRICT_OBJC_MSGSEND = YES; 363 | GCC_PREFIX_HEADER = "Target Support Files/Pods-FXBlurView/Pods-FXBlurView-prefix.pch"; 364 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 365 | MTL_ENABLE_DEBUG_INFO = NO; 366 | OTHER_LDFLAGS = ""; 367 | OTHER_LIBTOOLFLAGS = ""; 368 | PRODUCT_NAME = "$(TARGET_NAME)"; 369 | SDKROOT = iphoneos; 370 | SKIP_INSTALL = YES; 371 | }; 372 | name = Release; 373 | }; 374 | D951FF4D0AA5BD4E1F9CE408 /* Debug */ = { 375 | isa = XCBuildConfiguration; 376 | baseConfigurationReference = B8DE11557A18AB5E6449A831 /* Pods-FXBlurView-Private.xcconfig */; 377 | buildSettings = { 378 | ENABLE_STRICT_OBJC_MSGSEND = YES; 379 | GCC_PREFIX_HEADER = "Target Support Files/Pods-FXBlurView/Pods-FXBlurView-prefix.pch"; 380 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 381 | MTL_ENABLE_DEBUG_INFO = YES; 382 | OTHER_LDFLAGS = ""; 383 | OTHER_LIBTOOLFLAGS = ""; 384 | PRODUCT_NAME = "$(TARGET_NAME)"; 385 | SDKROOT = iphoneos; 386 | SKIP_INSTALL = YES; 387 | }; 388 | name = Debug; 389 | }; 390 | F7C5DA36F003823408F356A8 /* Debug */ = { 391 | isa = XCBuildConfiguration; 392 | baseConfigurationReference = CEA6A81EF0693D5C3C1ED10F /* Pods.debug.xcconfig */; 393 | buildSettings = { 394 | ENABLE_STRICT_OBJC_MSGSEND = YES; 395 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 396 | MTL_ENABLE_DEBUG_INFO = YES; 397 | OTHER_LDFLAGS = ""; 398 | OTHER_LIBTOOLFLAGS = ""; 399 | PODS_ROOT = "$(SRCROOT)"; 400 | PRODUCT_NAME = "$(TARGET_NAME)"; 401 | SDKROOT = iphoneos; 402 | SKIP_INSTALL = YES; 403 | }; 404 | name = Debug; 405 | }; 406 | /* End XCBuildConfiguration section */ 407 | 408 | /* Begin XCConfigurationList section */ 409 | 36048EA7BA4268BF57CB1815 /* Build configuration list for PBXNativeTarget "Pods-FXBlurView" */ = { 410 | isa = XCConfigurationList; 411 | buildConfigurations = ( 412 | D951FF4D0AA5BD4E1F9CE408 /* Debug */, 413 | 6F560D63CCE02BB965BDF82E /* Release */, 414 | ); 415 | defaultConfigurationIsVisible = 0; 416 | defaultConfigurationName = Release; 417 | }; 418 | 4A37E5BCBF7445CAF5B98836 /* Build configuration list for PBXProject "Pods" */ = { 419 | isa = XCConfigurationList; 420 | buildConfigurations = ( 421 | 42982C4B7639E9735B65627F /* Debug */, 422 | 43237E3F431DCF47D55B0735 /* Release */, 423 | ); 424 | defaultConfigurationIsVisible = 0; 425 | defaultConfigurationName = Release; 426 | }; 427 | 5226FB3674CCC8EB2D44ACF8 /* Build configuration list for PBXNativeTarget "Pods" */ = { 428 | isa = XCConfigurationList; 429 | buildConfigurations = ( 430 | F7C5DA36F003823408F356A8 /* Debug */, 431 | 53CD3D59C537415652D6A551 /* Release */, 432 | ); 433 | defaultConfigurationIsVisible = 0; 434 | defaultConfigurationName = Release; 435 | }; 436 | /* End XCConfigurationList section */ 437 | }; 438 | rootObject = DA55394B8212AD4A673A6F16 /* Project object */; 439 | } 440 | -------------------------------------------------------------------------------- /Pods/Pods.xcodeproj/xcuserdata/andezhou.xcuserdatad/xcschemes/Pods-FXBlurView.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 42 | 43 | 44 | 45 | 51 | 52 | 54 | 55 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /Pods/Pods.xcodeproj/xcuserdata/andezhou.xcuserdatad/xcschemes/Pods.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 42 | 43 | 44 | 45 | 51 | 52 | 54 | 55 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /Pods/Pods.xcodeproj/xcuserdata/andezhou.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Pods-FXBlurView.xcscheme 8 | 9 | isShown 10 | 11 | 12 | Pods.xcscheme 13 | 14 | isShown 15 | 16 | 17 | 18 | SuppressBuildableAutocreation 19 | 20 | 02816DF0B7B2A1C263387A20 21 | 22 | primary 23 | 24 | 25 | 9AAB500354B0940F7990C2C2 26 | 27 | primary 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FXBlurView/Pods-FXBlurView-Private.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods-FXBlurView.xcconfig" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/FXBlurView" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/FXBlurView" 4 | OTHER_LDFLAGS = ${PODS_FXBLURVIEW_OTHER_LDFLAGS} -ObjC 5 | PODS_ROOT = ${SRCROOT} 6 | SKIP_INSTALL = YES -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FXBlurView/Pods-FXBlurView-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_FXBlurView : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_FXBlurView 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FXBlurView/Pods-FXBlurView-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | #import "Pods-environment.h" 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FXBlurView/Pods-FXBlurView.xcconfig: -------------------------------------------------------------------------------- 1 | PODS_FXBLURVIEW_OTHER_LDFLAGS = -framework "Accelerate" -framework "QuartzCore" -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods/Pods-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## FXBlurView 5 | 6 | FXBlurView 7 | 8 | Version 1.6.3, November 1st, 2014 9 | 10 | Copyright (C) 2013 Charcoal Design 11 | 12 | This software is provided 'as-is', without any express or implied 13 | warranty. In no event will the authors be held liable for any damages 14 | arising from the use of this software. 15 | 16 | Permission is granted to anyone to use this software for any purpose, 17 | including commercial applications, and to alter it and redistribute it 18 | freely, subject to the following restrictions: 19 | 20 | 1. The origin of this software must not be misrepresented; you must not 21 | claim that you wrote the original software. If you use this software 22 | in a product, an acknowledgment in the product documentation would be 23 | appreciated but is not required. 24 | 2. Altered source versions must be plainly marked as such, and must not be 25 | misrepresented as being the original software. 26 | 3. This notice may not be removed or altered from any source distribution. 27 | Generated by CocoaPods - http://cocoapods.org 28 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods/Pods-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | FXBlurView 18 | 19 | Version 1.6.3, November 1st, 2014 20 | 21 | Copyright (C) 2013 Charcoal Design 22 | 23 | This software is provided 'as-is', without any express or implied 24 | warranty. In no event will the authors be held liable for any damages 25 | arising from the use of this software. 26 | 27 | Permission is granted to anyone to use this software for any purpose, 28 | including commercial applications, and to alter it and redistribute it 29 | freely, subject to the following restrictions: 30 | 31 | 1. The origin of this software must not be misrepresented; you must not 32 | claim that you wrote the original software. If you use this software 33 | in a product, an acknowledgment in the product documentation would be 34 | appreciated but is not required. 35 | 2. Altered source versions must be plainly marked as such, and must not be 36 | misrepresented as being the original software. 37 | 3. This notice may not be removed or altered from any source distribution. 38 | Title 39 | FXBlurView 40 | Type 41 | PSGroupSpecifier 42 | 43 | 44 | FooterText 45 | Generated by CocoaPods - http://cocoapods.org 46 | Title 47 | 48 | Type 49 | PSGroupSpecifier 50 | 51 | 52 | StringsTable 53 | Acknowledgements 54 | Title 55 | Acknowledgements 56 | 57 | 58 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods/Pods-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods : NSObject 3 | @end 4 | @implementation PodsDummy_Pods 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods/Pods-environment.h: -------------------------------------------------------------------------------- 1 | 2 | // To check if a library is compiled with CocoaPods you 3 | // can use the `COCOAPODS` macro definition which is 4 | // defined in the xcconfigs so it is available in 5 | // headers also when they are imported in the client 6 | // project. 7 | 8 | 9 | // FXBlurView 10 | #define COCOAPODS_POD_AVAILABLE_FXBlurView 11 | #define COCOAPODS_VERSION_MAJOR_FXBlurView 1 12 | #define COCOAPODS_VERSION_MINOR_FXBlurView 6 13 | #define COCOAPODS_VERSION_PATCH_FXBlurView 3 14 | 15 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods/Pods-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 5 | 6 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 7 | > "$RESOURCES_TO_COPY" 8 | 9 | XCASSET_FILES=() 10 | 11 | realpath() { 12 | DIRECTORY=$(cd "${1%/*}" && pwd) 13 | FILENAME="${1##*/}" 14 | echo "$DIRECTORY/$FILENAME" 15 | } 16 | 17 | install_resource() 18 | { 19 | case $1 in 20 | *.storyboard) 21 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" 22 | ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" 23 | ;; 24 | *.xib) 25 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" 26 | ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" 27 | ;; 28 | *.framework) 29 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 30 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 31 | echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 32 | rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 33 | ;; 34 | *.xcdatamodel) 35 | echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" 36 | xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" 37 | ;; 38 | *.xcdatamodeld) 39 | echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" 40 | xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" 41 | ;; 42 | *.xcmappingmodel) 43 | echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" 44 | xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" 45 | ;; 46 | *.xcassets) 47 | ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") 48 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 49 | ;; 50 | /*) 51 | echo "$1" 52 | echo "$1" >> "$RESOURCES_TO_COPY" 53 | ;; 54 | *) 55 | echo "${PODS_ROOT}/$1" 56 | echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" 57 | ;; 58 | esac 59 | } 60 | 61 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 62 | if [[ "${ACTION}" == "install" ]]; then 63 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 64 | fi 65 | rm -f "$RESOURCES_TO_COPY" 66 | 67 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 68 | then 69 | case "${TARGETED_DEVICE_FAMILY}" in 70 | 1,2) 71 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 72 | ;; 73 | 1) 74 | TARGET_DEVICE_ARGS="--target-device iphone" 75 | ;; 76 | 2) 77 | TARGET_DEVICE_ARGS="--target-device ipad" 78 | ;; 79 | *) 80 | TARGET_DEVICE_ARGS="--target-device mac" 81 | ;; 82 | esac 83 | 84 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 85 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 86 | while read line; do 87 | if [[ $line != "`realpath $PODS_ROOT`*" ]]; then 88 | XCASSET_FILES+=("$line") 89 | fi 90 | done <<<"$OTHER_XCASSETS" 91 | 92 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 93 | fi 94 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods/Pods.debug.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/FXBlurView" 3 | OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/FXBlurView" 4 | OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-FXBlurView" -framework "Accelerate" -framework "QuartzCore" 5 | OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) 6 | PODS_ROOT = ${SRCROOT}/Pods -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods/Pods.release.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/FXBlurView" 3 | OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/FXBlurView" 4 | OTHER_LDFLAGS = $(inherited) -ObjC -l"Pods-FXBlurView" -framework "Accelerate" -framework "QuartzCore" 5 | OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) 6 | PODS_ROOT = ${SRCROOT}/Pods -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouande/TLCollectionViewLineLayout/47af9c28d6709d5b91dfdf06e95f44ab3c8236f4/README.md -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 13CAAFD31B57895300CAD02F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13CAAFD21B57895300CAD02F /* main.m */; }; 11 | 13CAAFD61B57895300CAD02F /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13CAAFD51B57895300CAD02F /* AppDelegate.m */; }; 12 | 13CAAFDC1B57895300CAD02F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 13CAAFDA1B57895300CAD02F /* Main.storyboard */; }; 13 | 13CAAFDE1B57895300CAD02F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13CAAFDD1B57895300CAD02F /* Images.xcassets */; }; 14 | 13CAAFE11B57895300CAD02F /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13CAAFDF1B57895300CAD02F /* LaunchScreen.xib */; }; 15 | 13CAAFED1B57895300CAD02F /* TLCollectionViewLineLayout_DemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 13CAAFEC1B57895300CAD02F /* TLCollectionViewLineLayout_DemoTests.m */; }; 16 | 13CAAFF81B57896F00CAD02F /* TLCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 13CAAFF71B57896F00CAD02F /* TLCollectionViewController.m */; }; 17 | 13CAAFFB1B5789BB00CAD02F /* TLCollectionViewLineLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 13CAAFFA1B5789BB00CAD02F /* TLCollectionViewLineLayout.m */; }; 18 | 13CAAFFE1B5789D300CAD02F /* TLCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 13CAAFFD1B5789D300CAD02F /* TLCollectionViewCell.m */; }; 19 | 13CAB0001B578DC500CAD02F /* bg0.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 13CAAFFF1B578DC500CAD02F /* bg0.jpg */; }; 20 | 13CAB0031B57978E00CAD02F /* bg1.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 13CAB0011B57978E00CAD02F /* bg1.jpg */; }; 21 | 13CAB0041B57978E00CAD02F /* bg2.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 13CAB0021B57978E00CAD02F /* bg2.jpg */; }; 22 | E78910C5101B7CEAF790B6E3 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BACA3269AC7515EE858198C7 /* libPods.a */; }; 23 | /* End PBXBuildFile section */ 24 | 25 | /* Begin PBXContainerItemProxy section */ 26 | 13CAAFE71B57895300CAD02F /* PBXContainerItemProxy */ = { 27 | isa = PBXContainerItemProxy; 28 | containerPortal = 13CAAFC51B57895300CAD02F /* Project object */; 29 | proxyType = 1; 30 | remoteGlobalIDString = 13CAAFCC1B57895300CAD02F; 31 | remoteInfo = "TLCollectionViewLineLayout-Demo"; 32 | }; 33 | /* End PBXContainerItemProxy section */ 34 | 35 | /* Begin PBXFileReference section */ 36 | 0A2DF4B9B7D7390A2951003D /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; 37 | 13CAAFCD1B57895300CAD02F /* TLCollectionViewLineLayout-Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "TLCollectionViewLineLayout-Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 38 | 13CAAFD11B57895300CAD02F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 39 | 13CAAFD21B57895300CAD02F /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 40 | 13CAAFD41B57895300CAD02F /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 41 | 13CAAFD51B57895300CAD02F /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 42 | 13CAAFDB1B57895300CAD02F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 43 | 13CAAFDD1B57895300CAD02F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 44 | 13CAAFE01B57895300CAD02F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 45 | 13CAAFE61B57895300CAD02F /* TLCollectionViewLineLayout-DemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "TLCollectionViewLineLayout-DemoTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 46 | 13CAAFEB1B57895300CAD02F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 47 | 13CAAFEC1B57895300CAD02F /* TLCollectionViewLineLayout_DemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TLCollectionViewLineLayout_DemoTests.m; sourceTree = ""; }; 48 | 13CAAFF61B57896F00CAD02F /* TLCollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCollectionViewController.h; sourceTree = ""; }; 49 | 13CAAFF71B57896F00CAD02F /* TLCollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TLCollectionViewController.m; sourceTree = ""; }; 50 | 13CAAFF91B5789BB00CAD02F /* TLCollectionViewLineLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCollectionViewLineLayout.h; sourceTree = ""; }; 51 | 13CAAFFA1B5789BB00CAD02F /* TLCollectionViewLineLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TLCollectionViewLineLayout.m; sourceTree = ""; }; 52 | 13CAAFFC1B5789D300CAD02F /* TLCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TLCollectionViewCell.h; sourceTree = ""; }; 53 | 13CAAFFD1B5789D300CAD02F /* TLCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TLCollectionViewCell.m; sourceTree = ""; }; 54 | 13CAAFFF1B578DC500CAD02F /* bg0.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = bg0.jpg; sourceTree = ""; }; 55 | 13CAB0011B57978E00CAD02F /* bg1.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = bg1.jpg; sourceTree = ""; }; 56 | 13CAB0021B57978E00CAD02F /* bg2.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = bg2.jpg; sourceTree = ""; }; 57 | 4CF0B26DBD4C41F0EA64141B /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; 58 | BACA3269AC7515EE858198C7 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; 59 | /* End PBXFileReference section */ 60 | 61 | /* Begin PBXFrameworksBuildPhase section */ 62 | 13CAAFCA1B57895300CAD02F /* Frameworks */ = { 63 | isa = PBXFrameworksBuildPhase; 64 | buildActionMask = 2147483647; 65 | files = ( 66 | E78910C5101B7CEAF790B6E3 /* libPods.a in Frameworks */, 67 | ); 68 | runOnlyForDeploymentPostprocessing = 0; 69 | }; 70 | 13CAAFE31B57895300CAD02F /* Frameworks */ = { 71 | isa = PBXFrameworksBuildPhase; 72 | buildActionMask = 2147483647; 73 | files = ( 74 | ); 75 | runOnlyForDeploymentPostprocessing = 0; 76 | }; 77 | /* End PBXFrameworksBuildPhase section */ 78 | 79 | /* Begin PBXGroup section */ 80 | 13CAAFC41B57895300CAD02F = { 81 | isa = PBXGroup; 82 | children = ( 83 | 13CAAFCF1B57895300CAD02F /* TLCollectionViewLineLayout-Demo */, 84 | 13CAAFE91B57895300CAD02F /* TLCollectionViewLineLayout-DemoTests */, 85 | 13CAAFCE1B57895300CAD02F /* Products */, 86 | 83EC836E90FFC16BEDC16911 /* Pods */, 87 | A565C2BFB8AD1794629A2BB1 /* Frameworks */, 88 | ); 89 | sourceTree = ""; 90 | }; 91 | 13CAAFCE1B57895300CAD02F /* Products */ = { 92 | isa = PBXGroup; 93 | children = ( 94 | 13CAAFCD1B57895300CAD02F /* TLCollectionViewLineLayout-Demo.app */, 95 | 13CAAFE61B57895300CAD02F /* TLCollectionViewLineLayout-DemoTests.xctest */, 96 | ); 97 | name = Products; 98 | sourceTree = ""; 99 | }; 100 | 13CAAFCF1B57895300CAD02F /* TLCollectionViewLineLayout-Demo */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | 13CAAFD41B57895300CAD02F /* AppDelegate.h */, 104 | 13CAAFD51B57895300CAD02F /* AppDelegate.m */, 105 | 13CAAFF61B57896F00CAD02F /* TLCollectionViewController.h */, 106 | 13CAAFF71B57896F00CAD02F /* TLCollectionViewController.m */, 107 | 13CAAFF91B5789BB00CAD02F /* TLCollectionViewLineLayout.h */, 108 | 13CAAFFA1B5789BB00CAD02F /* TLCollectionViewLineLayout.m */, 109 | 13CAAFFC1B5789D300CAD02F /* TLCollectionViewCell.h */, 110 | 13CAAFFD1B5789D300CAD02F /* TLCollectionViewCell.m */, 111 | 13CAAFDA1B57895300CAD02F /* Main.storyboard */, 112 | 13CAAFDD1B57895300CAD02F /* Images.xcassets */, 113 | 13CAAFDF1B57895300CAD02F /* LaunchScreen.xib */, 114 | 13CAAFD01B57895300CAD02F /* Supporting Files */, 115 | ); 116 | path = "TLCollectionViewLineLayout-Demo"; 117 | sourceTree = ""; 118 | }; 119 | 13CAAFD01B57895300CAD02F /* Supporting Files */ = { 120 | isa = PBXGroup; 121 | children = ( 122 | 13CAB0011B57978E00CAD02F /* bg1.jpg */, 123 | 13CAB0021B57978E00CAD02F /* bg2.jpg */, 124 | 13CAAFFF1B578DC500CAD02F /* bg0.jpg */, 125 | 13CAAFD11B57895300CAD02F /* Info.plist */, 126 | 13CAAFD21B57895300CAD02F /* main.m */, 127 | ); 128 | name = "Supporting Files"; 129 | sourceTree = ""; 130 | }; 131 | 13CAAFE91B57895300CAD02F /* TLCollectionViewLineLayout-DemoTests */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | 13CAAFEC1B57895300CAD02F /* TLCollectionViewLineLayout_DemoTests.m */, 135 | 13CAAFEA1B57895300CAD02F /* Supporting Files */, 136 | ); 137 | path = "TLCollectionViewLineLayout-DemoTests"; 138 | sourceTree = ""; 139 | }; 140 | 13CAAFEA1B57895300CAD02F /* Supporting Files */ = { 141 | isa = PBXGroup; 142 | children = ( 143 | 13CAAFEB1B57895300CAD02F /* Info.plist */, 144 | ); 145 | name = "Supporting Files"; 146 | sourceTree = ""; 147 | }; 148 | 83EC836E90FFC16BEDC16911 /* Pods */ = { 149 | isa = PBXGroup; 150 | children = ( 151 | 4CF0B26DBD4C41F0EA64141B /* Pods.debug.xcconfig */, 152 | 0A2DF4B9B7D7390A2951003D /* Pods.release.xcconfig */, 153 | ); 154 | name = Pods; 155 | sourceTree = ""; 156 | }; 157 | A565C2BFB8AD1794629A2BB1 /* Frameworks */ = { 158 | isa = PBXGroup; 159 | children = ( 160 | BACA3269AC7515EE858198C7 /* libPods.a */, 161 | ); 162 | name = Frameworks; 163 | sourceTree = ""; 164 | }; 165 | /* End PBXGroup section */ 166 | 167 | /* Begin PBXNativeTarget section */ 168 | 13CAAFCC1B57895300CAD02F /* TLCollectionViewLineLayout-Demo */ = { 169 | isa = PBXNativeTarget; 170 | buildConfigurationList = 13CAAFF01B57895300CAD02F /* Build configuration list for PBXNativeTarget "TLCollectionViewLineLayout-Demo" */; 171 | buildPhases = ( 172 | 770D6C8BE30556509A6949FA /* Check Pods Manifest.lock */, 173 | 13CAAFC91B57895300CAD02F /* Sources */, 174 | 13CAAFCA1B57895300CAD02F /* Frameworks */, 175 | 13CAAFCB1B57895300CAD02F /* Resources */, 176 | 53DD3A0A0827F76C7CFA6A2D /* Copy Pods Resources */, 177 | ); 178 | buildRules = ( 179 | ); 180 | dependencies = ( 181 | ); 182 | name = "TLCollectionViewLineLayout-Demo"; 183 | productName = "TLCollectionViewLineLayout-Demo"; 184 | productReference = 13CAAFCD1B57895300CAD02F /* TLCollectionViewLineLayout-Demo.app */; 185 | productType = "com.apple.product-type.application"; 186 | }; 187 | 13CAAFE51B57895300CAD02F /* TLCollectionViewLineLayout-DemoTests */ = { 188 | isa = PBXNativeTarget; 189 | buildConfigurationList = 13CAAFF31B57895300CAD02F /* Build configuration list for PBXNativeTarget "TLCollectionViewLineLayout-DemoTests" */; 190 | buildPhases = ( 191 | 13CAAFE21B57895300CAD02F /* Sources */, 192 | 13CAAFE31B57895300CAD02F /* Frameworks */, 193 | 13CAAFE41B57895300CAD02F /* Resources */, 194 | ); 195 | buildRules = ( 196 | ); 197 | dependencies = ( 198 | 13CAAFE81B57895300CAD02F /* PBXTargetDependency */, 199 | ); 200 | name = "TLCollectionViewLineLayout-DemoTests"; 201 | productName = "TLCollectionViewLineLayout-DemoTests"; 202 | productReference = 13CAAFE61B57895300CAD02F /* TLCollectionViewLineLayout-DemoTests.xctest */; 203 | productType = "com.apple.product-type.bundle.unit-test"; 204 | }; 205 | /* End PBXNativeTarget section */ 206 | 207 | /* Begin PBXProject section */ 208 | 13CAAFC51B57895300CAD02F /* Project object */ = { 209 | isa = PBXProject; 210 | attributes = { 211 | LastUpgradeCheck = 0640; 212 | ORGANIZATIONNAME = andezhou; 213 | TargetAttributes = { 214 | 13CAAFCC1B57895300CAD02F = { 215 | CreatedOnToolsVersion = 6.4; 216 | DevelopmentTeam = 46MF2PE5UD; 217 | }; 218 | 13CAAFE51B57895300CAD02F = { 219 | CreatedOnToolsVersion = 6.4; 220 | TestTargetID = 13CAAFCC1B57895300CAD02F; 221 | }; 222 | }; 223 | }; 224 | buildConfigurationList = 13CAAFC81B57895300CAD02F /* Build configuration list for PBXProject "TLCollectionViewLineLayout-Demo" */; 225 | compatibilityVersion = "Xcode 3.2"; 226 | developmentRegion = English; 227 | hasScannedForEncodings = 0; 228 | knownRegions = ( 229 | en, 230 | Base, 231 | ); 232 | mainGroup = 13CAAFC41B57895300CAD02F; 233 | productRefGroup = 13CAAFCE1B57895300CAD02F /* Products */; 234 | projectDirPath = ""; 235 | projectRoot = ""; 236 | targets = ( 237 | 13CAAFCC1B57895300CAD02F /* TLCollectionViewLineLayout-Demo */, 238 | 13CAAFE51B57895300CAD02F /* TLCollectionViewLineLayout-DemoTests */, 239 | ); 240 | }; 241 | /* End PBXProject section */ 242 | 243 | /* Begin PBXResourcesBuildPhase section */ 244 | 13CAAFCB1B57895300CAD02F /* Resources */ = { 245 | isa = PBXResourcesBuildPhase; 246 | buildActionMask = 2147483647; 247 | files = ( 248 | 13CAAFDC1B57895300CAD02F /* Main.storyboard in Resources */, 249 | 13CAAFE11B57895300CAD02F /* LaunchScreen.xib in Resources */, 250 | 13CAAFDE1B57895300CAD02F /* Images.xcassets in Resources */, 251 | 13CAB0041B57978E00CAD02F /* bg2.jpg in Resources */, 252 | 13CAB0001B578DC500CAD02F /* bg0.jpg in Resources */, 253 | 13CAB0031B57978E00CAD02F /* bg1.jpg in Resources */, 254 | ); 255 | runOnlyForDeploymentPostprocessing = 0; 256 | }; 257 | 13CAAFE41B57895300CAD02F /* Resources */ = { 258 | isa = PBXResourcesBuildPhase; 259 | buildActionMask = 2147483647; 260 | files = ( 261 | ); 262 | runOnlyForDeploymentPostprocessing = 0; 263 | }; 264 | /* End PBXResourcesBuildPhase section */ 265 | 266 | /* Begin PBXShellScriptBuildPhase section */ 267 | 53DD3A0A0827F76C7CFA6A2D /* Copy Pods Resources */ = { 268 | isa = PBXShellScriptBuildPhase; 269 | buildActionMask = 2147483647; 270 | files = ( 271 | ); 272 | inputPaths = ( 273 | ); 274 | name = "Copy Pods Resources"; 275 | outputPaths = ( 276 | ); 277 | runOnlyForDeploymentPostprocessing = 0; 278 | shellPath = /bin/sh; 279 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; 280 | showEnvVarsInLog = 0; 281 | }; 282 | 770D6C8BE30556509A6949FA /* Check Pods Manifest.lock */ = { 283 | isa = PBXShellScriptBuildPhase; 284 | buildActionMask = 2147483647; 285 | files = ( 286 | ); 287 | inputPaths = ( 288 | ); 289 | name = "Check Pods Manifest.lock"; 290 | outputPaths = ( 291 | ); 292 | runOnlyForDeploymentPostprocessing = 0; 293 | shellPath = /bin/sh; 294 | shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; 295 | showEnvVarsInLog = 0; 296 | }; 297 | /* End PBXShellScriptBuildPhase section */ 298 | 299 | /* Begin PBXSourcesBuildPhase section */ 300 | 13CAAFC91B57895300CAD02F /* Sources */ = { 301 | isa = PBXSourcesBuildPhase; 302 | buildActionMask = 2147483647; 303 | files = ( 304 | 13CAAFFB1B5789BB00CAD02F /* TLCollectionViewLineLayout.m in Sources */, 305 | 13CAAFF81B57896F00CAD02F /* TLCollectionViewController.m in Sources */, 306 | 13CAAFFE1B5789D300CAD02F /* TLCollectionViewCell.m in Sources */, 307 | 13CAAFD61B57895300CAD02F /* AppDelegate.m in Sources */, 308 | 13CAAFD31B57895300CAD02F /* main.m in Sources */, 309 | ); 310 | runOnlyForDeploymentPostprocessing = 0; 311 | }; 312 | 13CAAFE21B57895300CAD02F /* Sources */ = { 313 | isa = PBXSourcesBuildPhase; 314 | buildActionMask = 2147483647; 315 | files = ( 316 | 13CAAFED1B57895300CAD02F /* TLCollectionViewLineLayout_DemoTests.m in Sources */, 317 | ); 318 | runOnlyForDeploymentPostprocessing = 0; 319 | }; 320 | /* End PBXSourcesBuildPhase section */ 321 | 322 | /* Begin PBXTargetDependency section */ 323 | 13CAAFE81B57895300CAD02F /* PBXTargetDependency */ = { 324 | isa = PBXTargetDependency; 325 | target = 13CAAFCC1B57895300CAD02F /* TLCollectionViewLineLayout-Demo */; 326 | targetProxy = 13CAAFE71B57895300CAD02F /* PBXContainerItemProxy */; 327 | }; 328 | /* End PBXTargetDependency section */ 329 | 330 | /* Begin PBXVariantGroup section */ 331 | 13CAAFDA1B57895300CAD02F /* Main.storyboard */ = { 332 | isa = PBXVariantGroup; 333 | children = ( 334 | 13CAAFDB1B57895300CAD02F /* Base */, 335 | ); 336 | name = Main.storyboard; 337 | sourceTree = ""; 338 | }; 339 | 13CAAFDF1B57895300CAD02F /* LaunchScreen.xib */ = { 340 | isa = PBXVariantGroup; 341 | children = ( 342 | 13CAAFE01B57895300CAD02F /* Base */, 343 | ); 344 | name = LaunchScreen.xib; 345 | sourceTree = ""; 346 | }; 347 | /* End PBXVariantGroup section */ 348 | 349 | /* Begin XCBuildConfiguration section */ 350 | 13CAAFEE1B57895300CAD02F /* Debug */ = { 351 | isa = XCBuildConfiguration; 352 | buildSettings = { 353 | ALWAYS_SEARCH_USER_PATHS = NO; 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_EMPTY_BODY = YES; 362 | CLANG_WARN_ENUM_CONVERSION = YES; 363 | CLANG_WARN_INT_CONVERSION = YES; 364 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 365 | CLANG_WARN_UNREACHABLE_CODE = YES; 366 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 367 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 368 | COPY_PHASE_STRIP = NO; 369 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 370 | ENABLE_STRICT_OBJC_MSGSEND = YES; 371 | GCC_C_LANGUAGE_STANDARD = gnu99; 372 | GCC_DYNAMIC_NO_PIC = NO; 373 | GCC_NO_COMMON_BLOCKS = YES; 374 | GCC_OPTIMIZATION_LEVEL = 0; 375 | GCC_PREPROCESSOR_DEFINITIONS = ( 376 | "DEBUG=1", 377 | "$(inherited)", 378 | ); 379 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 380 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 381 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 382 | GCC_WARN_UNDECLARED_SELECTOR = YES; 383 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 384 | GCC_WARN_UNUSED_FUNCTION = YES; 385 | GCC_WARN_UNUSED_VARIABLE = YES; 386 | IPHONEOS_DEPLOYMENT_TARGET = 8.4; 387 | MTL_ENABLE_DEBUG_INFO = YES; 388 | ONLY_ACTIVE_ARCH = YES; 389 | SDKROOT = iphoneos; 390 | }; 391 | name = Debug; 392 | }; 393 | 13CAAFEF1B57895300CAD02F /* Release */ = { 394 | isa = XCBuildConfiguration; 395 | buildSettings = { 396 | ALWAYS_SEARCH_USER_PATHS = NO; 397 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 398 | CLANG_CXX_LIBRARY = "libc++"; 399 | CLANG_ENABLE_MODULES = YES; 400 | CLANG_ENABLE_OBJC_ARC = YES; 401 | CLANG_WARN_BOOL_CONVERSION = YES; 402 | CLANG_WARN_CONSTANT_CONVERSION = YES; 403 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 404 | CLANG_WARN_EMPTY_BODY = YES; 405 | CLANG_WARN_ENUM_CONVERSION = YES; 406 | CLANG_WARN_INT_CONVERSION = YES; 407 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 408 | CLANG_WARN_UNREACHABLE_CODE = YES; 409 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 410 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 411 | COPY_PHASE_STRIP = NO; 412 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 413 | ENABLE_NS_ASSERTIONS = NO; 414 | ENABLE_STRICT_OBJC_MSGSEND = YES; 415 | GCC_C_LANGUAGE_STANDARD = gnu99; 416 | GCC_NO_COMMON_BLOCKS = YES; 417 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 418 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 419 | GCC_WARN_UNDECLARED_SELECTOR = YES; 420 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 421 | GCC_WARN_UNUSED_FUNCTION = YES; 422 | GCC_WARN_UNUSED_VARIABLE = YES; 423 | IPHONEOS_DEPLOYMENT_TARGET = 8.4; 424 | MTL_ENABLE_DEBUG_INFO = NO; 425 | SDKROOT = iphoneos; 426 | VALIDATE_PRODUCT = YES; 427 | }; 428 | name = Release; 429 | }; 430 | 13CAAFF11B57895300CAD02F /* Debug */ = { 431 | isa = XCBuildConfiguration; 432 | baseConfigurationReference = 4CF0B26DBD4C41F0EA64141B /* Pods.debug.xcconfig */; 433 | buildSettings = { 434 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 435 | CODE_SIGN_IDENTITY = "iPhone Developer"; 436 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 437 | INFOPLIST_FILE = "TLCollectionViewLineLayout-Demo/Info.plist"; 438 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 439 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 440 | PRODUCT_NAME = "$(TARGET_NAME)"; 441 | PROVISIONING_PROFILE = ""; 442 | }; 443 | name = Debug; 444 | }; 445 | 13CAAFF21B57895300CAD02F /* Release */ = { 446 | isa = XCBuildConfiguration; 447 | baseConfigurationReference = 0A2DF4B9B7D7390A2951003D /* Pods.release.xcconfig */; 448 | buildSettings = { 449 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 450 | CODE_SIGN_IDENTITY = "iPhone Developer"; 451 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 452 | INFOPLIST_FILE = "TLCollectionViewLineLayout-Demo/Info.plist"; 453 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 454 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 455 | PRODUCT_NAME = "$(TARGET_NAME)"; 456 | PROVISIONING_PROFILE = ""; 457 | }; 458 | name = Release; 459 | }; 460 | 13CAAFF41B57895300CAD02F /* Debug */ = { 461 | isa = XCBuildConfiguration; 462 | buildSettings = { 463 | BUNDLE_LOADER = "$(TEST_HOST)"; 464 | FRAMEWORK_SEARCH_PATHS = ( 465 | "$(SDKROOT)/Developer/Library/Frameworks", 466 | "$(inherited)", 467 | ); 468 | GCC_PREPROCESSOR_DEFINITIONS = ( 469 | "DEBUG=1", 470 | "$(inherited)", 471 | ); 472 | INFOPLIST_FILE = "TLCollectionViewLineLayout-DemoTests/Info.plist"; 473 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 474 | PRODUCT_NAME = "$(TARGET_NAME)"; 475 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TLCollectionViewLineLayout-Demo.app/TLCollectionViewLineLayout-Demo"; 476 | }; 477 | name = Debug; 478 | }; 479 | 13CAAFF51B57895300CAD02F /* Release */ = { 480 | isa = XCBuildConfiguration; 481 | buildSettings = { 482 | BUNDLE_LOADER = "$(TEST_HOST)"; 483 | FRAMEWORK_SEARCH_PATHS = ( 484 | "$(SDKROOT)/Developer/Library/Frameworks", 485 | "$(inherited)", 486 | ); 487 | INFOPLIST_FILE = "TLCollectionViewLineLayout-DemoTests/Info.plist"; 488 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 489 | PRODUCT_NAME = "$(TARGET_NAME)"; 490 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TLCollectionViewLineLayout-Demo.app/TLCollectionViewLineLayout-Demo"; 491 | }; 492 | name = Release; 493 | }; 494 | /* End XCBuildConfiguration section */ 495 | 496 | /* Begin XCConfigurationList section */ 497 | 13CAAFC81B57895300CAD02F /* Build configuration list for PBXProject "TLCollectionViewLineLayout-Demo" */ = { 498 | isa = XCConfigurationList; 499 | buildConfigurations = ( 500 | 13CAAFEE1B57895300CAD02F /* Debug */, 501 | 13CAAFEF1B57895300CAD02F /* Release */, 502 | ); 503 | defaultConfigurationIsVisible = 0; 504 | defaultConfigurationName = Release; 505 | }; 506 | 13CAAFF01B57895300CAD02F /* Build configuration list for PBXNativeTarget "TLCollectionViewLineLayout-Demo" */ = { 507 | isa = XCConfigurationList; 508 | buildConfigurations = ( 509 | 13CAAFF11B57895300CAD02F /* Debug */, 510 | 13CAAFF21B57895300CAD02F /* Release */, 511 | ); 512 | defaultConfigurationIsVisible = 0; 513 | defaultConfigurationName = Release; 514 | }; 515 | 13CAAFF31B57895300CAD02F /* Build configuration list for PBXNativeTarget "TLCollectionViewLineLayout-DemoTests" */ = { 516 | isa = XCConfigurationList; 517 | buildConfigurations = ( 518 | 13CAAFF41B57895300CAD02F /* Debug */, 519 | 13CAAFF51B57895300CAD02F /* Release */, 520 | ); 521 | defaultConfigurationIsVisible = 0; 522 | defaultConfigurationName = Release; 523 | }; 524 | /* End XCConfigurationList section */ 525 | }; 526 | rootObject = 13CAAFC51B57895300CAD02F /* Project object */; 527 | } 528 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo.xcodeproj/xcuserdata/andezhou.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo.xcodeproj/xcuserdata/andezhou.xcuserdatad/xcschemes/TLCollectionViewLineLayout-Demo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 77 | 83 | 84 | 85 | 86 | 87 | 88 | 94 | 96 | 102 | 103 | 104 | 105 | 107 | 108 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo.xcodeproj/xcuserdata/andezhou.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | TLCollectionViewLineLayout-Demo.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 13CAAFCC1B57895300CAD02F 16 | 17 | primary 18 | 19 | 20 | 13CAAFE51B57895300CAD02F 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo.xcworkspace/xcshareddata/TLCollectionViewLineLayout-Demo.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | F0367828-84FF-4C8F-BA8C-26580251A45D 9 | IDESourceControlProjectName 10 | TLCollectionViewLineLayout-Demo 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | EF0F6F3437364402707A6DFB9CF4E568C084C50C 14 | https://github.com/zhouande/TLCollectionViewLineLayout.git 15 | 16 | IDESourceControlProjectPath 17 | TLCollectionViewLineLayout-Demo.xcworkspace 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | EF0F6F3437364402707A6DFB9CF4E568C084C50C 21 | .. 22 | 23 | IDESourceControlProjectURL 24 | https://github.com/zhouande/TLCollectionViewLineLayout.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | EF0F6F3437364402707A6DFB9CF4E568C084C50C 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | EF0F6F3437364402707A6DFB9CF4E568C084C50C 36 | IDESourceControlWCCName 37 | TLCollectionViewLineLayout-master 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo.xcworkspace/xcuserdata/andezhou.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouande/TLCollectionViewLineLayout/47af9c28d6709d5b91dfdf06e95f44ab3c8236f4/TLCollectionViewLineLayout-Demo.xcworkspace/xcuserdata/andezhou.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo.xcworkspace/xcuserdata/andezhou.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // TLCollectionViewLineLayout-Demo 4 | // 5 | // Created by andezhou on 15/7/16. 6 | // Copyright (c) 2015年 andezhou. 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 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // TLCollectionViewLineLayout-Demo 4 | // 5 | // Created by andezhou on 15/7/16. 6 | // Copyright (c) 2015年 andezhou. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | #import "TLCollectionViewLineLayout.h" 11 | #import "TLCollectionViewController.h" 12 | 13 | @interface AppDelegate () 14 | 15 | @end 16 | 17 | @implementation AppDelegate 18 | 19 | 20 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 21 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 22 | self.window.backgroundColor = [UIColor whiteColor]; 23 | 24 | 25 | self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:[[TLCollectionViewController alloc] init]]; 26 | 27 | [self.window makeKeyAndVisible]; 28 | 29 | return YES; 30 | } 31 | 32 | - (void)applicationWillResignActive:(UIApplication *)application { 33 | // 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. 34 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 35 | } 36 | 37 | - (void)applicationDidEnterBackground:(UIApplication *)application { 38 | // 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. 39 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 40 | } 41 | 42 | - (void)applicationWillEnterForeground:(UIApplication *)application { 43 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 44 | } 45 | 46 | - (void)applicationDidBecomeActive:(UIApplication *)application { 47 | // 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. 48 | } 49 | 50 | - (void)applicationWillTerminate:(UIApplication *)application { 51 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 52 | } 53 | 54 | @end 55 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo/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 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo/Images.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 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.AMeD.hospitalMeeting.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo/TLCollectionViewCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // TLCollectionViewCell.h 3 | // TLCollectionViewLineLayout-Demo 4 | // 5 | // Created by andezhou on 15/7/16. 6 | // Copyright (c) 2015年 andezhou. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TLCollectionViewCell : UICollectionViewCell 12 | 13 | @property (nonatomic, strong) UIImageView *imageView; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo/TLCollectionViewCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // TLCollectionViewCell.m 3 | // TLCollectionViewLineLayout-Demo 4 | // 5 | // Created by andezhou on 15/7/16. 6 | // Copyright (c) 2015年 andezhou. All rights reserved. 7 | // 8 | 9 | #import "TLCollectionViewCell.h" 10 | 11 | @implementation TLCollectionViewCell 12 | 13 | #pragma mark - 14 | #pragma mark init methods 15 | - (UIImageView *)imageView { 16 | if (!_imageView) { 17 | _imageView = [[UIImageView alloc] initWithFrame:self.bounds]; 18 | } 19 | return _imageView; 20 | } 21 | 22 | #pragma mark - 23 | #pragma mark lifecycle 24 | - (instancetype)initWithFrame:(CGRect)frame { 25 | self = [super initWithFrame:frame]; 26 | if (self) { 27 | [self.contentView addSubview:self.imageView]; 28 | } 29 | return self; 30 | } 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo/TLCollectionViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TLCollectionViewController.h 3 | // TLCollectionViewLineLayout-Demo 4 | // 5 | // Created by andezhou on 15/7/16. 6 | // Copyright (c) 2015年 andezhou. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TLCollectionViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo/TLCollectionViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // TLCollectionViewController.m 3 | // TLCollectionViewLineLayout-Demo 4 | // 5 | // Created by andezhou on 15/7/16. 6 | // Copyright (c) 2015年 andezhou. All rights reserved. 7 | // 8 | 9 | #import "TLCollectionViewController.h" 10 | #import "FXBlurView.h" 11 | #import "TLCollectionViewCell.h" 12 | #import "TLCollectionViewLineLayout.h" 13 | 14 | static NSString * const reuseIdentifier = @"Cell"; 15 | 16 | @interface TLCollectionViewController () 17 | 18 | @property (nonatomic, strong) UIImageView *imageView; 19 | @property (nonatomic, strong) UICollectionView *collectionView; 20 | @property (nonatomic, strong) TLCollectionViewLineLayout *lineLayout; 21 | 22 | @end 23 | 24 | @implementation TLCollectionViewController 25 | 26 | #pragma mark - 27 | #pragma mark lifecycle 28 | - (void)viewDidLoad { 29 | [super viewDidLoad]; 30 | self.title = @"TLCollectionViewLineLayout"; 31 | 32 | [self.view addSubview:self.collectionView]; 33 | 34 | // Do any additional setup after loading the view. 35 | } 36 | 37 | #pragma mark - 38 | #pragma mark init methods 39 | - (UIImageView *)imageView { 40 | if (!_imageView) { 41 | _imageView = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 42 | _imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"bg%zi.jpg", 7%3]]; 43 | FXBlurView *blurView = [[FXBlurView alloc] initWithFrame:_imageView.bounds]; 44 | blurView.blurRadius = 10; 45 | blurView.tintColor = [UIColor clearColor]; 46 | [_imageView addSubview:blurView]; 47 | } 48 | return _imageView; 49 | } 50 | 51 | - (UICollectionView *)collectionView { 52 | if (!_collectionView) { 53 | _lineLayout = [[TLCollectionViewLineLayout alloc] init]; 54 | _collectionView = [[UICollectionView alloc] initWithFrame:[UIScreen mainScreen].bounds 55 | collectionViewLayout:_lineLayout]; 56 | _collectionView.backgroundColor = [UIColor whiteColor]; 57 | _collectionView.showsHorizontalScrollIndicator = NO; 58 | _collectionView.dataSource = self; 59 | _collectionView.delegate = self; 60 | _collectionView.backgroundView = self.imageView; 61 | [_collectionView registerClass:[TLCollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier]; 62 | [_collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:7 inSection:0] 63 | atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally 64 | animated:YES]; 65 | } 66 | return _collectionView; 67 | } 68 | 69 | #pragma mark - 70 | #pragma mark UIScrollViewDelegate 71 | -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { 72 | CGFloat offsetX = scrollView.contentOffset.x; 73 | CGFloat width = self.lineLayout.itemSize.width + self.lineLayout.minimumLineSpacing; 74 | NSInteger item = offsetX/width; 75 | NSString *imageName1 = [NSString stringWithFormat:@"bg%zi.jpg", item%3]; 76 | 77 | __weak typeof(self) weakSelf = self; 78 | [UIView animateWithDuration:.5f animations:^{ 79 | weakSelf.imageView.image = [UIImage imageNamed:imageName1]; 80 | }]; 81 | } 82 | 83 | #pragma mark - 84 | #pragma mark UICollectionViewDatasoure 85 | - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { 86 | return 30; 87 | } 88 | 89 | - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 90 | TLCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath]; 91 | 92 | NSString *imageName = [NSString stringWithFormat:@"bg%zi.jpg", indexPath.item%3]; 93 | cell.imageView.image = [UIImage imageNamed:imageName]; 94 | 95 | return cell; 96 | } 97 | 98 | 99 | 100 | @end 101 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo/TLCollectionViewLineLayout.h: -------------------------------------------------------------------------------- 1 | // 2 | // TLCollectionViewLineLayout.h 3 | // TLCollectionViewLineLayout-Demo 4 | // 5 | // Created by andezhou on 15/7/16. 6 | // Copyright (c) 2015年 andezhou. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TLCollectionViewLineLayout : UICollectionViewFlowLayout 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo/TLCollectionViewLineLayout.m: -------------------------------------------------------------------------------- 1 | // 2 | // TLCollectionViewLineLayout.m 3 | // TLCollectionViewLineLayout-Demo 4 | // 5 | // Created by andezhou on 15/7/16. 6 | // Copyright (c) 2015年 andezhou. All rights reserved. 7 | // 8 | 9 | #import "TLCollectionViewLineLayout.h" 10 | 11 | #define kScreenWidth [UIScreen mainScreen].bounds.size.width 12 | #define kScreenHeight [UIScreen mainScreen].bounds.size.height 13 | 14 | #define ITEM_WIDTH kScreenWidth*0.6 15 | #define ITEM_HEIGHT kScreenHeight*0.5 16 | 17 | #define ACTIVE_DISTANCE 200 18 | #define ZOOM_FACTOR 0.3 19 | 20 | @implementation TLCollectionViewLineLayout 21 | 22 | -(id)init { 23 | self = [super init]; 24 | if (self) { 25 | CGFloat margin = (kScreenWidth - ITEM_WIDTH)/2.0; 26 | self.itemSize = CGSizeMake(ITEM_WIDTH, ITEM_HEIGHT); 27 | self.scrollDirection = UICollectionViewScrollDirectionHorizontal; 28 | self.sectionInset = UIEdgeInsetsMake(0, ABS(margin), 0, ABS(margin)); 29 | self.minimumLineSpacing = 50; 30 | } 31 | return self; 32 | } 33 | 34 | // 刷新布局 35 | - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)oldBounds { 36 | return YES; 37 | } 38 | 39 | // 当前item放大 40 | -(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect { 41 | NSArray *array = [super layoutAttributesForElementsInRect:rect]; 42 | 43 | CGRect visibleRect = CGRectZero; 44 | visibleRect.origin = self.collectionView.contentOffset; 45 | visibleRect.size = self.collectionView.bounds.size; 46 | 47 | // 遍历array中所有的UICollectionViewLayoutAttributes 48 | for (UICollectionViewLayoutAttributes *attributes in array) { 49 | 50 | if (CGRectIntersectsRect(attributes.frame, rect)) { 51 | 52 | CGFloat distance = CGRectGetMidX(visibleRect) - attributes.center.x; 53 | 54 | if (ABS(distance) < ACTIVE_DISTANCE) { 55 | CGFloat normalizedDistance = distance / ACTIVE_DISTANCE; 56 | CGFloat zoom = 1 + ZOOM_FACTOR*(1 - ABS(normalizedDistance)); 57 | 58 | attributes.transform3D = CATransform3DMakeScale(zoom, zoom, 1.0); 59 | attributes.zIndex = 1; 60 | } 61 | } 62 | } 63 | return array; 64 | } 65 | 66 | // 自动对齐到网格 67 | - (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset 68 | withScrollingVelocity:(CGPoint)velocity { 69 | // proposedContentOffset是没有对齐到网格时本来应该停下的位置 70 | CGRect targetRect = CGRectMake(proposedContentOffset.x, 0.0, self.collectionView.bounds.size.width, self.collectionView.bounds.size.height); 71 | NSArray *array = [super layoutAttributesForElementsInRect:targetRect]; 72 | 73 | CGFloat offsetAdjustment = MAXFLOAT; 74 | //理论上应cell停下来的中心点 75 | CGFloat horizontalCenter = proposedContentOffset.x + (CGRectGetWidth(self.collectionView.bounds) / 2.0); 76 | 77 | //对当前屏幕中的UICollectionViewLayoutAttributes逐个与屏幕中心进行比较,找出最接近中心的一个 78 | for (UICollectionViewLayoutAttributes* layoutAttributes in array) { 79 | 80 | CGFloat itemHorizontalCenter = layoutAttributes.center.x; 81 | if (ABS(itemHorizontalCenter - horizontalCenter) < ABS(offsetAdjustment)) { 82 | offsetAdjustment = itemHorizontalCenter - horizontalCenter; 83 | } 84 | } 85 | return CGPointMake(proposedContentOffset.x + offsetAdjustment, proposedContentOffset.y); 86 | } 87 | 88 | @end 89 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo/bg0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouande/TLCollectionViewLineLayout/47af9c28d6709d5b91dfdf06e95f44ab3c8236f4/TLCollectionViewLineLayout-Demo/bg0.jpg -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo/bg1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouande/TLCollectionViewLineLayout/47af9c28d6709d5b91dfdf06e95f44ab3c8236f4/TLCollectionViewLineLayout-Demo/bg1.jpg -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo/bg2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouande/TLCollectionViewLineLayout/47af9c28d6709d5b91dfdf06e95f44ab3c8236f4/TLCollectionViewLineLayout-Demo/bg2.jpg -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-Demo/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // TLCollectionViewLineLayout-Demo 4 | // 5 | // Created by andezhou on 15/7/16. 6 | // Copyright (c) 2015年 andezhou. 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 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-DemoTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.AMeD.hospitalMeeting.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /TLCollectionViewLineLayout-DemoTests/TLCollectionViewLineLayout_DemoTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // TLCollectionViewLineLayout_DemoTests.m 3 | // TLCollectionViewLineLayout-DemoTests 4 | // 5 | // Created by andezhou on 15/7/16. 6 | // Copyright (c) 2015年 andezhou. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface TLCollectionViewLineLayout_DemoTests : XCTestCase 13 | 14 | @end 15 | 16 | @implementation TLCollectionViewLineLayout_DemoTests 17 | 18 | - (void)setUp { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown { 24 | // Put teardown code here. This method is called after the invocation of each test method in the class. 25 | [super tearDown]; 26 | } 27 | 28 | - (void)testExample { 29 | // This is an example of a functional test case. 30 | XCTAssert(YES, @"Pass"); 31 | } 32 | 33 | - (void)testPerformanceExample { 34 | // This is an example of a performance test case. 35 | [self measureBlock:^{ 36 | // Put the code you want to measure the time of here. 37 | }]; 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /podfile: -------------------------------------------------------------------------------- 1 | platform :ios, '7.0' 2 | pod 'FXBlurView' --------------------------------------------------------------------------------