├── InfiniteScrollPicker ├── InfiniteScrollPicker.h ├── InfiniteScrollPicker.m ├── UIView+viewController.h └── UIView+viewController.m ├── InfiniteScrollPickerExample ├── InfiniteScrollPickerExample.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ ├── xcshareddata │ │ │ └── InfiniteScrollPickerExample.xccheckout │ │ └── xcuserdata │ │ │ └── seitk.xcuserdatad │ │ │ ├── UserInterfaceState.xcuserstate │ │ │ └── WorkspaceSettings.xcsettings │ └── xcuserdata │ │ └── seitk.xcuserdatad │ │ └── xcschemes │ │ ├── InfiniteScrollPickerExample.xcscheme │ │ └── xcschememanagement.plist ├── InfiniteScrollPickerExample │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Default-568h@2x.png │ ├── Default.png │ ├── Default@2x.png │ ├── InfiniteScrollPickerExample-Info.plist │ ├── InfiniteScrollPickerExample-Prefix.pch │ ├── ViewController.h │ ├── ViewController.m │ ├── en.lproj │ │ ├── InfoPlist.strings │ │ └── ViewController.xib │ └── main.m ├── appicon.png ├── appicon@2x.png └── libraries │ └── FlatUIKit │ ├── FUIAlertView.h │ ├── FUIAlertView.m │ ├── FUIButton.h │ ├── FUIButton.m │ ├── FUISegmentedControl.h │ ├── FUISegmentedControl.m │ ├── FUISwitch.h │ ├── FUISwitch.m │ ├── UIBarButtonItem+FlatUI.h │ ├── UIBarButtonItem+FlatUI.m │ ├── UIColor+FlatUI.h │ ├── UIColor+FlatUI.m │ ├── UIFont+FlatUI.h │ ├── UIFont+FlatUI.m │ ├── UIImage+FlatUI.h │ ├── UIImage+FlatUI.m │ ├── UINavigationBar+FlatUI.h │ ├── UINavigationBar+FlatUI.m │ ├── UIProgressView+FlatUI.h │ ├── UIProgressView+FlatUI.m │ ├── UISlider+FlatUI.h │ ├── UISlider+FlatUI.m │ ├── UIStepper+FlatUI.h │ ├── UIStepper+FlatUI.m │ ├── UITabBar+FlatUI.h │ └── UITabBar+FlatUI.m ├── README.md ├── Resources ├── Set1 │ ├── s1_0.png │ ├── s1_1.png │ ├── s1_2.png │ ├── s1_3.png │ ├── s1_4.png │ └── s1_5.png ├── Set2 │ ├── s2_1.png │ ├── s2_10.png │ ├── s2_2.png │ ├── s2_3.png │ ├── s2_4.png │ ├── s2_5.png │ ├── s2_6.png │ ├── s2_7.png │ ├── s2_8.png │ └── s2_9.png ├── Set3 │ ├── s3_0.jpeg │ ├── s3_1.jpeg │ ├── s3_10.jpeg │ ├── s3_11.jpeg │ ├── s3_12.jpeg │ ├── s3_13.jpeg │ ├── s3_14.jpeg │ ├── s3_15.jpeg │ ├── s3_16.jpeg │ ├── s3_17.jpeg │ ├── s3_18.jpeg │ ├── s3_19.jpeg │ ├── s3_2.jpeg │ ├── s3_3.jpeg │ ├── s3_4.jpeg │ ├── s3_5.jpeg │ ├── s3_6.jpeg │ ├── s3_7.jpeg │ ├── s3_8.jpeg │ ├── s3_9.jpeg │ └── s3_bg.jpg ├── appicon.png └── appicon@2x.png ├── emodex.jpg └── screenshot0.png /InfiniteScrollPicker/InfiniteScrollPicker.h: -------------------------------------------------------------------------------- 1 | // 2 | // InfiniteScrollPicker.h 3 | // InfiniteScrollPickerExample 4 | // 5 | // Created by Philip Yu on 6/6/13. 6 | // Copyright (c) 2013 Philip Yu. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class InfiniteScrollPicker; 12 | 13 | @interface InfiniteScrollPicker : UIScrollView 14 | { 15 | NSMutableArray *imageStore; 16 | bool snapping; 17 | float lastSnappingX; 18 | } 19 | 20 | @property (nonatomic, strong) NSArray *imageAry; 21 | @property (nonatomic) CGSize itemSize; 22 | @property (nonatomic) float alphaOfobjs; 23 | 24 | @property (nonatomic) float heightOffset; 25 | @property (nonatomic) float positionRatio; 26 | 27 | - (void)initInfiniteScrollView; 28 | - (void)setSelectedItem:(int)index; 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /InfiniteScrollPicker/InfiniteScrollPicker.m: -------------------------------------------------------------------------------- 1 | // 2 | // InfiniteScrollPicker.m 3 | // InfiniteScrollPickerExample 4 | // 5 | // Created by Philip Yu on 6/6/13. 6 | // Copyright (c) 2013 Philip Yu. All rights reserved. 7 | // 8 | 9 | #import "InfiniteScrollPicker.h" 10 | #import "UIView+viewController.h" 11 | 12 | @implementation InfiniteScrollPicker 13 | 14 | @synthesize imageAry = _imageAry; 15 | @synthesize itemSize = _itemSize; 16 | @synthesize alphaOfobjs; 17 | @synthesize heightOffset; 18 | @synthesize positionRatio; 19 | 20 | - (id)initWithFrame:(CGRect)frame 21 | { 22 | self = [super initWithFrame:frame]; 23 | if (self) { 24 | // Initialization code 25 | 26 | alphaOfobjs = 1.0; 27 | heightOffset = 0.0; 28 | positionRatio = 1.0; 29 | 30 | _imageAry = [[NSMutableArray alloc] init]; 31 | imageStore = [[NSMutableArray alloc] init]; 32 | } 33 | return self; 34 | } 35 | 36 | - (void)initInfiniteScrollView 37 | { 38 | [self initInfiniteScrollViewWithSelectedItem:0]; 39 | } 40 | 41 | - (void)initInfiniteScrollViewWithSelectedItem:(int)index 42 | { 43 | if (_itemSize.width == 0 && _itemSize.height == 0) { 44 | if (_imageAry.count > 0) _itemSize = [(UIImage *)[_imageAry objectAtIndex:0] size]; 45 | else _itemSize = CGSizeMake(self.frame.size.height/2, self.frame.size.height/2); 46 | } 47 | 48 | NSAssert((_itemSize.height < self.frame.size.height), @"item's height must not bigger than scrollpicker's height"); 49 | 50 | self.pagingEnabled = NO; 51 | self.showsHorizontalScrollIndicator = NO; 52 | self.showsVerticalScrollIndicator = NO; 53 | 54 | if (_imageAry.count > 0) 55 | { 56 | 57 | // Init 5 set of images, 3 for user selection, 2 for 58 | for (int i = 0; i < (_imageAry.count*5); i++) 59 | { 60 | // Place images into the bottom of view 61 | UIImageView *temp = [[UIImageView alloc] initWithFrame:CGRectMake(i * _itemSize.width, self.frame.size.height - _itemSize.height, _itemSize.width, _itemSize.height)]; 62 | temp.image = [_imageAry objectAtIndex:i%_imageAry.count]; 63 | [imageStore addObject:temp]; 64 | [self addSubview:temp]; 65 | } 66 | 67 | self.contentSize = CGSizeMake(_imageAry.count * 5 * _itemSize.width, self.frame.size.height); 68 | 69 | float viewMiddle = _imageAry.count * 2 * _itemSize.width - self.frame.size.width/2 + _itemSize.width + (_itemSize.width * index); 70 | [self setContentOffset:CGPointMake(viewMiddle, 0)]; 71 | 72 | self.delegate = self; 73 | 74 | dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 75 | dispatch_async(queue, ^ { 76 | [self reloadView:viewMiddle]; 77 | dispatch_async(dispatch_get_main_queue(), ^ { 78 | [self snapToAnEmotion]; 79 | }); 80 | }); 81 | 82 | } 83 | 84 | } 85 | 86 | - (void)setImageAry:(NSArray *)imageAry 87 | { 88 | _imageAry = imageAry; 89 | [self initInfiniteScrollView]; 90 | } 91 | 92 | - (void)setItemSize:(CGSize)itemSize 93 | { 94 | itemSize = itemSize; 95 | [self initInfiniteScrollView]; 96 | } 97 | 98 | - (void)setSelectedItem:(int)index 99 | { 100 | [self initInfiniteScrollViewWithSelectedItem:index]; 101 | } 102 | 103 | - (void)layoutSubviews { 104 | [super layoutSubviews]; 105 | 106 | if (self.contentOffset.x > 0) 107 | { 108 | float sectionSize = _imageAry.count * _itemSize.width; 109 | 110 | if (self.contentOffset.x <= (sectionSize - sectionSize/2)) 111 | { 112 | self.contentOffset = CGPointMake(sectionSize * 2 - sectionSize/2, 0); 113 | } else if (self.contentOffset.x >= (sectionSize * 3 + sectionSize/2)) { 114 | self.contentOffset = CGPointMake(sectionSize * 2 + sectionSize/2, 0); 115 | } 116 | 117 | [self reloadView:self.contentOffset.x]; 118 | } 119 | } 120 | 121 | - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 122 | { 123 | if (decelerate == 0 && !snapping) [self snapToAnEmotion]; 124 | } 125 | 126 | - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 127 | { 128 | if (!snapping) [self snapToAnEmotion]; 129 | } 130 | 131 | - (void)reloadView:(float)offset 132 | { 133 | float biggestSize = 0; 134 | id biggestView; 135 | 136 | for (int i = 0; i < imageStore.count; i++) { 137 | 138 | UIImageView *view = [imageStore objectAtIndex:i]; 139 | 140 | if (view.center.x > (offset - _itemSize.width ) && view.center.x < (offset + self.frame.size.width + _itemSize.width)) 141 | { 142 | float tOffset = (view.center.x - offset) - self.frame.size.width/4; 143 | 144 | if (tOffset < 0 || tOffset > self.frame.size.width) tOffset = 0; 145 | float addHeight = [self calculateFrameHeightByOffset:tOffset]; 146 | 147 | if (addHeight < 0) addHeight = 0; 148 | 149 | view.frame = CGRectMake(view.frame.origin.x, 150 | self.frame.size.height - _itemSize.height - heightOffset - (addHeight/positionRatio), 151 | _itemSize.width + addHeight, 152 | _itemSize.height + addHeight); 153 | 154 | if (((view.frame.origin.x + view.frame.size.width) - view.frame.origin.x) > biggestSize) 155 | { 156 | biggestSize = ((view.frame.origin.x + view.frame.size.width) - view.frame.origin.x); 157 | biggestView = view; 158 | } 159 | 160 | } else { 161 | view.frame = CGRectMake(view.frame.origin.x, self.frame.size.height, _itemSize.width, _itemSize.height); 162 | for (UIImageView *imageView in view.subviews) 163 | { 164 | imageView.frame = CGRectMake(0, 0, view.frame.size.width, view.frame.size.height); 165 | } 166 | } 167 | } 168 | 169 | for (int i = 0; i < imageStore.count; i++) 170 | { 171 | UIView *cBlock = [imageStore objectAtIndex:i]; 172 | cBlock.alpha = alphaOfobjs; 173 | 174 | if (i > 0) 175 | { 176 | UIView *pBlock = [imageStore objectAtIndex:i-1]; 177 | cBlock.frame = CGRectMake(pBlock.frame.origin.x + pBlock.frame.size.width, cBlock.frame.origin.y, cBlock.frame.size.width, cBlock.frame.size.height); 178 | } 179 | } 180 | 181 | [(UIView *)biggestView setAlpha:1.0]; 182 | } 183 | 184 | -(float)calculateFrameHeightByOffset:(float)offset 185 | { 186 | return (-1 * fabsf((offset)*2 - self.frame.size.width/2) + self.frame.size.width/2)/4; 187 | } 188 | 189 | - (void)snapToAnEmotion 190 | { 191 | float biggestSize = 0; 192 | UIImageView *biggestView; 193 | 194 | snapping = YES; 195 | 196 | float offset = self.contentOffset.x; 197 | 198 | for (int i = 0; i < imageStore.count; i++) { 199 | UIImageView *view = [imageStore objectAtIndex:i]; 200 | 201 | if (view.center.x > offset && view.center.x < (offset + self.frame.size.width)) 202 | { 203 | if (((view.center.x + view.frame.size.width) - view.center.x) > biggestSize) 204 | { 205 | biggestSize = ((view.frame.origin.x + view.frame.size.width) - view.frame.origin.x); 206 | biggestView = view; 207 | } 208 | 209 | } 210 | } 211 | 212 | float biggestViewX = biggestView.frame.origin.x + biggestView.frame.size.width/2 - self.frame.size.width/2; 213 | float dX = self.contentOffset.x - biggestViewX; 214 | float newX = self.contentOffset.x - dX/1.4; 215 | 216 | // Disable scrolling when snapping to new location 217 | dispatch_queue_t queue = dispatch_get_main_queue(); 218 | dispatch_async(queue, ^ { 219 | [self setScrollEnabled:NO]; 220 | [self scrollRectToVisible:CGRectMake(newX, 0, self.frame.size.width, 1) animated:YES]; 221 | 222 | dispatch_async(dispatch_get_main_queue(), ^ { 223 | 224 | SEL selector = @selector(infiniteScrollPicker:didSelectAtImage:); 225 | if ([[self firstAvailableUIViewController] respondsToSelector:selector]) 226 | { 227 | #pragma clang diagnostic push 228 | #pragma clang diagnostic ignored "-Warc-performSelector-leaks" 229 | [[self firstAvailableUIViewController] performSelector:selector withObject:self withObject:biggestView.image]; 230 | #pragma clang diagnostic pop 231 | } 232 | 233 | [self setScrollEnabled:YES]; 234 | snapping = 0; 235 | }); 236 | }); 237 | } 238 | 239 | @end 240 | -------------------------------------------------------------------------------- /InfiniteScrollPicker/UIView+viewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+viewController.h 3 | // FB Gallery 4 | // 5 | // Created by Philip Yu on 5/3/13. 6 | // Copyright (c) 2013 Philip Yu. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UIView (viewController) 12 | 13 | - (UIViewController *) firstAvailableUIViewController; 14 | - (float) findViewOffsetToSuperviewClass:(Class)class; 15 | - (void) shiftViewPositionY:(float)offset; 16 | + (UIImageView*)screenshotForScreen; 17 | + (UIImageView*)screenshotForView:(UIView*) view; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /InfiniteScrollPicker/UIView+viewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+viewController.m 3 | // FB Gallery 4 | // 5 | // Created by Philip Yu on 5/3/13. 6 | // Copyright (c) 2013 Philip Yu. All rights reserved. 7 | // 8 | 9 | #import "UIView+viewController.h" 10 | #import 11 | 12 | @implementation UIView (viewController) 13 | 14 | - (UIViewController *) firstAvailableUIViewController { 15 | // convenience function for casting and to "mask" the recursive function 16 | return (UIViewController *)[self traverseResponderChainForUIViewController]; 17 | } 18 | 19 | - (id) traverseResponderChainForUIViewController { 20 | id nextResponder = [self nextResponder]; 21 | if ([nextResponder isKindOfClass:[UIViewController class]]) { 22 | return nextResponder; 23 | } else if ([nextResponder isKindOfClass:[UIView class]]) { 24 | return [nextResponder traverseResponderChainForUIViewController]; 25 | } else { 26 | return nil; 27 | } 28 | } 29 | 30 | - (float) traverseViewChainForView:(UIView *)view toViewClass:(Class)class offset:(float)offset 31 | { 32 | if ([view.superview isKindOfClass:class]) 33 | { 34 | return view.superview.frame.origin.y + offset; 35 | } else if ([view.superview isKindOfClass:[UIView class]]) { 36 | return [self traverseViewChainForView:view.superview toViewClass:class offset:view.superview.frame.origin.y + offset]; 37 | } else { 38 | return offset; 39 | } 40 | } 41 | 42 | - (float) findViewOffsetToSuperviewClass:(Class)class 43 | { 44 | return [self traverseViewChainForView:self toViewClass:class offset:0]; 45 | } 46 | 47 | - (void) shiftViewPositionY:(float)offset 48 | { 49 | CGRect tempFrame = self.frame; 50 | tempFrame.origin.y += offset; 51 | [self setFrame:tempFrame]; 52 | } 53 | 54 | + (UIImageView*)screenshotForScreen{ 55 | UIView *view = [UIApplication sharedApplication].keyWindow; 56 | 57 | UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, [[UIScreen mainScreen] scale]); 58 | 59 | [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 60 | UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 61 | UIGraphicsEndImageContext(); 62 | 63 | CGFloat barHeight = [[UIApplication sharedApplication] statusBarFrame].size.height; 64 | 65 | if ([UIApplication sharedApplication].statusBarHidden == NO) { 66 | 67 | CGFloat scale = [[UIScreen mainScreen] scale]; 68 | CGRect rect = CGRectMake(0, barHeight * scale, view.bounds.size.width * scale, (view.bounds.size.height - barHeight) * scale); 69 | CGImageRef imageRef = CGImageCreateWithImageInRect(image.CGImage, rect); 70 | image = [UIImage imageWithCGImage:imageRef scale:image.scale orientation:image.imageOrientation]; 71 | } 72 | 73 | UIImageView* screenshot = [[UIImageView alloc] initWithImage:image]; 74 | screenshot.frame = CGRectMake(0, 0, view.bounds.size.width, view.bounds.size.height - barHeight); 75 | 76 | return screenshot; 77 | } 78 | 79 | + (UIImageView*)screenshotForView:(UIView*) view { 80 | 81 | bool viewHidden = 0; 82 | 83 | if (view.hidden == YES) { 84 | viewHidden = 1; 85 | [view setHidden:NO]; 86 | } 87 | 88 | UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, [[UIScreen mainScreen] scale]); 89 | 90 | [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 91 | UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 92 | UIGraphicsEndImageContext(); 93 | 94 | // if ([UIApplication sharedApplication].statusBarHidden == NO) { 95 | // CGFloat barHeight = [[UIApplication sharedApplication] statusBarFrame].size.height; 96 | // CGFloat scale = [[UIScreen mainScreen] scale]; 97 | // CGRect rect = CGRectMake(0, barHeight * scale, view.bounds.size.width * scale, (view.bounds.size.height - barHeight) * scale); 98 | // CGImageRef imageRef = CGImageCreateWithImageInRect(image.CGImage, rect); 99 | // image = [UIImage imageWithCGImage:imageRef scale:image.scale orientation:image.imageOrientation]; 100 | // } 101 | 102 | UIImageView* screenshot = [[UIImageView alloc] initWithImage:image]; 103 | screenshot.frame = CGRectMake(0, 0, view.bounds.size.width, view.bounds.size.height); 104 | 105 | if (viewHidden) [view setHidden:YES]; 106 | 107 | return screenshot; 108 | } 109 | 110 | @end 111 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/InfiniteScrollPickerExample.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 9B87EDF817641E7B00001F9F /* s1_0.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EDE717641E7B00001F9F /* s1_0.png */; }; 11 | 9B87EDF917641E7B00001F9F /* s1_1.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EDE817641E7B00001F9F /* s1_1.png */; }; 12 | 9B87EDFA17641E7B00001F9F /* s1_2.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EDE917641E7B00001F9F /* s1_2.png */; }; 13 | 9B87EDFB17641E7B00001F9F /* s1_3.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EDEA17641E7B00001F9F /* s1_3.png */; }; 14 | 9B87EDFC17641E7B00001F9F /* s1_4.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EDEB17641E7B00001F9F /* s1_4.png */; }; 15 | 9B87EDFD17641E7B00001F9F /* s1_5.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EDEC17641E7B00001F9F /* s1_5.png */; }; 16 | 9B87EDFE17641E7B00001F9F /* s2_1.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EDEE17641E7B00001F9F /* s2_1.png */; }; 17 | 9B87EDFF17641E7B00001F9F /* s2_10.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EDEF17641E7B00001F9F /* s2_10.png */; }; 18 | 9B87EE0017641E7B00001F9F /* s2_2.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EDF017641E7B00001F9F /* s2_2.png */; }; 19 | 9B87EE0117641E7B00001F9F /* s2_3.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EDF117641E7B00001F9F /* s2_3.png */; }; 20 | 9B87EE0217641E7B00001F9F /* s2_4.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EDF217641E7B00001F9F /* s2_4.png */; }; 21 | 9B87EE0317641E7B00001F9F /* s2_5.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EDF317641E7B00001F9F /* s2_5.png */; }; 22 | 9B87EE0417641E7B00001F9F /* s2_6.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EDF417641E7B00001F9F /* s2_6.png */; }; 23 | 9B87EE0517641E7B00001F9F /* s2_7.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EDF517641E7B00001F9F /* s2_7.png */; }; 24 | 9B87EE0617641E7B00001F9F /* s2_8.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EDF617641E7B00001F9F /* s2_8.png */; }; 25 | 9B87EE0717641E7B00001F9F /* s2_9.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EDF717641E7B00001F9F /* s2_9.png */; }; 26 | 9B87EE1D1764218C00001F9F /* s3_0.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE091764218C00001F9F /* s3_0.jpeg */; }; 27 | 9B87EE1E1764218C00001F9F /* s3_1.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE0A1764218C00001F9F /* s3_1.jpeg */; }; 28 | 9B87EE1F1764218C00001F9F /* s3_10.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE0B1764218C00001F9F /* s3_10.jpeg */; }; 29 | 9B87EE201764218C00001F9F /* s3_11.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE0C1764218C00001F9F /* s3_11.jpeg */; }; 30 | 9B87EE211764218C00001F9F /* s3_12.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE0D1764218C00001F9F /* s3_12.jpeg */; }; 31 | 9B87EE221764218C00001F9F /* s3_13.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE0E1764218C00001F9F /* s3_13.jpeg */; }; 32 | 9B87EE231764218C00001F9F /* s3_14.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE0F1764218C00001F9F /* s3_14.jpeg */; }; 33 | 9B87EE241764218C00001F9F /* s3_15.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE101764218C00001F9F /* s3_15.jpeg */; }; 34 | 9B87EE251764218C00001F9F /* s3_16.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE111764218C00001F9F /* s3_16.jpeg */; }; 35 | 9B87EE261764218C00001F9F /* s3_17.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE121764218C00001F9F /* s3_17.jpeg */; }; 36 | 9B87EE271764218C00001F9F /* s3_18.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE131764218C00001F9F /* s3_18.jpeg */; }; 37 | 9B87EE281764218C00001F9F /* s3_19.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE141764218C00001F9F /* s3_19.jpeg */; }; 38 | 9B87EE291764218C00001F9F /* s3_2.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE151764218C00001F9F /* s3_2.jpeg */; }; 39 | 9B87EE2A1764218C00001F9F /* s3_3.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE161764218C00001F9F /* s3_3.jpeg */; }; 40 | 9B87EE2B1764218C00001F9F /* s3_4.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE171764218C00001F9F /* s3_4.jpeg */; }; 41 | 9B87EE2C1764218C00001F9F /* s3_5.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE181764218C00001F9F /* s3_5.jpeg */; }; 42 | 9B87EE2D1764218C00001F9F /* s3_6.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE191764218C00001F9F /* s3_6.jpeg */; }; 43 | 9B87EE2E1764218C00001F9F /* s3_7.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE1A1764218C00001F9F /* s3_7.jpeg */; }; 44 | 9B87EE2F1764218C00001F9F /* s3_8.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE1B1764218C00001F9F /* s3_8.jpeg */; }; 45 | 9B87EE301764218C00001F9F /* s3_9.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE1C1764218C00001F9F /* s3_9.jpeg */; }; 46 | 9B87EE321764297C00001F9F /* s3_bg.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 9B87EE311764297C00001F9F /* s3_bg.jpg */; }; 47 | 9B87EE3617642D6400001F9F /* UIView+viewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B87EE3517642D6400001F9F /* UIView+viewController.m */; }; 48 | 9BB4362F1760D38C00102EF4 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9BB4362E1760D38C00102EF4 /* UIKit.framework */; }; 49 | 9BB436311760D38C00102EF4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9BB436301760D38C00102EF4 /* Foundation.framework */; }; 50 | 9BB436331760D38C00102EF4 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9BB436321760D38C00102EF4 /* CoreGraphics.framework */; }; 51 | 9BB436391760D38C00102EF4 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 9BB436371760D38C00102EF4 /* InfoPlist.strings */; }; 52 | 9BB4363B1760D38C00102EF4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BB4363A1760D38C00102EF4 /* main.m */; }; 53 | 9BB4363F1760D38C00102EF4 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BB4363E1760D38C00102EF4 /* AppDelegate.m */; }; 54 | 9BB436411760D38C00102EF4 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BB436401760D38C00102EF4 /* Default.png */; }; 55 | 9BB436431760D38C00102EF4 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BB436421760D38C00102EF4 /* Default@2x.png */; }; 56 | 9BB436451760D38C00102EF4 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BB436441760D38C00102EF4 /* Default-568h@2x.png */; }; 57 | 9BB436481760D38C00102EF4 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BB436471760D38C00102EF4 /* ViewController.m */; }; 58 | 9BB4364B1760D38C00102EF4 /* ViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9BB436491760D38C00102EF4 /* ViewController.xib */; }; 59 | 9BB436541760D3C200102EF4 /* InfiniteScrollPicker.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BB436531760D3C200102EF4 /* InfiniteScrollPicker.m */; }; 60 | 9BCF8DC51770AE4900A283C4 /* appicon.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BCF8DC41770AE4900A283C4 /* appicon.png */; }; 61 | 9BCF8DC71770AE4B00A283C4 /* appicon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9BCF8DC61770AE4B00A283C4 /* appicon@2x.png */; }; 62 | /* End PBXBuildFile section */ 63 | 64 | /* Begin PBXFileReference section */ 65 | 9B87EDE717641E7B00001F9F /* s1_0.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = s1_0.png; sourceTree = ""; }; 66 | 9B87EDE817641E7B00001F9F /* s1_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = s1_1.png; sourceTree = ""; }; 67 | 9B87EDE917641E7B00001F9F /* s1_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = s1_2.png; sourceTree = ""; }; 68 | 9B87EDEA17641E7B00001F9F /* s1_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = s1_3.png; sourceTree = ""; }; 69 | 9B87EDEB17641E7B00001F9F /* s1_4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = s1_4.png; sourceTree = ""; }; 70 | 9B87EDEC17641E7B00001F9F /* s1_5.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = s1_5.png; sourceTree = ""; }; 71 | 9B87EDEE17641E7B00001F9F /* s2_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = s2_1.png; sourceTree = ""; }; 72 | 9B87EDEF17641E7B00001F9F /* s2_10.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = s2_10.png; sourceTree = ""; }; 73 | 9B87EDF017641E7B00001F9F /* s2_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = s2_2.png; sourceTree = ""; }; 74 | 9B87EDF117641E7B00001F9F /* s2_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = s2_3.png; sourceTree = ""; }; 75 | 9B87EDF217641E7B00001F9F /* s2_4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = s2_4.png; sourceTree = ""; }; 76 | 9B87EDF317641E7B00001F9F /* s2_5.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = s2_5.png; sourceTree = ""; }; 77 | 9B87EDF417641E7B00001F9F /* s2_6.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = s2_6.png; sourceTree = ""; }; 78 | 9B87EDF517641E7B00001F9F /* s2_7.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = s2_7.png; sourceTree = ""; }; 79 | 9B87EDF617641E7B00001F9F /* s2_8.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = s2_8.png; sourceTree = ""; }; 80 | 9B87EDF717641E7B00001F9F /* s2_9.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = s2_9.png; sourceTree = ""; }; 81 | 9B87EE091764218C00001F9F /* s3_0.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_0.jpeg; sourceTree = ""; }; 82 | 9B87EE0A1764218C00001F9F /* s3_1.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_1.jpeg; sourceTree = ""; }; 83 | 9B87EE0B1764218C00001F9F /* s3_10.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_10.jpeg; sourceTree = ""; }; 84 | 9B87EE0C1764218C00001F9F /* s3_11.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_11.jpeg; sourceTree = ""; }; 85 | 9B87EE0D1764218C00001F9F /* s3_12.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_12.jpeg; sourceTree = ""; }; 86 | 9B87EE0E1764218C00001F9F /* s3_13.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_13.jpeg; sourceTree = ""; }; 87 | 9B87EE0F1764218C00001F9F /* s3_14.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_14.jpeg; sourceTree = ""; }; 88 | 9B87EE101764218C00001F9F /* s3_15.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_15.jpeg; sourceTree = ""; }; 89 | 9B87EE111764218C00001F9F /* s3_16.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_16.jpeg; sourceTree = ""; }; 90 | 9B87EE121764218C00001F9F /* s3_17.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_17.jpeg; sourceTree = ""; }; 91 | 9B87EE131764218C00001F9F /* s3_18.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_18.jpeg; sourceTree = ""; }; 92 | 9B87EE141764218C00001F9F /* s3_19.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_19.jpeg; sourceTree = ""; }; 93 | 9B87EE151764218C00001F9F /* s3_2.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_2.jpeg; sourceTree = ""; }; 94 | 9B87EE161764218C00001F9F /* s3_3.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_3.jpeg; sourceTree = ""; }; 95 | 9B87EE171764218C00001F9F /* s3_4.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_4.jpeg; sourceTree = ""; }; 96 | 9B87EE181764218C00001F9F /* s3_5.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_5.jpeg; sourceTree = ""; }; 97 | 9B87EE191764218C00001F9F /* s3_6.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_6.jpeg; sourceTree = ""; }; 98 | 9B87EE1A1764218C00001F9F /* s3_7.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_7.jpeg; sourceTree = ""; }; 99 | 9B87EE1B1764218C00001F9F /* s3_8.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_8.jpeg; sourceTree = ""; }; 100 | 9B87EE1C1764218C00001F9F /* s3_9.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_9.jpeg; sourceTree = ""; }; 101 | 9B87EE311764297C00001F9F /* s3_bg.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = s3_bg.jpg; sourceTree = ""; }; 102 | 9B87EE3417642D6400001F9F /* UIView+viewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+viewController.h"; sourceTree = ""; }; 103 | 9B87EE3517642D6400001F9F /* UIView+viewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+viewController.m"; sourceTree = ""; }; 104 | 9BB4362B1760D38C00102EF4 /* InfiniteScrollPickerExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = InfiniteScrollPickerExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 105 | 9BB4362E1760D38C00102EF4 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 106 | 9BB436301760D38C00102EF4 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 107 | 9BB436321760D38C00102EF4 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 108 | 9BB436361760D38C00102EF4 /* InfiniteScrollPickerExample-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "InfiniteScrollPickerExample-Info.plist"; sourceTree = ""; }; 109 | 9BB436381760D38C00102EF4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 110 | 9BB4363A1760D38C00102EF4 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 111 | 9BB4363C1760D38C00102EF4 /* InfiniteScrollPickerExample-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "InfiniteScrollPickerExample-Prefix.pch"; sourceTree = ""; }; 112 | 9BB4363D1760D38C00102EF4 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 113 | 9BB4363E1760D38C00102EF4 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 114 | 9BB436401760D38C00102EF4 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; 115 | 9BB436421760D38C00102EF4 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; 116 | 9BB436441760D38C00102EF4 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 117 | 9BB436461760D38C00102EF4 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 118 | 9BB436471760D38C00102EF4 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 119 | 9BB4364A1760D38C00102EF4 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/ViewController.xib; sourceTree = ""; }; 120 | 9BB436521760D3C200102EF4 /* InfiniteScrollPicker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InfiniteScrollPicker.h; sourceTree = ""; }; 121 | 9BB436531760D3C200102EF4 /* InfiniteScrollPicker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InfiniteScrollPicker.m; sourceTree = ""; }; 122 | 9BCF8DC41770AE4900A283C4 /* appicon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = appicon.png; sourceTree = ""; }; 123 | 9BCF8DC61770AE4B00A283C4 /* appicon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon@2x.png"; sourceTree = ""; }; 124 | /* End PBXFileReference section */ 125 | 126 | /* Begin PBXFrameworksBuildPhase section */ 127 | 9BB436281760D38C00102EF4 /* Frameworks */ = { 128 | isa = PBXFrameworksBuildPhase; 129 | buildActionMask = 2147483647; 130 | files = ( 131 | 9BB4362F1760D38C00102EF4 /* UIKit.framework in Frameworks */, 132 | 9BB436311760D38C00102EF4 /* Foundation.framework in Frameworks */, 133 | 9BB436331760D38C00102EF4 /* CoreGraphics.framework in Frameworks */, 134 | ); 135 | runOnlyForDeploymentPostprocessing = 0; 136 | }; 137 | /* End PBXFrameworksBuildPhase section */ 138 | 139 | /* Begin PBXGroup section */ 140 | 9B87EDE617641E7B00001F9F /* Set1 */ = { 141 | isa = PBXGroup; 142 | children = ( 143 | 9B87EDE717641E7B00001F9F /* s1_0.png */, 144 | 9B87EDE817641E7B00001F9F /* s1_1.png */, 145 | 9B87EDE917641E7B00001F9F /* s1_2.png */, 146 | 9B87EDEA17641E7B00001F9F /* s1_3.png */, 147 | 9B87EDEB17641E7B00001F9F /* s1_4.png */, 148 | 9B87EDEC17641E7B00001F9F /* s1_5.png */, 149 | ); 150 | path = Set1; 151 | sourceTree = ""; 152 | }; 153 | 9B87EDED17641E7B00001F9F /* Set2 */ = { 154 | isa = PBXGroup; 155 | children = ( 156 | 9B87EDEE17641E7B00001F9F /* s2_1.png */, 157 | 9B87EDEF17641E7B00001F9F /* s2_10.png */, 158 | 9B87EDF017641E7B00001F9F /* s2_2.png */, 159 | 9B87EDF117641E7B00001F9F /* s2_3.png */, 160 | 9B87EDF217641E7B00001F9F /* s2_4.png */, 161 | 9B87EDF317641E7B00001F9F /* s2_5.png */, 162 | 9B87EDF417641E7B00001F9F /* s2_6.png */, 163 | 9B87EDF517641E7B00001F9F /* s2_7.png */, 164 | 9B87EDF617641E7B00001F9F /* s2_8.png */, 165 | 9B87EDF717641E7B00001F9F /* s2_9.png */, 166 | ); 167 | path = Set2; 168 | sourceTree = ""; 169 | }; 170 | 9B87EE081764218C00001F9F /* Set3 */ = { 171 | isa = PBXGroup; 172 | children = ( 173 | 9B87EE311764297C00001F9F /* s3_bg.jpg */, 174 | 9B87EE091764218C00001F9F /* s3_0.jpeg */, 175 | 9B87EE0A1764218C00001F9F /* s3_1.jpeg */, 176 | 9B87EE0B1764218C00001F9F /* s3_10.jpeg */, 177 | 9B87EE0C1764218C00001F9F /* s3_11.jpeg */, 178 | 9B87EE0D1764218C00001F9F /* s3_12.jpeg */, 179 | 9B87EE0E1764218C00001F9F /* s3_13.jpeg */, 180 | 9B87EE0F1764218C00001F9F /* s3_14.jpeg */, 181 | 9B87EE101764218C00001F9F /* s3_15.jpeg */, 182 | 9B87EE111764218C00001F9F /* s3_16.jpeg */, 183 | 9B87EE121764218C00001F9F /* s3_17.jpeg */, 184 | 9B87EE131764218C00001F9F /* s3_18.jpeg */, 185 | 9B87EE141764218C00001F9F /* s3_19.jpeg */, 186 | 9B87EE151764218C00001F9F /* s3_2.jpeg */, 187 | 9B87EE161764218C00001F9F /* s3_3.jpeg */, 188 | 9B87EE171764218C00001F9F /* s3_4.jpeg */, 189 | 9B87EE181764218C00001F9F /* s3_5.jpeg */, 190 | 9B87EE191764218C00001F9F /* s3_6.jpeg */, 191 | 9B87EE1A1764218C00001F9F /* s3_7.jpeg */, 192 | 9B87EE1B1764218C00001F9F /* s3_8.jpeg */, 193 | 9B87EE1C1764218C00001F9F /* s3_9.jpeg */, 194 | ); 195 | path = Set3; 196 | sourceTree = ""; 197 | }; 198 | 9BB436221760D38C00102EF4 = { 199 | isa = PBXGroup; 200 | children = ( 201 | 9BCF8DC61770AE4B00A283C4 /* appicon@2x.png */, 202 | 9BCF8DC41770AE4900A283C4 /* appicon.png */, 203 | 9BB436511760D3A700102EF4 /* InfiniteScrollPicker */, 204 | 9BB436341760D38C00102EF4 /* InfiniteScrollPickerExample */, 205 | 9BB4362D1760D38C00102EF4 /* Frameworks */, 206 | 9BB4362C1760D38C00102EF4 /* Products */, 207 | ); 208 | sourceTree = ""; 209 | }; 210 | 9BB4362C1760D38C00102EF4 /* Products */ = { 211 | isa = PBXGroup; 212 | children = ( 213 | 9BB4362B1760D38C00102EF4 /* InfiniteScrollPickerExample.app */, 214 | ); 215 | name = Products; 216 | sourceTree = ""; 217 | }; 218 | 9BB4362D1760D38C00102EF4 /* Frameworks */ = { 219 | isa = PBXGroup; 220 | children = ( 221 | 9BB4362E1760D38C00102EF4 /* UIKit.framework */, 222 | 9BB436301760D38C00102EF4 /* Foundation.framework */, 223 | 9BB436321760D38C00102EF4 /* CoreGraphics.framework */, 224 | ); 225 | name = Frameworks; 226 | sourceTree = ""; 227 | }; 228 | 9BB436341760D38C00102EF4 /* InfiniteScrollPickerExample */ = { 229 | isa = PBXGroup; 230 | children = ( 231 | 9BB436551760D85000102EF4 /* Resources */, 232 | 9BB4363D1760D38C00102EF4 /* AppDelegate.h */, 233 | 9BB4363E1760D38C00102EF4 /* AppDelegate.m */, 234 | 9BB436461760D38C00102EF4 /* ViewController.h */, 235 | 9BB436471760D38C00102EF4 /* ViewController.m */, 236 | 9BB436491760D38C00102EF4 /* ViewController.xib */, 237 | 9BB436351760D38C00102EF4 /* Supporting Files */, 238 | ); 239 | path = InfiniteScrollPickerExample; 240 | sourceTree = ""; 241 | }; 242 | 9BB436351760D38C00102EF4 /* Supporting Files */ = { 243 | isa = PBXGroup; 244 | children = ( 245 | 9BB436361760D38C00102EF4 /* InfiniteScrollPickerExample-Info.plist */, 246 | 9BB436371760D38C00102EF4 /* InfoPlist.strings */, 247 | 9BB4363A1760D38C00102EF4 /* main.m */, 248 | 9BB4363C1760D38C00102EF4 /* InfiniteScrollPickerExample-Prefix.pch */, 249 | 9BB436401760D38C00102EF4 /* Default.png */, 250 | 9BB436421760D38C00102EF4 /* Default@2x.png */, 251 | 9BB436441760D38C00102EF4 /* Default-568h@2x.png */, 252 | ); 253 | name = "Supporting Files"; 254 | sourceTree = ""; 255 | }; 256 | 9BB436511760D3A700102EF4 /* InfiniteScrollPicker */ = { 257 | isa = PBXGroup; 258 | children = ( 259 | 9B87EE3417642D6400001F9F /* UIView+viewController.h */, 260 | 9B87EE3517642D6400001F9F /* UIView+viewController.m */, 261 | 9BB436521760D3C200102EF4 /* InfiniteScrollPicker.h */, 262 | 9BB436531760D3C200102EF4 /* InfiniteScrollPicker.m */, 263 | ); 264 | name = InfiniteScrollPicker; 265 | path = ../InfiniteScrollPicker; 266 | sourceTree = ""; 267 | }; 268 | 9BB436551760D85000102EF4 /* Resources */ = { 269 | isa = PBXGroup; 270 | children = ( 271 | 9B87EE081764218C00001F9F /* Set3 */, 272 | 9B87EDE617641E7B00001F9F /* Set1 */, 273 | 9B87EDED17641E7B00001F9F /* Set2 */, 274 | ); 275 | name = Resources; 276 | path = ../../Resources; 277 | sourceTree = ""; 278 | }; 279 | /* End PBXGroup section */ 280 | 281 | /* Begin PBXNativeTarget section */ 282 | 9BB4362A1760D38C00102EF4 /* InfiniteScrollPickerExample */ = { 283 | isa = PBXNativeTarget; 284 | buildConfigurationList = 9BB4364E1760D38C00102EF4 /* Build configuration list for PBXNativeTarget "InfiniteScrollPickerExample" */; 285 | buildPhases = ( 286 | 9BB436271760D38C00102EF4 /* Sources */, 287 | 9BB436281760D38C00102EF4 /* Frameworks */, 288 | 9BB436291760D38C00102EF4 /* Resources */, 289 | ); 290 | buildRules = ( 291 | ); 292 | dependencies = ( 293 | ); 294 | name = InfiniteScrollPickerExample; 295 | productName = InfiniteScrollPickerExample; 296 | productReference = 9BB4362B1760D38C00102EF4 /* InfiniteScrollPickerExample.app */; 297 | productType = "com.apple.product-type.application"; 298 | }; 299 | /* End PBXNativeTarget section */ 300 | 301 | /* Begin PBXProject section */ 302 | 9BB436231760D38C00102EF4 /* Project object */ = { 303 | isa = PBXProject; 304 | attributes = { 305 | LastUpgradeCheck = 0460; 306 | ORGANIZATIONNAME = "Philip Yu"; 307 | }; 308 | buildConfigurationList = 9BB436261760D38C00102EF4 /* Build configuration list for PBXProject "InfiniteScrollPickerExample" */; 309 | compatibilityVersion = "Xcode 3.2"; 310 | developmentRegion = English; 311 | hasScannedForEncodings = 0; 312 | knownRegions = ( 313 | en, 314 | ); 315 | mainGroup = 9BB436221760D38C00102EF4; 316 | productRefGroup = 9BB4362C1760D38C00102EF4 /* Products */; 317 | projectDirPath = ""; 318 | projectRoot = ""; 319 | targets = ( 320 | 9BB4362A1760D38C00102EF4 /* InfiniteScrollPickerExample */, 321 | ); 322 | }; 323 | /* End PBXProject section */ 324 | 325 | /* Begin PBXResourcesBuildPhase section */ 326 | 9BB436291760D38C00102EF4 /* Resources */ = { 327 | isa = PBXResourcesBuildPhase; 328 | buildActionMask = 2147483647; 329 | files = ( 330 | 9BB436391760D38C00102EF4 /* InfoPlist.strings in Resources */, 331 | 9BB436411760D38C00102EF4 /* Default.png in Resources */, 332 | 9BB436431760D38C00102EF4 /* Default@2x.png in Resources */, 333 | 9BB436451760D38C00102EF4 /* Default-568h@2x.png in Resources */, 334 | 9BB4364B1760D38C00102EF4 /* ViewController.xib in Resources */, 335 | 9B87EDF817641E7B00001F9F /* s1_0.png in Resources */, 336 | 9B87EDF917641E7B00001F9F /* s1_1.png in Resources */, 337 | 9B87EDFA17641E7B00001F9F /* s1_2.png in Resources */, 338 | 9B87EDFB17641E7B00001F9F /* s1_3.png in Resources */, 339 | 9B87EDFC17641E7B00001F9F /* s1_4.png in Resources */, 340 | 9B87EDFD17641E7B00001F9F /* s1_5.png in Resources */, 341 | 9B87EDFE17641E7B00001F9F /* s2_1.png in Resources */, 342 | 9B87EDFF17641E7B00001F9F /* s2_10.png in Resources */, 343 | 9B87EE0017641E7B00001F9F /* s2_2.png in Resources */, 344 | 9B87EE0117641E7B00001F9F /* s2_3.png in Resources */, 345 | 9B87EE0217641E7B00001F9F /* s2_4.png in Resources */, 346 | 9B87EE0317641E7B00001F9F /* s2_5.png in Resources */, 347 | 9B87EE0417641E7B00001F9F /* s2_6.png in Resources */, 348 | 9B87EE0517641E7B00001F9F /* s2_7.png in Resources */, 349 | 9B87EE0617641E7B00001F9F /* s2_8.png in Resources */, 350 | 9B87EE0717641E7B00001F9F /* s2_9.png in Resources */, 351 | 9B87EE1D1764218C00001F9F /* s3_0.jpeg in Resources */, 352 | 9B87EE1E1764218C00001F9F /* s3_1.jpeg in Resources */, 353 | 9B87EE1F1764218C00001F9F /* s3_10.jpeg in Resources */, 354 | 9B87EE201764218C00001F9F /* s3_11.jpeg in Resources */, 355 | 9B87EE211764218C00001F9F /* s3_12.jpeg in Resources */, 356 | 9B87EE221764218C00001F9F /* s3_13.jpeg in Resources */, 357 | 9B87EE231764218C00001F9F /* s3_14.jpeg in Resources */, 358 | 9B87EE241764218C00001F9F /* s3_15.jpeg in Resources */, 359 | 9B87EE251764218C00001F9F /* s3_16.jpeg in Resources */, 360 | 9B87EE261764218C00001F9F /* s3_17.jpeg in Resources */, 361 | 9B87EE271764218C00001F9F /* s3_18.jpeg in Resources */, 362 | 9B87EE281764218C00001F9F /* s3_19.jpeg in Resources */, 363 | 9B87EE291764218C00001F9F /* s3_2.jpeg in Resources */, 364 | 9B87EE2A1764218C00001F9F /* s3_3.jpeg in Resources */, 365 | 9B87EE2B1764218C00001F9F /* s3_4.jpeg in Resources */, 366 | 9B87EE2C1764218C00001F9F /* s3_5.jpeg in Resources */, 367 | 9B87EE2D1764218C00001F9F /* s3_6.jpeg in Resources */, 368 | 9B87EE2E1764218C00001F9F /* s3_7.jpeg in Resources */, 369 | 9B87EE2F1764218C00001F9F /* s3_8.jpeg in Resources */, 370 | 9B87EE301764218C00001F9F /* s3_9.jpeg in Resources */, 371 | 9B87EE321764297C00001F9F /* s3_bg.jpg in Resources */, 372 | 9BCF8DC51770AE4900A283C4 /* appicon.png in Resources */, 373 | 9BCF8DC71770AE4B00A283C4 /* appicon@2x.png in Resources */, 374 | ); 375 | runOnlyForDeploymentPostprocessing = 0; 376 | }; 377 | /* End PBXResourcesBuildPhase section */ 378 | 379 | /* Begin PBXSourcesBuildPhase section */ 380 | 9BB436271760D38C00102EF4 /* Sources */ = { 381 | isa = PBXSourcesBuildPhase; 382 | buildActionMask = 2147483647; 383 | files = ( 384 | 9BB4363B1760D38C00102EF4 /* main.m in Sources */, 385 | 9BB4363F1760D38C00102EF4 /* AppDelegate.m in Sources */, 386 | 9BB436481760D38C00102EF4 /* ViewController.m in Sources */, 387 | 9BB436541760D3C200102EF4 /* InfiniteScrollPicker.m in Sources */, 388 | 9B87EE3617642D6400001F9F /* UIView+viewController.m in Sources */, 389 | ); 390 | runOnlyForDeploymentPostprocessing = 0; 391 | }; 392 | /* End PBXSourcesBuildPhase section */ 393 | 394 | /* Begin PBXVariantGroup section */ 395 | 9BB436371760D38C00102EF4 /* InfoPlist.strings */ = { 396 | isa = PBXVariantGroup; 397 | children = ( 398 | 9BB436381760D38C00102EF4 /* en */, 399 | ); 400 | name = InfoPlist.strings; 401 | sourceTree = ""; 402 | }; 403 | 9BB436491760D38C00102EF4 /* ViewController.xib */ = { 404 | isa = PBXVariantGroup; 405 | children = ( 406 | 9BB4364A1760D38C00102EF4 /* en */, 407 | ); 408 | name = ViewController.xib; 409 | sourceTree = ""; 410 | }; 411 | /* End PBXVariantGroup section */ 412 | 413 | /* Begin XCBuildConfiguration section */ 414 | 9BB4364C1760D38C00102EF4 /* Debug */ = { 415 | isa = XCBuildConfiguration; 416 | buildSettings = { 417 | ALWAYS_SEARCH_USER_PATHS = NO; 418 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 419 | CLANG_CXX_LIBRARY = "libc++"; 420 | CLANG_ENABLE_OBJC_ARC = YES; 421 | CLANG_WARN_CONSTANT_CONVERSION = YES; 422 | CLANG_WARN_EMPTY_BODY = YES; 423 | CLANG_WARN_ENUM_CONVERSION = YES; 424 | CLANG_WARN_INT_CONVERSION = YES; 425 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 426 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 427 | COPY_PHASE_STRIP = NO; 428 | GCC_C_LANGUAGE_STANDARD = gnu99; 429 | GCC_DYNAMIC_NO_PIC = NO; 430 | GCC_OPTIMIZATION_LEVEL = 0; 431 | GCC_PREPROCESSOR_DEFINITIONS = ( 432 | "DEBUG=1", 433 | "$(inherited)", 434 | ); 435 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 436 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 437 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 438 | GCC_WARN_UNUSED_VARIABLE = YES; 439 | IPHONEOS_DEPLOYMENT_TARGET = 6.1; 440 | ONLY_ACTIVE_ARCH = YES; 441 | SDKROOT = iphoneos; 442 | }; 443 | name = Debug; 444 | }; 445 | 9BB4364D1760D38C00102EF4 /* Release */ = { 446 | isa = XCBuildConfiguration; 447 | buildSettings = { 448 | ALWAYS_SEARCH_USER_PATHS = NO; 449 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 450 | CLANG_CXX_LIBRARY = "libc++"; 451 | CLANG_ENABLE_OBJC_ARC = YES; 452 | CLANG_WARN_CONSTANT_CONVERSION = YES; 453 | CLANG_WARN_EMPTY_BODY = YES; 454 | CLANG_WARN_ENUM_CONVERSION = YES; 455 | CLANG_WARN_INT_CONVERSION = YES; 456 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 457 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 458 | COPY_PHASE_STRIP = YES; 459 | GCC_C_LANGUAGE_STANDARD = gnu99; 460 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 461 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 462 | GCC_WARN_UNUSED_VARIABLE = YES; 463 | IPHONEOS_DEPLOYMENT_TARGET = 6.1; 464 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 465 | SDKROOT = iphoneos; 466 | VALIDATE_PRODUCT = YES; 467 | }; 468 | name = Release; 469 | }; 470 | 9BB4364F1760D38C00102EF4 /* Debug */ = { 471 | isa = XCBuildConfiguration; 472 | buildSettings = { 473 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 474 | GCC_PREFIX_HEADER = "InfiniteScrollPickerExample/InfiniteScrollPickerExample-Prefix.pch"; 475 | INFOPLIST_FILE = "InfiniteScrollPickerExample/InfiniteScrollPickerExample-Info.plist"; 476 | PRODUCT_NAME = "$(TARGET_NAME)"; 477 | WRAPPER_EXTENSION = app; 478 | }; 479 | name = Debug; 480 | }; 481 | 9BB436501760D38C00102EF4 /* Release */ = { 482 | isa = XCBuildConfiguration; 483 | buildSettings = { 484 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 485 | GCC_PREFIX_HEADER = "InfiniteScrollPickerExample/InfiniteScrollPickerExample-Prefix.pch"; 486 | INFOPLIST_FILE = "InfiniteScrollPickerExample/InfiniteScrollPickerExample-Info.plist"; 487 | PRODUCT_NAME = "$(TARGET_NAME)"; 488 | WRAPPER_EXTENSION = app; 489 | }; 490 | name = Release; 491 | }; 492 | /* End XCBuildConfiguration section */ 493 | 494 | /* Begin XCConfigurationList section */ 495 | 9BB436261760D38C00102EF4 /* Build configuration list for PBXProject "InfiniteScrollPickerExample" */ = { 496 | isa = XCConfigurationList; 497 | buildConfigurations = ( 498 | 9BB4364C1760D38C00102EF4 /* Debug */, 499 | 9BB4364D1760D38C00102EF4 /* Release */, 500 | ); 501 | defaultConfigurationIsVisible = 0; 502 | defaultConfigurationName = Release; 503 | }; 504 | 9BB4364E1760D38C00102EF4 /* Build configuration list for PBXNativeTarget "InfiniteScrollPickerExample" */ = { 505 | isa = XCConfigurationList; 506 | buildConfigurations = ( 507 | 9BB4364F1760D38C00102EF4 /* Debug */, 508 | 9BB436501760D38C00102EF4 /* Release */, 509 | ); 510 | defaultConfigurationIsVisible = 0; 511 | defaultConfigurationName = Release; 512 | }; 513 | /* End XCConfigurationList section */ 514 | }; 515 | rootObject = 9BB436231760D38C00102EF4 /* Project object */; 516 | } 517 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/InfiniteScrollPickerExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/InfiniteScrollPickerExample.xcodeproj/project.xcworkspace/xcshareddata/InfiniteScrollPickerExample.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | BE5E142A-28E1-43A7-B01A-F598C83CE671 9 | IDESourceControlProjectName 10 | InfiniteScrollPickerExample 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | A4B531D7-7A62-4CA6-AB61-426035F2F39A 14 | https://github.com/Seitk/InfiniteScrollPicker.git 15 | 16 | IDESourceControlProjectPath 17 | InfiniteScrollPickerExample/InfiniteScrollPickerExample.xcodeproj/project.xcworkspace 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | A4B531D7-7A62-4CA6-AB61-426035F2F39A 21 | ../../.. 22 | 23 | IDESourceControlProjectURL 24 | https://github.com/Seitk/InfiniteScrollPicker.git 25 | IDESourceControlProjectVersion 26 | 110 27 | IDESourceControlProjectWCCIdentifier 28 | A4B531D7-7A62-4CA6-AB61-426035F2F39A 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | A4B531D7-7A62-4CA6-AB61-426035F2F39A 36 | IDESourceControlWCCName 37 | InfiniteScrollPicker 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/InfiniteScrollPickerExample.xcodeproj/project.xcworkspace/xcuserdata/seitk.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/InfiniteScrollPickerExample/InfiniteScrollPickerExample.xcodeproj/project.xcworkspace/xcuserdata/seitk.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/InfiniteScrollPickerExample.xcodeproj/project.xcworkspace/xcuserdata/seitk.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 6 | 7 | SnapshotAutomaticallyBeforeSignificantChanges 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/InfiniteScrollPickerExample.xcodeproj/xcuserdata/seitk.xcuserdatad/xcschemes/InfiniteScrollPickerExample.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 51 | 52 | 58 | 59 | 60 | 61 | 62 | 63 | 69 | 70 | 76 | 77 | 78 | 79 | 81 | 82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/InfiniteScrollPickerExample.xcodeproj/xcuserdata/seitk.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | InfiniteScrollPickerExample.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 9BB4362A1760D38C00102EF4 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/InfiniteScrollPickerExample/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // InfiniteScrollPickerExample 4 | // 5 | // Created by Philip Yu on 6/6/13. 6 | // Copyright (c) 2013 Philip Yu. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class ViewController; 12 | 13 | @interface AppDelegate : UIResponder 14 | 15 | @property (strong, nonatomic) UIWindow *window; 16 | 17 | @property (strong, nonatomic) ViewController *viewController; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/InfiniteScrollPickerExample/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // InfiniteScrollPickerExample 4 | // 5 | // Created by Philip Yu on 6/6/13. 6 | // Copyright (c) 2013 Philip Yu. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | #import "ViewController.h" 12 | 13 | @implementation AppDelegate 14 | 15 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 16 | { 17 | self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 18 | // Override point for customization after application launch. 19 | self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 20 | self.window.rootViewController = self.viewController; 21 | [self.window makeKeyAndVisible]; 22 | return YES; 23 | } 24 | 25 | - (void)applicationWillResignActive:(UIApplication *)application 26 | { 27 | // 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. 28 | // 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. 29 | } 30 | 31 | - (void)applicationDidEnterBackground:(UIApplication *)application 32 | { 33 | // 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. 34 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 35 | } 36 | 37 | - (void)applicationWillEnterForeground:(UIApplication *)application 38 | { 39 | // 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. 40 | } 41 | 42 | - (void)applicationDidBecomeActive:(UIApplication *)application 43 | { 44 | // 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. 45 | } 46 | 47 | - (void)applicationWillTerminate:(UIApplication *)application 48 | { 49 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 50 | } 51 | 52 | @end 53 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/InfiniteScrollPickerExample/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/InfiniteScrollPickerExample/InfiniteScrollPickerExample/Default-568h@2x.png -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/InfiniteScrollPickerExample/Default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/InfiniteScrollPickerExample/InfiniteScrollPickerExample/Default.png -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/InfiniteScrollPickerExample/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/InfiniteScrollPickerExample/InfiniteScrollPickerExample/Default@2x.png -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/InfiniteScrollPickerExample/InfiniteScrollPickerExample-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIcons 12 | 13 | CFBundlePrimaryIcon 14 | 15 | CFBundleIconFiles 16 | 17 | appicon.png 18 | appicon@2x.png 19 | 20 | UIPrerenderedIcon 21 | 22 | 23 | 24 | CFBundleIdentifier 25 | PY.${PRODUCT_NAME:rfc1034identifier} 26 | CFBundleInfoDictionaryVersion 27 | 6.0 28 | CFBundleName 29 | ${PRODUCT_NAME} 30 | CFBundlePackageType 31 | APPL 32 | CFBundleShortVersionString 33 | 1.0 34 | CFBundleSignature 35 | ???? 36 | CFBundleVersion 37 | 1.0 38 | LSRequiresIPhoneOS 39 | 40 | UIPrerenderedIcon 41 | 42 | UIRequiredDeviceCapabilities 43 | 44 | armv7 45 | 46 | UISupportedInterfaceOrientations 47 | 48 | UIInterfaceOrientationPortrait 49 | UIInterfaceOrientationLandscapeLeft 50 | UIInterfaceOrientationLandscapeRight 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/InfiniteScrollPickerExample/InfiniteScrollPickerExample-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'InfiniteScrollPickerExample' target in the 'InfiniteScrollPickerExample' project 3 | // 4 | 5 | #import 6 | 7 | #ifndef __IPHONE_4_0 8 | #warning "This project uses features only available in iOS SDK 4.0 and later." 9 | #endif 10 | 11 | #ifdef __OBJC__ 12 | #import 13 | #import 14 | #endif 15 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/InfiniteScrollPickerExample/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // InfiniteScrollPickerExample 4 | // 5 | // Created by Philip Yu on 6/6/13. 6 | // Copyright (c) 2013 Philip Yu. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "InfiniteScrollPicker.h" 11 | 12 | @interface ViewController : UIViewController 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/InfiniteScrollPickerExample/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // InfiniteScrollPickerExample 4 | // 5 | // Created by Philip Yu on 6/6/13. 6 | // Copyright (c) 2013 Philip Yu. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | 11 | @interface ViewController () 12 | { 13 | InfiniteScrollPicker *isp; 14 | InfiniteScrollPicker *isp2; 15 | InfiniteScrollPicker *isp3; 16 | } 17 | 18 | @end 19 | 20 | @implementation ViewController 21 | 22 | - (void)viewDidLoad 23 | { 24 | [super viewDidLoad]; 25 | 26 | NSMutableArray *set1 = [[NSMutableArray alloc] init]; 27 | for (int i = 0; i < 6; i++) { 28 | [set1 addObject:[UIImage imageNamed:[NSString stringWithFormat:@"s1_%d.png", i]]]; 29 | } 30 | 31 | NSMutableArray *set2 = [[NSMutableArray alloc] init]; 32 | for (int i = 1; i <= 10; i++) { 33 | [set2 addObject:[UIImage imageNamed:[NSString stringWithFormat:@"s2_%d.png", i]]]; 34 | } 35 | 36 | NSMutableArray *set3 = [[NSMutableArray alloc] init]; 37 | for (int i = 0; i < 20; i++) { 38 | [set3 addObject:[UIImage imageNamed:[NSString stringWithFormat:@"s3_%d.jpeg", i]]]; 39 | } 40 | 41 | isp = [[InfiniteScrollPicker alloc] initWithFrame:CGRectMake(0, 0, 320, 100)]; 42 | [isp setItemSize:CGSizeMake(50, 50)]; 43 | [isp setImageAry:set1]; 44 | [isp setSelectedItem:5]; 45 | [self.view addSubview:isp]; 46 | 47 | isp2 = [[InfiniteScrollPicker alloc] initWithFrame:CGRectMake(0, 110, 320, 120)]; 48 | [isp2 setImageAry:set2]; 49 | [isp2 setHeightOffset:30.0]; 50 | [isp2 setPositionRatio:2.0]; 51 | [isp2 setAlphaOfobjs:0.3]; 52 | [isp2 setSelectedItem:0]; 53 | [self.view addSubview:isp2]; 54 | 55 | isp3 = [[InfiniteScrollPicker alloc] initWithFrame:CGRectMake(0, 240, 320, 210)]; 56 | [isp3 setImageAry:set3]; 57 | [isp3 setHeightOffset:20]; 58 | [isp3 setPositionRatio:2]; 59 | [isp3 setAlphaOfobjs:0.8]; 60 | [self.view addSubview:isp3]; 61 | } 62 | 63 | - (void)infiniteScrollPicker:(InfiniteScrollPicker *)infiniteScrollPicker didSelectAtImage:(UIImage *)image 64 | { 65 | NSLog(@"selected"); 66 | } 67 | 68 | @end 69 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/InfiniteScrollPickerExample/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/InfiniteScrollPickerExample/en.lproj/ViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1552 5 | 12D78 6 | 3084 7 | 1187.37 8 | 626.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 2083 12 | 13 | 14 | IBNSLayoutConstraint 15 | IBProxyObject 16 | IBUIImageView 17 | IBUIView 18 | 19 | 20 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 21 | 22 | 23 | PluginDependencyRecalculationVersion 24 | 25 | 26 | 27 | 28 | IBFilesOwner 29 | IBCocoaTouchFramework 30 | 31 | 32 | IBFirstResponder 33 | IBCocoaTouchFramework 34 | 35 | 36 | 37 | 274 38 | 39 | 40 | 41 | 274 42 | {320, 548} 43 | 44 | 45 | 46 | _NS:9 47 | 0.5 48 | 2 49 | NO 50 | IBCocoaTouchFramework 51 | 52 | NSImage 53 | s3_bg.jpg 54 | 55 | 56 | 57 | {{0, 20}, {320, 548}} 58 | 59 | 60 | 61 | 62 | 3 63 | MC43NQA 64 | 65 | 2 66 | 67 | 68 | NO 69 | 70 | 71 | IBUIScreenMetrics 72 | 73 | YES 74 | 75 | 76 | 77 | 78 | 79 | {320, 568} 80 | {568, 320} 81 | 82 | 83 | IBCocoaTouchFramework 84 | Retina 4 Full Screen 85 | 2 86 | 87 | IBCocoaTouchFramework 88 | 89 | 90 | 91 | 92 | 93 | 94 | view 95 | 96 | 97 | 98 | 7 99 | 100 | 101 | 102 | 103 | 104 | 0 105 | 106 | 107 | 108 | 109 | 110 | -1 111 | 112 | 113 | File's Owner 114 | 115 | 116 | -2 117 | 118 | 119 | 120 | 121 | 6 122 | 123 | 124 | 125 | 126 | 127 | 4 128 | 0 129 | 130 | 4 131 | 1 132 | 133 | 0.0 134 | 135 | 1000 136 | 137 | 8 138 | 29 139 | 3 140 | 141 | 142 | 143 | 3 144 | 0 145 | 146 | 3 147 | 1 148 | 149 | 0.0 150 | 151 | 1000 152 | 153 | 8 154 | 29 155 | 3 156 | 157 | 158 | 159 | 6 160 | 0 161 | 162 | 6 163 | 1 164 | 165 | 0.0 166 | 167 | 1000 168 | 169 | 8 170 | 29 171 | 3 172 | 173 | 174 | 175 | 5 176 | 0 177 | 178 | 5 179 | 1 180 | 181 | 0.0 182 | 183 | 1000 184 | 185 | 8 186 | 29 187 | 3 188 | 189 | 190 | 191 | 192 | 193 | 8 194 | 195 | 196 | 197 | 198 | 199 | 13 200 | 201 | 202 | 203 | 204 | 14 205 | 206 | 207 | 208 | 209 | 15 210 | 211 | 212 | 213 | 214 | 16 215 | 216 | 217 | 218 | 219 | 220 | 221 | ViewController 222 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 223 | UIResponder 224 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 225 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 226 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 227 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 228 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 229 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 230 | 231 | 232 | 233 | 234 | 235 | 236 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 237 | 238 | 239 | 240 | 241 | 242 | 243 | 16 244 | 245 | 246 | 247 | 248 | NSLayoutConstraint 249 | NSObject 250 | 251 | IBProjectSource 252 | ./Classes/NSLayoutConstraint.h 253 | 254 | 255 | 256 | ViewController 257 | UIViewController 258 | 259 | IBProjectSource 260 | ./Classes/ViewController.h 261 | 262 | 263 | 264 | 265 | 0 266 | IBCocoaTouchFramework 267 | YES 268 | 3 269 | 270 | s3_bg.jpg 271 | {333, 272} 272 | 273 | YES 274 | 2083 275 | 276 | 277 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/InfiniteScrollPickerExample/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // InfiniteScrollPickerExample 4 | // 5 | // Created by Philip Yu on 6/6/13. 6 | // Copyright (c) 2013 Philip Yu. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "AppDelegate.h" 12 | 13 | int main(int argc, char *argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/appicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/InfiniteScrollPickerExample/appicon.png -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/appicon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/InfiniteScrollPickerExample/appicon@2x.png -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/FUIAlertView.h: -------------------------------------------------------------------------------- 1 | // 2 | // FUIAlertView.h 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/7/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @protocol FUIAlertViewDelegate; 12 | 13 | @interface FUIAlertView : UIView 14 | 15 | 16 | - (id)initWithTitle:(NSString *)title 17 | message:(NSString *)message 18 | delegate:(id)delegate 19 | cancelButtonTitle:(NSString *)cancelButtonTitle 20 | otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION; 21 | 22 | @property(nonatomic,assign) id delegate; // weak reference 23 | @property(nonatomic,copy) NSString *title; 24 | @property(nonatomic,copy) NSString *message; // secondary explanation text 25 | 26 | // adds a button with the title. returns the index (0 based) of where it was added. buttons are displayed in the order added except for the 27 | // cancel button which will be positioned based on HI requirements. buttons cannot be customized. 28 | - (NSInteger)addButtonWithTitle:(NSString *)title; // returns index of button. 0 based. 29 | - (NSString *)buttonTitleAtIndex:(NSInteger)buttonIndex; 30 | @property(nonatomic,readonly) NSInteger numberOfButtons; 31 | @property(nonatomic) NSInteger cancelButtonIndex; // if the delegate does not implement -alertViewCancel:, we pretend this button was clicked on. default is -1 32 | 33 | // TODO: not implemented 34 | //@property(nonatomic,readonly) NSInteger firstOtherButtonIndex; // -1 if no otherButtonTitles or initWithTitle:... not used 35 | 36 | @property(nonatomic,readonly,getter=isVisible) BOOL visible; 37 | 38 | // shows popup alert animated. 39 | - (void)show; 40 | 41 | // hides alert sheet or popup. use this method when you need to explicitly dismiss the alert. 42 | // it does not need to be called if the user presses on a button 43 | - (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated; 44 | 45 | 46 | @property(nonatomic) NSMutableArray *buttons; 47 | @property(nonatomic, weak, readonly) UILabel *titleLabel; 48 | @property(nonatomic, weak, readonly) UILabel *messageLabel; 49 | @property(nonatomic, weak, readonly) UIView *backgroundOverlay; 50 | @property(nonatomic, weak, readonly) UIView *alertContainer; 51 | @property(nonatomic) CGFloat buttonSpacing; 52 | @property(nonatomic) CGFloat animationDuration; 53 | 54 | //setting these properties overwrites any other button colors/fonts that have already been set 55 | @property(nonatomic, strong) UIFont *defaultButtonFont; 56 | @property(nonatomic, strong) UIColor *defaultButtonTitleColor; 57 | @property(nonatomic, strong) UIColor *defaultButtonColor; 58 | @property(nonatomic, strong) UIColor *defaultButtonShadowColor; 59 | 60 | @end 61 | 62 | 63 | @protocol FUIAlertViewDelegate 64 | @optional 65 | 66 | // Called when a button is clicked. The view will be automatically dismissed after this call returns 67 | - (void)alertView:(FUIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex; 68 | 69 | // Called when we cancel a view (eg. the user clicks the Home button). This is not called when the user clicks the cancel button. 70 | // If not defined in the delegate, we simulate a click in the cancel button 71 | // TODO: not implemented 72 | //- (void)alertViewCancel:(FUIAlertView *)alertView; 73 | 74 | - (void)willPresentAlertView:(FUIAlertView *)alertView; // before animation and showing view 75 | - (void)didPresentAlertView:(FUIAlertView *)alertView; // after animation 76 | 77 | - (void)alertView:(FUIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex; // before animation and hiding view 78 | - (void)alertView:(FUIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex; // after animation 79 | 80 | // Called after edits in any of the default fields added by the style 81 | // TODO: not implemented 82 | //- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView; 83 | 84 | @end -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/FUIAlertView.m: -------------------------------------------------------------------------------- 1 | // 2 | // FUIAlertView.m 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/7/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import "FUIAlertView.h" 10 | #import "FUIButton.h" 11 | 12 | @interface FUIAlertView() 13 | 14 | @property(nonatomic, weak) UIView *alertContentContainer; 15 | 16 | @end 17 | 18 | @implementation FUIAlertView 19 | 20 | - (id)initWithTitle:(NSString *)title 21 | message:(NSString *)message 22 | delegate:(id)delegate 23 | cancelButtonTitle:(NSString *)cancelButtonTitle 24 | otherButtonTitles:(NSString *)otherButtonTitles, ... { 25 | self = [super initWithFrame:CGRectZero]; 26 | if (self) { 27 | self.title = title; 28 | self.message = message; 29 | self.delegate = delegate; 30 | 31 | self.buttonSpacing = 10; 32 | self.animationDuration = 0.2f; 33 | 34 | UIView *backgroundOverlay = [[UIView alloc] init]; 35 | backgroundOverlay.backgroundColor = [UIColor blueColor]; 36 | [self addSubview:backgroundOverlay]; 37 | backgroundOverlay.alpha = 0; 38 | _backgroundOverlay = backgroundOverlay; 39 | 40 | UIView *alertContainer = [[UIView alloc] init]; 41 | alertContainer.backgroundColor = [UIColor yellowColor]; 42 | [self addSubview:alertContainer]; 43 | [self bringSubviewToFront:alertContainer]; 44 | _alertContainer = alertContainer; 45 | 46 | UIView *alertContentContainer = [[UIView alloc] init]; 47 | alertContentContainer.backgroundColor = [UIColor clearColor]; 48 | [self.alertContainer addSubview:alertContentContainer]; 49 | [self.alertContainer bringSubviewToFront:alertContentContainer]; 50 | _alertContentContainer = alertContentContainer; 51 | 52 | UILabel *titleLabel = [[UILabel alloc] init]; 53 | titleLabel.numberOfLines = 0; 54 | titleLabel.backgroundColor = [UIColor clearColor]; 55 | titleLabel.textAlignment = NSTextAlignmentCenter; 56 | titleLabel.text = self.title; 57 | [alertContentContainer addSubview:titleLabel]; 58 | _titleLabel = titleLabel; 59 | 60 | UILabel *messageLabel = [[UILabel alloc] init]; 61 | messageLabel.numberOfLines = 0; 62 | messageLabel.backgroundColor = [UIColor clearColor]; 63 | messageLabel.textAlignment = NSTextAlignmentCenter; 64 | messageLabel.text = self.message; 65 | [alertContentContainer addSubview:messageLabel]; 66 | _messageLabel = messageLabel; 67 | 68 | va_list args; 69 | va_start(args, otherButtonTitles); 70 | for (NSString *arg = otherButtonTitles; arg != nil; arg = va_arg(args, NSString*)) { 71 | [self addButtonWithTitle:arg]; 72 | } 73 | va_end(args); 74 | [self addButtonWithTitle:cancelButtonTitle]; 75 | } 76 | return self; 77 | } 78 | 79 | - (void) layoutSubviews { 80 | [super layoutSubviews]; 81 | if (CGAffineTransformIsIdentity(self.alertContainer.transform)) { 82 | self.backgroundOverlay.frame = self.bounds; 83 | CGFloat padding = 15; 84 | CGRect contentContainerFrame = CGRectMake(padding, padding, 0, 0); 85 | contentContainerFrame.size = [self calculateSize]; 86 | self.alertContentContainer.frame = contentContainerFrame; 87 | CGRect alertContainerFrame = CGRectInset(contentContainerFrame, -padding, -padding); 88 | alertContainerFrame.origin = CGPointMake((self.frame.size.width - alertContainerFrame.size.width) / 2, 89 | (self.frame.size.height - alertContainerFrame.size.height) / 2); 90 | alertContainerFrame.origin.y = MAX(10, alertContainerFrame.origin.y - 30); 91 | self.alertContainer.frame = alertContainerFrame; 92 | CGRect titleFrame = self.titleLabel.frame; 93 | titleFrame.size.width = self.alertContentContainer.frame.size.width; 94 | self.titleLabel.frame = titleFrame; 95 | [self.titleLabel sizeToFit]; 96 | titleFrame = self.titleLabel.frame; 97 | CGPoint titleOrigin = CGPointMake((self.alertContentContainer.frame.size.width - self.titleLabel.frame.size.width)/2, 0); 98 | titleFrame.origin = titleOrigin; 99 | self.titleLabel.frame = titleFrame; 100 | CGRect messageFrame = self.messageLabel.frame; 101 | messageFrame.size.width = self.alertContentContainer.frame.size.width; 102 | self.messageLabel.frame = messageFrame; 103 | [self.messageLabel sizeToFit]; 104 | messageFrame = self.messageLabel.frame; 105 | CGPoint messageOrigin = CGPointMake((self.alertContentContainer.frame.size.width - self.messageLabel.frame.size.width)/2, CGRectGetMaxY(titleFrame) + 10); 106 | messageFrame.origin = messageOrigin; 107 | self.messageLabel.frame = messageFrame; 108 | 109 | CGFloat startingButtonY = self.alertContentContainer.frame.size.height - [self totalButtonHeight]; 110 | for (UIButton *button in self.buttons) { 111 | CGRect buttonFrame = button.frame; 112 | buttonFrame.origin = CGPointMake(0, startingButtonY); 113 | buttonFrame.size.width = self.alertContentContainer.frame.size.width; 114 | button.frame = buttonFrame; 115 | startingButtonY += (button.frame.size.height + self.buttonSpacing); 116 | } 117 | 118 | } 119 | } 120 | 121 | 122 | 123 | - (CGFloat) totalButtonHeight { 124 | __block CGFloat buttonHeight = 0; 125 | [self.buttons enumerateObjectsUsingBlock:^(FUIButton *button, NSUInteger idx, BOOL *stop) { 126 | buttonHeight += (button.frame.size.height + self.buttonSpacing); 127 | }]; 128 | buttonHeight -= self.buttonSpacing; 129 | return buttonHeight; 130 | } 131 | 132 | - (CGSize) calculateSize { 133 | CGFloat contentWidth = 250; 134 | CGFloat titleHeight = [self.titleLabel.text sizeWithFont:self.titleLabel.font constrainedToSize:CGSizeMake(contentWidth, CGFLOAT_MAX)].height; 135 | CGFloat messageHeight = [self.messageLabel.text sizeWithFont:self.messageLabel.font constrainedToSize:CGSizeMake(contentWidth, CGFLOAT_MAX)].height; 136 | CGFloat buttonHeight = [self totalButtonHeight]; 137 | return CGSizeMake(contentWidth, titleHeight + 10 + messageHeight + 10 + buttonHeight); 138 | } 139 | 140 | - (NSInteger) numberOfButtons { 141 | return self.buttons.count; 142 | } 143 | 144 | - (void)show { 145 | self.alertContainer.transform = CGAffineTransformMakeScale(0.01, 0.01); 146 | UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController; 147 | 148 | while (topController.presentedViewController) { 149 | topController = topController.presentedViewController; 150 | } 151 | UIView *rootView = topController.view; 152 | self.frame = rootView.bounds; 153 | 154 | [rootView addSubview:self]; 155 | [rootView bringSubviewToFront:self]; 156 | if ([self.delegate respondsToSelector:@selector(willPresentAlertView:)]) { 157 | [self.delegate willPresentAlertView:self]; 158 | } 159 | [UIView animateWithDuration:self.animationDuration animations:^{ 160 | self.backgroundOverlay.alpha = 1.0f; 161 | self.alertContainer.transform = CGAffineTransformIdentity; 162 | } completion:^(BOOL finished) { 163 | _visible = YES; 164 | if ([self.delegate respondsToSelector:@selector(didPresentAlertView:)]) { 165 | [self.delegate didPresentAlertView:self]; 166 | } 167 | }]; 168 | 169 | } 170 | 171 | - (NSString *)buttonTitleAtIndex:(NSInteger)buttonIndex { 172 | if (buttonIndex < 0 || buttonIndex > self.buttons.count) { 173 | return nil; 174 | } 175 | return [[self.buttons objectAtIndex:buttonIndex] titleForState:UIControlStateNormal]; 176 | } 177 | 178 | - (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated { 179 | //todo delegate 180 | 181 | self.alertContainer.transform = CGAffineTransformIdentity; 182 | if ([self.delegate respondsToSelector:@selector(alertView:willDismissWithButtonIndex:)]) { 183 | [self.delegate alertView:self willDismissWithButtonIndex:buttonIndex]; 184 | } 185 | [UIView animateWithDuration:self.animationDuration animations:^{ 186 | self.backgroundOverlay.alpha = 0.0f; 187 | self.alertContainer.transform = CGAffineTransformMakeScale(0.01, 0.01); 188 | } completion:^(BOOL finished) { 189 | [self removeFromSuperview]; 190 | _visible = NO; 191 | if ([self.delegate respondsToSelector:@selector(alertView:didDismissWithButtonIndex:)]) { 192 | [self.delegate alertView:self didDismissWithButtonIndex:buttonIndex]; 193 | } 194 | }]; 195 | } 196 | 197 | - (NSInteger)addButtonWithTitle:(NSString *)title { 198 | if (!self.buttons) { 199 | self.buttons = [NSMutableArray array]; 200 | } 201 | FUIButton *button = [[FUIButton alloc] initWithFrame:CGRectMake(0, 0, 250, 44)]; 202 | button.cornerRadius = 3; 203 | button.buttonColor = [UIColor greenColor]; 204 | button.shadowColor = [UIColor brownColor]; 205 | button.shadowHeight = 3; 206 | [button setTitle:title forState:UIControlStateNormal]; 207 | [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; 208 | [self.alertContentContainer addSubview:button]; 209 | [self.buttons addObject:button]; 210 | return self.buttons.count; 211 | } 212 | 213 | - (void) buttonPressed:(FUIButton *)sender { 214 | NSInteger index = [self.buttons indexOfObject:sender]; 215 | if ([self.delegate respondsToSelector:@selector(alertView:clickedButtonAtIndex:)]) { 216 | [self.delegate alertView:self clickedButtonAtIndex:index]; 217 | } 218 | [self dismissWithClickedButtonIndex:index animated:YES]; 219 | } 220 | 221 | - (void) setDefaultButtonFont:(UIFont *)defaultButtonFont { 222 | _defaultButtonFont = defaultButtonFont; 223 | [self.buttons enumerateObjectsUsingBlock:^(FUIButton *button, NSUInteger idx, BOOL *stop) { 224 | button.titleLabel.font = defaultButtonFont; 225 | }]; 226 | } 227 | 228 | - (void) setDefaultButtonTitleColor:(UIColor *)defaultButtonTitleColor { 229 | _defaultButtonTitleColor = defaultButtonTitleColor; 230 | [self.buttons enumerateObjectsUsingBlock:^(FUIButton *button, NSUInteger idx, BOOL *stop) { 231 | [button setTitleColor:defaultButtonTitleColor forState:UIControlStateNormal & UIControlStateHighlighted]; 232 | }]; 233 | } 234 | 235 | - (void) setDefaultButtonColor:(UIColor *)defaultButtonColor { 236 | _defaultButtonColor = defaultButtonColor; 237 | [self.buttons enumerateObjectsUsingBlock:^(FUIButton *button, NSUInteger idx, BOOL *stop) { 238 | button.buttonColor = defaultButtonColor; 239 | }]; 240 | } 241 | 242 | - (void) setDefaultButtonShadowColor:(UIColor *)defaultButtonShadowColor { 243 | _defaultButtonShadowColor = defaultButtonShadowColor; 244 | [self.buttons enumerateObjectsUsingBlock:^(FUIButton *button, NSUInteger idx, BOOL *stop) { 245 | button.shadowColor = defaultButtonShadowColor; 246 | }]; 247 | } 248 | 249 | @end 250 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/FUIButton.h: -------------------------------------------------------------------------------- 1 | // 2 | // FUIButton.h 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/7/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface FUIButton : UIButton 12 | 13 | @property(nonatomic, readwrite) UIColor *buttonColor; 14 | @property(nonatomic, readwrite) UIColor *shadowColor; 15 | @property(nonatomic, readwrite) CGFloat shadowHeight; 16 | @property(nonatomic, readwrite) CGFloat cornerRadius; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/FUIButton.m: -------------------------------------------------------------------------------- 1 | // 2 | // FUIButton.m 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/7/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import "FUIButton.h" 10 | #import "UIImage+FlatUI.h" 11 | 12 | @interface FUIButton() 13 | @property(nonatomic) UIEdgeInsets defaultEdgeInsets; 14 | @property(nonatomic) UIEdgeInsets normalEdgeInsets; 15 | @property(nonatomic) UIEdgeInsets highlightedEdgeInsets; 16 | @end 17 | 18 | @implementation FUIButton 19 | 20 | - (id)initWithFrame:(CGRect)frame 21 | { 22 | self = [super initWithFrame:frame]; 23 | if (self) { 24 | self.defaultEdgeInsets = self.titleEdgeInsets; 25 | } 26 | return self; 27 | } 28 | 29 | - (void) setHighlighted:(BOOL)highlighted { 30 | self.titleEdgeInsets = highlighted ? self.highlightedEdgeInsets : self.normalEdgeInsets; 31 | [super setHighlighted:highlighted]; 32 | } 33 | 34 | - (void) setCornerRadius:(CGFloat)cornerRadius { 35 | _cornerRadius = cornerRadius; 36 | [self configureFlatButton]; 37 | } 38 | 39 | - (void) setButtonColor:(UIColor *)buttonColor { 40 | _buttonColor = buttonColor; 41 | [self configureFlatButton]; 42 | } 43 | 44 | - (void) setShadowColor:(UIColor *)shadowColor { 45 | _shadowColor = shadowColor; 46 | [self configureFlatButton]; 47 | } 48 | 49 | - (void) setShadowHeight:(CGFloat)shadowHeight { 50 | _shadowHeight = shadowHeight; 51 | UIEdgeInsets insets = self.defaultEdgeInsets; 52 | self.highlightedEdgeInsets = insets; 53 | insets.top -= shadowHeight; 54 | self.normalEdgeInsets = insets; 55 | self.titleEdgeInsets = insets; 56 | [self configureFlatButton]; 57 | } 58 | 59 | - (void) configureFlatButton { 60 | UIImage *normalBackgroundImage = [UIImage buttonImageWithColor:self.buttonColor 61 | cornerRadius:self.cornerRadius 62 | shadowColor:self.shadowColor 63 | shadowInsets:UIEdgeInsetsMake(0, 0, self.shadowHeight, 0)]; 64 | UIImage *highlightedBackgroundImage = [UIImage buttonImageWithColor:self.buttonColor 65 | cornerRadius:self.cornerRadius 66 | shadowColor:[UIColor clearColor] 67 | shadowInsets:UIEdgeInsetsMake(self.shadowHeight, 0, 0, 0)]; 68 | 69 | [self setBackgroundImage:normalBackgroundImage forState:UIControlStateNormal]; 70 | [self setBackgroundImage:highlightedBackgroundImage forState:UIControlStateHighlighted]; 71 | 72 | } 73 | 74 | @end 75 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/FUISegmentedControl.h: -------------------------------------------------------------------------------- 1 | // 2 | // FUISegmentedControl.h 3 | // FlatUIKitExample 4 | // 5 | // Created by Alex Medearis on 5/17/13. 6 | // 7 | // 8 | 9 | #import 10 | 11 | @interface FUISegmentedControl : UISegmentedControl 12 | 13 | @property(nonatomic, readwrite) UIColor *selectedColor; 14 | @property(nonatomic, readwrite) UIColor *deselectedColor; 15 | @property(nonatomic, readwrite) UIColor *dividerColor; 16 | @property(nonatomic, readwrite) CGFloat cornerRadius; 17 | @property(nonatomic, readwrite) UIFont *selectedFont; 18 | @property(nonatomic, readwrite) UIFont *deselectedFont; 19 | @property(nonatomic, readwrite) UIColor *selectedFontColor; 20 | @property(nonatomic, readwrite) UIColor *deselectedFontColor; 21 | 22 | 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/FUISegmentedControl.m: -------------------------------------------------------------------------------- 1 | // 2 | // FUISegmentedControl.m 3 | // FlatUIKitExample 4 | // 5 | // Created by Alex Medearis on 5/17/13. 6 | // 7 | // 8 | 9 | #import "FUISegmentedControl.h" 10 | #import "UIImage+FlatUI.h" 11 | 12 | @implementation FUISegmentedControl 13 | 14 | - (id)initWithFrame:(CGRect)frame 15 | { 16 | self = [super initWithFrame:frame]; 17 | if (self) { 18 | // Initialization code 19 | [self defaultColors]; 20 | } 21 | return self; 22 | } 23 | 24 | - (id)initWithCoder:(NSCoder *)aDecoder 25 | { 26 | self = [super initWithCoder:aDecoder]; 27 | if (self) { 28 | // Initialization code 29 | [self defaultColors]; 30 | } 31 | return self; 32 | } 33 | 34 | - (void)defaultColors{ 35 | self.cornerRadius = 5.0; 36 | self.selectedColor = [UIColor blueColor]; 37 | self.deselectedColor = [UIColor darkGrayColor]; 38 | self.dividerColor = [UIColor grayColor]; 39 | self.selectedFont = [UIFont fontWithName:@"Arial" size:15.0]; 40 | self.deselectedFont = [UIFont fontWithName:@"Arial" size:15.0]; 41 | self.selectedFontColor = [UIColor whiteColor]; 42 | self.deselectedFontColor = [UIColor whiteColor]; 43 | } 44 | 45 | - (void)setDeselectedColor:(UIColor *)deselectedColor { 46 | _deselectedColor = deselectedColor; 47 | [self configureFlatSegmentedControl]; 48 | } 49 | 50 | - (void)setSelectedColor:(UIColor *)selectedColor { 51 | _selectedColor = selectedColor; 52 | [self configureFlatSegmentedControl]; 53 | } 54 | 55 | - (void)setDividerColor:(UIColor *)dividerColor { 56 | _dividerColor = dividerColor; 57 | [self configureFlatSegmentedControl]; 58 | } 59 | 60 | - (void)setCornerRadius:(CGFloat)cornerRadius { 61 | _cornerRadius = cornerRadius; 62 | [self configureFlatSegmentedControl]; 63 | } 64 | 65 | - (void)setSelectedFont:(UIFont *)selectedFont { 66 | _selectedFont = selectedFont; 67 | [self setupFonts]; 68 | } 69 | 70 | - (void)setSelectedFontColor:(UIColor *)selectedFontColor { 71 | _selectedFontColor = selectedFontColor; 72 | [self setupFonts]; 73 | } 74 | 75 | - (void)setDeselectedFont:(UIFont *)deselectedFont { 76 | _deselectedFont = deselectedFont; 77 | [self setupFonts]; 78 | } 79 | 80 | - (void)setDeselectedFontColor:(UIColor *)deselectedFontColor { 81 | _deselectedFontColor = deselectedFontColor; 82 | [self setupFonts]; 83 | } 84 | 85 | - (void)setupFonts { 86 | NSDictionary * selectedAttributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 87 | self.selectedFontColor, 88 | UITextAttributeTextColor, 89 | [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0], 90 | UITextAttributeTextShadowColor, 91 | [NSValue valueWithUIOffset:UIOffsetMake(0, 0)], 92 | UITextAttributeTextShadowOffset, 93 | self.selectedFont, 94 | UITextAttributeFont, 95 | nil]; 96 | [self setTitleTextAttributes:selectedAttributesDictionary forState:UIControlStateSelected]; 97 | 98 | 99 | NSDictionary * deselectedAttributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 100 | self.deselectedFontColor, 101 | UITextAttributeTextColor, 102 | [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0], 103 | UITextAttributeTextShadowColor, 104 | [NSValue valueWithUIOffset:UIOffsetMake(0, 0)], 105 | UITextAttributeTextShadowOffset, 106 | self.deselectedFont, 107 | UITextAttributeFont, 108 | nil]; 109 | [self setTitleTextAttributes:deselectedAttributesDictionary forState:UIControlStateNormal]; 110 | } 111 | 112 | - (void)configureFlatSegmentedControl { 113 | 114 | UIImage *selectedBackgroundImage = [UIImage buttonImageWithColor:self.selectedColor 115 | cornerRadius:self.cornerRadius 116 | shadowColor:[UIColor clearColor] 117 | shadowInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; 118 | UIImage *deselectedBackgroundImage = [UIImage buttonImageWithColor:self.deselectedColor 119 | cornerRadius:self.cornerRadius 120 | shadowColor:[UIColor clearColor] 121 | shadowInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; 122 | 123 | UIImage *dividerImage = [[UIImage imageWithColor:self.dividerColor cornerRadius:0] imageWithMinimumSize:CGSizeMake(1, 1)]; 124 | 125 | [self setBackgroundImage:selectedBackgroundImage forState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; 126 | [self setBackgroundImage:deselectedBackgroundImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 127 | [self setDividerImage:dividerImage forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 128 | [self setDividerImage:dividerImage forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 129 | [self setDividerImage:dividerImage forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; 130 | [self setDividerImage:dividerImage forLeftSegmentState:UIControlStateSelected rightSegmentState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; 131 | 132 | } 133 | 134 | @end 135 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/FUISwitch.h: -------------------------------------------------------------------------------- 1 | // 2 | // FUISwitch.h 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/3/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface FUISwitch : UIControl 12 | 13 | @property(nonatomic,getter=isOn) BOOL on; 14 | @property(nonatomic, readwrite) UIColor *onBackgroundColor; 15 | @property(nonatomic, readwrite) UIColor *offBackgroundColor; 16 | @property(nonatomic, readwrite) UIColor *onColor; 17 | @property(nonatomic, readwrite) UIColor *offColor; 18 | @property(nonatomic, readwrite) UIColor *highlightedColor; 19 | @property(nonatomic, readwrite) CGFloat percentOn; 20 | @property(weak, readwrite, nonatomic) UILabel *offLabel; 21 | @property(weak, readwrite, nonatomic) UILabel *onLabel; 22 | - (void)setOn:(BOOL)on animated:(BOOL)animated; // does not send action 23 | 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/FUISwitch.m: -------------------------------------------------------------------------------- 1 | // 2 | // FUISwitch.m 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/3/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import "FUISwitch.h" 10 | #import "UIImage+FlatUI.h" 11 | #import "UIColor+FlatUI.h" 12 | #import 13 | 14 | @interface FUISwitch() 15 | @property(weak, readwrite, nonatomic) UIView *thumbView; 16 | @property(weak, readwrite, nonatomic) UIScrollView *internalContainer; 17 | @end 18 | 19 | @implementation FUISwitch 20 | 21 | - (id)initWithFrame:(CGRect)frame 22 | { 23 | self = [super initWithFrame:frame]; 24 | if (self) { 25 | [self sharedInit]; 26 | } 27 | return self; 28 | } 29 | 30 | - (id) initWithCoder:(NSCoder *)aDecoder { 31 | self = [super initWithCoder:aDecoder]; 32 | if (self) { 33 | [self sharedInit]; 34 | } 35 | return self; 36 | } 37 | 38 | - (void) sharedInit { 39 | self.clipsToBounds = YES; 40 | UIScrollView *internalContainer = [[UIScrollView alloc] init]; 41 | internalContainer.pagingEnabled = YES; 42 | internalContainer.showsHorizontalScrollIndicator = NO; 43 | internalContainer.showsVerticalScrollIndicator = NO; 44 | internalContainer.bounces = NO; 45 | internalContainer.userInteractionEnabled = NO; 46 | self.internalContainer = internalContainer; 47 | UILabel *offLabel = [[UILabel alloc] init]; 48 | UILabel *onLabel = [[UILabel alloc] init]; 49 | offLabel.backgroundColor = [UIColor clearColor]; 50 | onLabel.backgroundColor = [UIColor clearColor]; 51 | offLabel.textAlignment = NSTextAlignmentCenter; 52 | onLabel.textAlignment = NSTextAlignmentCenter; 53 | offLabel.text = @"OFF"; 54 | onLabel.text = @"ON"; 55 | self.offLabel = offLabel; 56 | self.onLabel = onLabel; 57 | [internalContainer addSubview:offLabel]; 58 | [internalContainer addSubview:onLabel]; 59 | UIView *thumbView = [[UIView alloc] init]; 60 | [internalContainer addSubview:thumbView]; 61 | self.thumbView = thumbView; 62 | [self addSubview:internalContainer]; 63 | 64 | UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panned:)]; 65 | panGestureRecognizer.cancelsTouchesInView = NO; 66 | [self addGestureRecognizer:panGestureRecognizer]; 67 | 68 | UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)]; 69 | [self addGestureRecognizer:tapGestureRecognizer]; 70 | _on = YES; 71 | _percentOn = 1; 72 | self.layer.cornerRadius = 3.0; 73 | } 74 | 75 | - (void) layoutSubviews { 76 | [super layoutSubviews]; 77 | 78 | //container 79 | CGSize size = self.frame.size; 80 | size.width *= 2; 81 | size.width -= self.frame.size.height; 82 | self.internalContainer.contentSize = size; 83 | self.internalContainer.frame = self.bounds; 84 | CGFloat contentHeight = self.internalContainer.contentSize.height; 85 | 86 | //thumb image 87 | CGFloat insetFraction = .75; 88 | CGFloat thumbEdgeSize = floorf(contentHeight * insetFraction); 89 | CGFloat thumbInset = (contentHeight - thumbEdgeSize) / 2; 90 | self.thumbView.frame = CGRectMake((self.internalContainer.contentSize.width - contentHeight) / 2 + thumbInset, thumbInset, thumbEdgeSize, thumbEdgeSize); 91 | self.thumbView.layer.cornerRadius = thumbEdgeSize / 2; 92 | 93 | //labels 94 | CGRect left = CGRectMake(0, 0, (self.internalContainer.contentSize.width - self.thumbView.frame.size.width)/2, contentHeight); 95 | CGRect right = left; 96 | right.origin.x = self.internalContainer.contentSize.width - left.size.width; 97 | self.offLabel.frame = right; 98 | self.onLabel.frame = left; 99 | [self setOn:_on]; 100 | } 101 | 102 | - (void) setOn:(BOOL)on { 103 | [self setOn:on animated:NO]; 104 | } 105 | 106 | - (void)setOn:(BOOL)on animated:(BOOL)animated { 107 | if (_on != on) { 108 | _on = on; 109 | [self sendActionsForControlEvents:UIControlEventValueChanged]; 110 | } 111 | [self setPercentOn:_on * 1.0f animated:animated]; 112 | } 113 | 114 | - (void) setPercentOn:(CGFloat)percentOn { 115 | [self setPercentOn:percentOn animated:NO]; 116 | } 117 | 118 | - (void) setPercentOn:(CGFloat)percentOn animated:(BOOL)animated { 119 | _percentOn = percentOn; 120 | [self updateBackground]; 121 | CGFloat maxOffset = self.internalContainer.contentSize.width - self.frame.size.width; 122 | CGPoint newOffset = CGPointMake((1 - _percentOn) * maxOffset, 0); 123 | [self.internalContainer setContentOffset:newOffset animated:animated]; 124 | } 125 | 126 | - (void) panned:(UIPanGestureRecognizer *)gestureRecognizer { 127 | 128 | CGPoint translation = [gestureRecognizer translationInView:self.internalContainer]; 129 | [gestureRecognizer setTranslation:CGPointZero inView:self.internalContainer]; 130 | CGPoint newOffset = self.internalContainer.contentOffset; 131 | newOffset.x -= translation.x; 132 | CGFloat maxOffset = self.internalContainer.contentSize.width - self.frame.size.width; 133 | newOffset.x = MAX(newOffset.x, 0); 134 | newOffset.x = MIN(newOffset.x, maxOffset); 135 | 136 | if (gestureRecognizer.state == UIGestureRecognizerStateBegan || 137 | gestureRecognizer.state == UIGestureRecognizerStateChanged) { 138 | 139 | [self setPercentOn:(1 - newOffset.x/maxOffset) animated:NO]; 140 | 141 | } 142 | else if (gestureRecognizer.state == UIGestureRecognizerStateEnded) { 143 | BOOL left = newOffset.x > maxOffset / 2; 144 | [self setOn:(!left) animated:YES]; 145 | } 146 | 147 | } 148 | 149 | - (void) tapped:(UITapGestureRecognizer *)gestureRecognizer { 150 | [self setOn:!self.on animated:YES]; 151 | } 152 | 153 | - (void) setOnBackgroundColor:(UIColor *)onBackgroundColor { 154 | _onBackgroundColor = onBackgroundColor; 155 | [self updateBackground]; 156 | } 157 | 158 | - (void) setOffBackgroundColor:(UIColor *)offBackgroundColor { 159 | _offBackgroundColor = offBackgroundColor; 160 | [self updateBackground]; 161 | } 162 | 163 | - (void) setOnColor:(UIColor *)onColor { 164 | _onColor = onColor; 165 | [self updateBackground]; 166 | } 167 | 168 | - (void) setOffColor:(UIColor *)offColor { 169 | _offColor = offColor; 170 | [self updateBackground]; 171 | } 172 | 173 | - (void) updateBackground { 174 | self.backgroundColor = [UIColor blendedColorWithForegroundColor:self.onBackgroundColor 175 | backgroundColor:self.offBackgroundColor 176 | percentBlend:self.percentOn]; 177 | UIColor *contentColor = [UIColor blendedColorWithForegroundColor:self.onColor 178 | backgroundColor:self.offColor 179 | percentBlend:self.percentOn]; 180 | self.onLabel.textColor = contentColor; 181 | self.offLabel.textColor = contentColor; 182 | self.thumbView.backgroundColor = contentColor; 183 | } 184 | 185 | - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 186 | [super touchesBegan:touches withEvent:event]; 187 | [self setHighlighted:YES]; 188 | } 189 | 190 | @end 191 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/UIBarButtonItem+FlatUI.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIBarButtonItem+FlatUI.h 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/8/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UIBarButtonItem (FlatUI) 12 | 13 | // styles a single bar button item 14 | - (void) configureFlatButtonWithColor:(UIColor *)color 15 | highlightedColor:(UIColor *)highlightedColor 16 | cornerRadius:(CGFloat) cornerRadius UI_APPEARANCE_SELECTOR; 17 | 18 | // styles all bar button items that exist within a class heirarchy (same as UIAppearanceProxy methods) 19 | + (void) configureFlatButtonsWithColor:(UIColor *) color 20 | highlightedColor:(UIColor *)highlightedColor 21 | cornerRadius:(CGFloat) cornerRadius 22 | whenContainedIn:(Class )containerClass, ... NS_REQUIRES_NIL_TERMINATION; 23 | 24 | // styles all bar button items (can be overwritten with the above methods) 25 | + (void) configureFlatButtonsWithColor:(UIColor *) color 26 | highlightedColor:(UIColor *)highlightedColor 27 | cornerRadius:(CGFloat) cornerRadius; 28 | 29 | 30 | // removes the text shadows off a single bar button item (sadly, this can't be easily done for all buttons simultaneously) 31 | - (void) removeTitleShadow; 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/UIBarButtonItem+FlatUI.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIBarButtonItem+FlatUI.m 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/8/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import "UIBarButtonItem+FlatUI.h" 10 | #import "UIImage+FlatUI.h" 11 | 12 | @implementation UIBarButtonItem (FlatUI) 13 | 14 | - (void) configureFlatButtonWithColor:(UIColor *)color 15 | highlightedColor:(UIColor *)highlightedColor 16 | cornerRadius:(CGFloat) cornerRadius { 17 | 18 | [UIBarButtonItem configureItemOrProxy:self forFlatButtonWithColor:color highlightedColor:highlightedColor cornerRadius:cornerRadius]; 19 | 20 | } 21 | 22 | + (void) configureFlatButtonsWithColor:(UIColor *) color 23 | highlightedColor:(UIColor *)highlightedColor 24 | cornerRadius:(CGFloat) cornerRadius { 25 | 26 | [self configureFlatButtonsWithColor:color highlightedColor:highlightedColor cornerRadius:cornerRadius whenContainedIn:[UINavigationBar class], [UINavigationController class], nil]; 27 | } 28 | 29 | + (void) configureFlatButtonsWithColor:(UIColor *) color 30 | highlightedColor:(UIColor *)highlightedColor 31 | cornerRadius:(CGFloat) cornerRadius 32 | whenContainedIn:(Class )containerClass, ... { 33 | va_list vl; 34 | va_start(vl, containerClass); 35 | id appearance = [UIBarButtonItem appearanceWhenContainedIn:containerClass, nil]; 36 | va_end(vl); 37 | [UIBarButtonItem configureItemOrProxy:appearance forFlatButtonWithColor:color highlightedColor:highlightedColor cornerRadius:cornerRadius]; 38 | } 39 | 40 | - (void) removeTitleShadow { 41 | NSMutableDictionary *titleTextAttributes = [[self titleTextAttributesForState:UIControlStateNormal] mutableCopy]; 42 | if (!titleTextAttributes) { 43 | titleTextAttributes = [NSMutableDictionary dictionary]; 44 | } 45 | [titleTextAttributes setValue:[NSValue valueWithUIOffset:UIOffsetMake(0, 0)] forKey:UITextAttributeTextShadowOffset]; 46 | [self setTitleTextAttributes:titleTextAttributes forState:UIControlStateNormal]; 47 | } 48 | 49 | //helper method, basically a wrapper to allow creating a custom UIAppearance method that doesn't conform to the usual naming style 50 | + (void) configureItemOrProxy:(id)appearance 51 | forFlatButtonWithColor:(UIColor *)color 52 | highlightedColor:(UIColor *)highlightedColor 53 | cornerRadius:(CGFloat) cornerRadius { 54 | UIImage *backButtonPortraitImage = [UIImage backButtonImageWithColor:color 55 | barMetrics:UIBarMetricsDefault 56 | cornerRadius:cornerRadius]; 57 | UIImage *highlightedBackButtonPortraitImage = [UIImage backButtonImageWithColor:highlightedColor 58 | barMetrics:UIBarMetricsDefault 59 | cornerRadius:cornerRadius]; 60 | UIImage *backButtonLandscapeImage = [UIImage backButtonImageWithColor:color 61 | barMetrics:UIBarMetricsLandscapePhone 62 | cornerRadius:2]; 63 | UIImage *highlightedBackButtonLandscapeImage = [UIImage backButtonImageWithColor:highlightedColor 64 | barMetrics:UIBarMetricsLandscapePhone 65 | cornerRadius:2]; 66 | 67 | [appearance setBackButtonBackgroundImage:backButtonPortraitImage 68 | forState:UIControlStateNormal 69 | barMetrics:UIBarMetricsDefault]; 70 | [appearance setBackButtonBackgroundImage:backButtonLandscapeImage 71 | forState:UIControlStateNormal 72 | barMetrics:UIBarMetricsLandscapePhone]; 73 | [appearance setBackButtonBackgroundImage:highlightedBackButtonPortraitImage 74 | forState:UIControlStateHighlighted 75 | barMetrics:UIBarMetricsDefault]; 76 | [appearance setBackButtonBackgroundImage:highlightedBackButtonLandscapeImage 77 | forState:UIControlStateHighlighted 78 | barMetrics:UIBarMetricsLandscapePhone]; 79 | 80 | [appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(1.0f, 1.0f) forBarMetrics:UIBarMetricsDefault]; 81 | [appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(1.0f, 1.0f) forBarMetrics:UIBarMetricsLandscapePhone]; 82 | 83 | UIImage *buttonImageNormal = [UIImage imageWithColor:color cornerRadius:cornerRadius]; 84 | UIImage *buttonImageHightlighted = [UIImage imageWithColor:highlightedColor cornerRadius:cornerRadius]; 85 | [appearance setBackgroundImage:buttonImageNormal forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 86 | [appearance setBackgroundImage:buttonImageHightlighted forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; 87 | } 88 | 89 | @end 90 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/UIColor+FlatUI.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+FlatUI.h 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/3/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UIColor (FlatUI) 12 | 13 | + (UIColor *) turquoiseColor; 14 | + (UIColor *) greenSeaColor; 15 | + (UIColor *) emerlandColor; 16 | + (UIColor *) nephritisColor; 17 | + (UIColor *) peterRiverColor; 18 | + (UIColor *) belizeHoleColor; 19 | + (UIColor *) amethystColor; 20 | + (UIColor *) wisteriaColor; 21 | + (UIColor *) wetAsphaltColor; 22 | + (UIColor *) midnightBlueColor; 23 | + (UIColor *) sunflowerColor; 24 | + (UIColor *) tangerineColor; 25 | + (UIColor *) carrotColor; 26 | + (UIColor *) pumpkinColor; 27 | + (UIColor *) alizarinColor; 28 | + (UIColor *) pomegranateColor; 29 | + (UIColor *) cloudsColor; 30 | + (UIColor *) silverColor; 31 | + (UIColor *) concreteColor; 32 | + (UIColor *) asbestosColor; 33 | 34 | + (UIColor *) blendedColorWithForegroundColor:(UIColor *)foregroundColor 35 | backgroundColor:(UIColor *)backgroundColor 36 | percentBlend:(CGFloat) percentBlend; 37 | 38 | @end 39 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/UIColor+FlatUI.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+FlatUI.m 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/3/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import "UIColor+FlatUI.h" 10 | 11 | @implementation UIColor (FlatUI) 12 | 13 | // Thanks to http://stackoverflow.com/questions/3805177/how-to-convert-hex-rgb-color-codes-to-uicolor 14 | + (UIColor *) colorFromHexCode:(NSString *)hexString { 15 | NSString *cleanString = [hexString stringByReplacingOccurrencesOfString:@"#" withString:@""]; 16 | if([cleanString length] == 3) { 17 | cleanString = [NSString stringWithFormat:@"%@%@%@%@%@%@", 18 | [cleanString substringWithRange:NSMakeRange(0, 1)],[cleanString substringWithRange:NSMakeRange(0, 1)], 19 | [cleanString substringWithRange:NSMakeRange(1, 1)],[cleanString substringWithRange:NSMakeRange(1, 1)], 20 | [cleanString substringWithRange:NSMakeRange(2, 1)],[cleanString substringWithRange:NSMakeRange(2, 1)]]; 21 | } 22 | if([cleanString length] == 6) { 23 | cleanString = [cleanString stringByAppendingString:@"ff"]; 24 | } 25 | 26 | unsigned int baseValue; 27 | [[NSScanner scannerWithString:cleanString] scanHexInt:&baseValue]; 28 | 29 | float red = ((baseValue >> 24) & 0xFF)/255.0f; 30 | float green = ((baseValue >> 16) & 0xFF)/255.0f; 31 | float blue = ((baseValue >> 8) & 0xFF)/255.0f; 32 | float alpha = ((baseValue >> 0) & 0xFF)/255.0f; 33 | 34 | return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; 35 | } 36 | 37 | + (UIColor *) turquoiseColor { 38 | return [UIColor colorFromHexCode:@"1ABC9C"]; 39 | } 40 | 41 | + (UIColor *) greenSeaColor { 42 | return [UIColor colorFromHexCode:@"16A085"]; 43 | } 44 | 45 | + (UIColor *) emerlandColor { 46 | return [UIColor colorFromHexCode:@"2ECC71"]; 47 | } 48 | 49 | + (UIColor *) nephritisColor { 50 | return [UIColor colorFromHexCode:@"27AE60"]; 51 | } 52 | 53 | + (UIColor *) peterRiverColor { 54 | return [UIColor colorFromHexCode:@"3498DB"]; 55 | } 56 | 57 | + (UIColor *) belizeHoleColor { 58 | return [UIColor colorFromHexCode:@"2980B9"]; 59 | } 60 | 61 | + (UIColor *) amethystColor { 62 | return [UIColor colorFromHexCode:@"9B59B6"]; 63 | } 64 | 65 | + (UIColor *) wisteriaColor { 66 | return [UIColor colorFromHexCode:@"8E44AD"]; 67 | } 68 | 69 | + (UIColor *) wetAsphaltColor { 70 | return [UIColor colorFromHexCode:@"34495E"]; 71 | } 72 | 73 | + (UIColor *) midnightBlueColor { 74 | return [UIColor colorFromHexCode:@"2C3E50"]; 75 | } 76 | 77 | + (UIColor *) sunflowerColor { 78 | return [UIColor colorFromHexCode:@"F1C40F"]; 79 | } 80 | 81 | + (UIColor *) tangerineColor { 82 | return [UIColor colorFromHexCode:@"F39C12"]; 83 | } 84 | 85 | + (UIColor *) carrotColor { 86 | return [UIColor colorFromHexCode:@"E67E22"]; 87 | } 88 | 89 | + (UIColor *) pumpkinColor { 90 | return [UIColor colorFromHexCode:@"D35400"]; 91 | } 92 | 93 | + (UIColor *) alizarinColor { 94 | return [UIColor colorFromHexCode:@"E74C3C"]; 95 | } 96 | 97 | + (UIColor *) pomegranateColor { 98 | return [UIColor colorFromHexCode:@"C0392B"]; 99 | } 100 | 101 | + (UIColor *) cloudsColor { 102 | return [UIColor colorFromHexCode:@"ECF0F1"]; 103 | } 104 | 105 | + (UIColor *) silverColor { 106 | return [UIColor colorFromHexCode:@"BDC3C7"]; 107 | } 108 | 109 | + (UIColor *) concreteColor { 110 | return [UIColor colorFromHexCode:@"95A5A6"]; 111 | } 112 | 113 | + (UIColor *) asbestosColor { 114 | return [UIColor colorFromHexCode:@"7F8C8D"]; 115 | } 116 | 117 | + (UIColor *) blendedColorWithForegroundColor:(UIColor *)foregroundColor 118 | backgroundColor:(UIColor *)backgroundColor 119 | percentBlend:(CGFloat) percentBlend { 120 | CGFloat onRed, offRed, newRed, onGreen, offGreen, newGreen, onBlue, offBlue, newBlue, onWhite, offWhite; 121 | if ([foregroundColor getWhite:&onWhite alpha:nil]) { 122 | onRed = onWhite; 123 | onBlue = onWhite; 124 | onGreen = onWhite; 125 | } 126 | else { 127 | [foregroundColor getRed:&onRed green:&onGreen blue:&onBlue alpha:nil]; 128 | } 129 | if ([backgroundColor getWhite:&offWhite alpha:nil]) { 130 | offRed = offWhite; 131 | offBlue = offWhite; 132 | offGreen = offWhite; 133 | } 134 | else { 135 | [backgroundColor getRed:&offRed green:&offGreen blue:&offBlue alpha:nil]; 136 | } 137 | newRed = onRed * percentBlend + offRed * (1-percentBlend); 138 | newGreen = onGreen * percentBlend + offGreen * (1-percentBlend); 139 | newBlue = onBlue * percentBlend + offBlue * (1-percentBlend); 140 | return [UIColor colorWithRed:newRed green:newGreen blue:newBlue alpha:1.0]; 141 | } 142 | 143 | @end 144 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/UIFont+FlatUI.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIFont+FlatUI.h 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/7/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UIFont (FlatUI) 12 | 13 | + (UIFont *)flatFontOfSize:(CGFloat)size; 14 | + (UIFont *)boldFlatFontOfSize:(CGFloat)size; 15 | + (UIFont *)italicFlatFontOfSize:(CGFloat)size; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/UIFont+FlatUI.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIFont+FlatUI.m 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/7/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import "UIFont+FlatUI.h" 10 | #import 11 | 12 | @implementation UIFont (FlatUI) 13 | 14 | + (UIFont *)flatFontOfSize:(CGFloat)size { 15 | static dispatch_once_t onceToken; 16 | dispatch_once(&onceToken, ^{ 17 | NSURL * url = [[NSBundle mainBundle] URLForResource:@"Lato-Regular" withExtension:@"ttf"]; 18 | CFErrorRef error; 19 | CTFontManagerRegisterFontsForURL((__bridge CFURLRef)url, kCTFontManagerScopeNone, &error); 20 | error = nil; 21 | }); 22 | return [UIFont fontWithName:@"Lato-Regular" size:size]; 23 | } 24 | 25 | + (UIFont *)boldFlatFontOfSize:(CGFloat)size { 26 | static dispatch_once_t onceToken; 27 | dispatch_once(&onceToken, ^{ 28 | NSURL * url = [[NSBundle mainBundle] URLForResource:@"Lato-Bold" withExtension:@"ttf"]; 29 | CFErrorRef error; 30 | CTFontManagerRegisterFontsForURL((__bridge CFURLRef)url, kCTFontManagerScopeNone, &error); 31 | error = nil; 32 | }); 33 | return [UIFont fontWithName:@"Lato-Bold" size:size]; 34 | } 35 | 36 | + (UIFont *)italicFlatFontOfSize:(CGFloat)size { 37 | static dispatch_once_t onceToken; 38 | dispatch_once(&onceToken, ^{ 39 | NSURL * url = [[NSBundle mainBundle] URLForResource:@"Lato-Italic" withExtension:@"ttf"]; 40 | CFErrorRef error; 41 | CTFontManagerRegisterFontsForURL((__bridge CFURLRef)url, kCTFontManagerScopeNone, &error); 42 | error = nil; 43 | }); 44 | return [UIFont fontWithName:@"Lato-Italic" size:size]; 45 | } 46 | 47 | @end 48 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/UIImage+FlatUI.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIImage+Color.h 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/3/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UIImage (FlatUI) 12 | 13 | 14 | + (UIImage *)imageWithColor:(UIColor *)color 15 | cornerRadius:(CGFloat)cornerRadius; 16 | 17 | + (UIImage *) buttonImageWithColor:(UIColor *)color 18 | cornerRadius:(CGFloat)cornerRadius 19 | shadowColor:(UIColor *)shadowColor 20 | shadowInsets:(UIEdgeInsets)shadowInsets; 21 | 22 | + (UIImage *) circularImageWithColor:(UIColor *)color 23 | size:(CGSize)size; 24 | 25 | - (UIImage *) imageWithMinimumSize:(CGSize)size; 26 | 27 | + (UIImage *) stepperPlusImageWithColor:(UIColor *)color; 28 | + (UIImage *) stepperMinusImageWithColor:(UIColor *)color; 29 | 30 | + (UIImage *) backButtonImageWithColor:(UIColor *)color 31 | barMetrics:(UIBarMetrics) metrics 32 | cornerRadius:(CGFloat)cornerRadius; 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/UIImage+FlatUI.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIImage+Color.m 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/3/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import "UIImage+FlatUI.h" 10 | 11 | @implementation UIImage (FlatUI) 12 | 13 | CGFloat edgeSizeFromCornerRadius(CGFloat cornerRadius) { 14 | return cornerRadius * 2 + 1; 15 | } 16 | 17 | + (UIImage *)imageWithColor:(UIColor *)color 18 | cornerRadius:(CGFloat)cornerRadius { 19 | CGFloat minEdgeSize = edgeSizeFromCornerRadius(cornerRadius); 20 | CGRect rect = CGRectMake(0, 0, minEdgeSize, minEdgeSize); 21 | UIBezierPath *roundedRect = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:cornerRadius]; 22 | roundedRect.lineWidth = 0; 23 | UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0f); 24 | [color setFill]; 25 | [roundedRect fill]; 26 | [roundedRect stroke]; 27 | [roundedRect addClip]; 28 | UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 29 | UIGraphicsEndImageContext(); 30 | return [image resizableImageWithCapInsets:UIEdgeInsetsMake(cornerRadius, cornerRadius, cornerRadius, cornerRadius)]; 31 | } 32 | 33 | + (UIImage *) buttonImageWithColor:(UIColor *)color 34 | cornerRadius:(CGFloat)cornerRadius 35 | shadowColor:(UIColor *)shadowColor 36 | shadowInsets:(UIEdgeInsets)shadowInsets { 37 | 38 | UIImage *topImage = [self imageWithColor:color cornerRadius:cornerRadius]; 39 | UIImage *bottomImage = [self imageWithColor:shadowColor cornerRadius:cornerRadius]; 40 | CGFloat totalHeight = edgeSizeFromCornerRadius(cornerRadius) + shadowInsets.top + shadowInsets.bottom; 41 | CGFloat totalWidth = edgeSizeFromCornerRadius(cornerRadius) + shadowInsets.left + shadowInsets.right; 42 | CGFloat topWidth = edgeSizeFromCornerRadius(cornerRadius); 43 | CGFloat topHeight = edgeSizeFromCornerRadius(cornerRadius); 44 | CGRect topRect = CGRectMake(shadowInsets.left, shadowInsets.top, topWidth, topHeight); 45 | CGRect bottomRect = CGRectMake(0, 0, totalWidth, totalHeight); 46 | UIGraphicsBeginImageContextWithOptions(CGSizeMake(totalWidth, totalHeight), NO, 0.0f); 47 | if (!CGRectEqualToRect(bottomRect, topRect)) { 48 | [bottomImage drawInRect:bottomRect]; 49 | } 50 | [topImage drawInRect:topRect]; 51 | UIImage *buttonImage = UIGraphicsGetImageFromCurrentImageContext(); 52 | UIEdgeInsets resizeableInsets = UIEdgeInsetsMake(cornerRadius + shadowInsets.top, 53 | cornerRadius + shadowInsets.left, 54 | cornerRadius + shadowInsets.bottom, 55 | cornerRadius + shadowInsets.right); 56 | return [buttonImage resizableImageWithCapInsets:resizeableInsets]; 57 | 58 | } 59 | 60 | + (UIImage *) circularImageWithColor:(UIColor *)color 61 | size:(CGSize)size { 62 | CGRect rect = CGRectMake(0, 0, size.width, size.height); 63 | UIBezierPath *circle = [UIBezierPath bezierPathWithOvalInRect:rect]; 64 | UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0f); 65 | [color setFill]; 66 | [color setStroke]; 67 | [circle addClip]; 68 | [circle fill]; 69 | [circle stroke]; 70 | UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 71 | UIGraphicsEndImageContext(); 72 | return image; 73 | } 74 | 75 | - (UIImage *) imageWithMinimumSize:(CGSize)size { 76 | CGRect rect = CGRectMake(0, 0, size.width, size.height); 77 | UIGraphicsBeginImageContextWithOptions(CGSizeMake(size.width, size.height), NO, 0.0f); 78 | [self drawInRect:rect]; 79 | UIImage *resized = UIGraphicsGetImageFromCurrentImageContext(); 80 | return [resized resizableImageWithCapInsets:UIEdgeInsetsMake(size.height/2, size.width/2, size.height/2, size.width/2)]; 81 | } 82 | 83 | + (UIImage *) stepperPlusImageWithColor:(UIColor *)color { 84 | CGFloat iconEdgeSize = 15; 85 | CGFloat iconInternalEdgeSize = 3; 86 | UIGraphicsBeginImageContextWithOptions(CGSizeMake(iconEdgeSize, iconEdgeSize), NO, 0.0f); 87 | CGContextRef context = UIGraphicsGetCurrentContext(); 88 | [color setFill]; 89 | CGFloat padding = (iconEdgeSize - iconInternalEdgeSize) / 2; 90 | CGContextFillRect(context, CGRectMake(padding, 0, iconInternalEdgeSize, iconEdgeSize)); 91 | CGContextFillRect(context, CGRectMake(0, padding, iconEdgeSize, iconInternalEdgeSize)); 92 | UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 93 | UIGraphicsEndImageContext(); 94 | return image; 95 | } 96 | 97 | + (UIImage *) stepperMinusImageWithColor:(UIColor *)color { 98 | CGFloat iconEdgeSize = 15; 99 | CGFloat iconInternalEdgeSize = 3; 100 | UIGraphicsBeginImageContextWithOptions(CGSizeMake(iconEdgeSize, iconEdgeSize), NO, 0.0f); 101 | CGContextRef context = UIGraphicsGetCurrentContext(); 102 | [color setFill]; 103 | CGFloat padding = (iconEdgeSize - iconInternalEdgeSize) / 2; 104 | CGContextFillRect(context, CGRectMake(0, padding, iconEdgeSize, iconInternalEdgeSize)); 105 | UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 106 | UIGraphicsEndImageContext(); 107 | return image; 108 | } 109 | 110 | + (UIImage *) backButtonImageWithColor:(UIColor *)color 111 | barMetrics:(UIBarMetrics) metrics 112 | cornerRadius:(CGFloat)cornerRadius { 113 | 114 | CGSize size; 115 | if (metrics == UIBarMetricsDefault) { 116 | size = CGSizeMake(50, 30); 117 | } 118 | else { 119 | size = CGSizeMake(60, 23); 120 | } 121 | UIBezierPath *path = [self bezierPathForBackButtonInRect:CGRectMake(0, 0, size.width, size.height) cornerRadius:cornerRadius]; 122 | UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f); 123 | [color setFill]; 124 | [path addClip]; 125 | [path fill]; 126 | UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 127 | UIGraphicsEndImageContext(); 128 | return [image resizableImageWithCapInsets:UIEdgeInsetsMake(cornerRadius, 15, cornerRadius, cornerRadius)]; 129 | 130 | } 131 | 132 | + (UIBezierPath *) bezierPathForBackButtonInRect:(CGRect)rect cornerRadius:(CGFloat)radius { 133 | UIBezierPath *path = [UIBezierPath bezierPath]; 134 | CGPoint mPoint = CGPointMake(CGRectGetMaxX(rect) - radius, rect.origin.y); 135 | CGPoint ctrlPoint = mPoint; 136 | [path moveToPoint:mPoint]; 137 | 138 | ctrlPoint.y += radius; 139 | mPoint.x += radius; 140 | mPoint.y += radius; 141 | if (radius > 0) [path addArcWithCenter:ctrlPoint radius:radius startAngle:M_PI + M_PI_2 endAngle:0 clockwise:YES]; 142 | 143 | mPoint.y = CGRectGetMaxY(rect) - radius; 144 | [path addLineToPoint:mPoint]; 145 | 146 | ctrlPoint = mPoint; 147 | mPoint.y += radius; 148 | mPoint.x -= radius; 149 | ctrlPoint.x -= radius; 150 | if (radius > 0) [path addArcWithCenter:ctrlPoint radius:radius startAngle:0 endAngle:M_PI_2 clockwise:YES]; 151 | 152 | mPoint.x = rect.origin.x + (10.0f); 153 | [path addLineToPoint:mPoint]; 154 | 155 | [path addLineToPoint:CGPointMake(rect.origin.x, CGRectGetMidY(rect))]; 156 | 157 | mPoint.y = rect.origin.y; 158 | [path addLineToPoint:mPoint]; 159 | 160 | [path closePath]; 161 | return path; 162 | } 163 | 164 | 165 | 166 | @end 167 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/UINavigationBar+FlatUI.h: -------------------------------------------------------------------------------- 1 | // 2 | // UINavigationBar+FlatUI.h 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/3/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UINavigationBar (FlatUI) 12 | 13 | - (void) configureFlatNavigationBarWithColor:(UIColor *)color; UI_APPEARANCE_SELECTOR 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/UINavigationBar+FlatUI.m: -------------------------------------------------------------------------------- 1 | // 2 | // UINavigationBar+FlatUI.m 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/3/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import "UINavigationBar+FlatUI.h" 10 | #import "UIImage+FlatUI.h" 11 | 12 | @implementation UINavigationBar (FlatUI) 13 | 14 | - (void) configureFlatNavigationBarWithColor:(UIColor *)color { 15 | [self setBackgroundImage:[UIImage imageWithColor:color cornerRadius:0] 16 | forBarMetrics:UIBarMetricsDefault & UIBarMetricsLandscapePhone]; 17 | NSMutableDictionary *titleTextAttributes = [[self titleTextAttributes] mutableCopy]; 18 | if (!titleTextAttributes) { 19 | titleTextAttributes = [NSMutableDictionary dictionary]; 20 | } 21 | [titleTextAttributes setValue:[UIColor clearColor] forKey:UITextAttributeTextShadowColor]; 22 | [titleTextAttributes setValue:[NSValue valueWithUIOffset:UIOffsetMake(0, 0)] forKey:UITextAttributeTextShadowOffset]; 23 | [self setTitleTextAttributes:titleTextAttributes]; 24 | if([self respondsToSelector:@selector(setShadowImage:)]) 25 | { 26 | [self setShadowImage:[UIImage imageWithColor:[UIColor clearColor] cornerRadius:0]]; 27 | } 28 | } 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/UIProgressView+FlatUI.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIProgressView+FlatUI.h 3 | // FlatUITestProj 4 | // 5 | // Created by Alex Medearis on 5/16/13. 6 | // Copyright (c) 2013 Alex Medearis. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UIProgressView (FlatUI) 12 | 13 | - (void) configureFlatProgressViewWithTrackColor:(UIColor *)trackColor 14 | progressColor:(UIColor *)progressColor; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/UIProgressView+FlatUI.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIProgressView+FlatUI.h 3 | // FlatUITestProj 4 | // 5 | // Created by Alex Medearis on 5/16/13. 6 | // Copyright (c) 2013 Alex Medearis. All rights reserved. 7 | // 8 | 9 | #import "UIImage+FlatUI.h" 10 | 11 | 12 | @implementation UIProgressView (FlatUI) 13 | 14 | - (void) configureFlatProgressViewWithTrackColor:(UIColor *)trackColor 15 | progressColor:(UIColor *)progressColor { 16 | 17 | UIImage *progressImage = [UIImage imageWithColor:progressColor cornerRadius:4.0]; 18 | UIImage *trackImage = [[UIImage imageWithColor:trackColor cornerRadius:4.0] 19 | imageWithMinimumSize:CGSizeMake(10, 10)]; 20 | 21 | self.trackImage = trackImage; 22 | self.progressImage = progressImage; 23 | 24 | } 25 | @end 26 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/UISlider+FlatUI.h: -------------------------------------------------------------------------------- 1 | // 2 | // UISlider+FlatUI.h 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/3/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UISlider (FlatUI) 12 | 13 | - (void) configureFlatSliderWithTrackColor:(UIColor *)trackColor 14 | progressColor:(UIColor *)progressColor 15 | thumbColor:(UIColor *)thumbColor; 16 | 17 | - (void) configureFlatSliderWithTrackColor:(UIColor *)trackColor 18 | progressColor:(UIColor *)progressColor 19 | thumbColorNormal:(UIColor *)thumbColorNormal 20 | thumbColorHighlighted:(UIColor *)highlightedThumbColor; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/UISlider+FlatUI.m: -------------------------------------------------------------------------------- 1 | // 2 | // UISlider+FlatUI.m 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/3/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import "UISlider+FlatUI.h" 10 | #import "UIImage+FlatUI.h" 11 | 12 | @implementation UISlider (FlatUI) 13 | 14 | - (void) configureFlatSliderWithTrackColor:(UIColor *)trackColor 15 | progressColor:(UIColor *)progressColor 16 | thumbColor:(UIColor *)thumbColor { 17 | 18 | [self configureFlatSliderWithTrackColor:trackColor 19 | progressColor:progressColor 20 | thumbColorNormal:thumbColor 21 | thumbColorHighlighted:thumbColor]; 22 | } 23 | 24 | - (void) configureFlatSliderWithTrackColor:(UIColor *)trackColor 25 | progressColor:(UIColor *)progressColor 26 | thumbColorNormal:(UIColor *)normalThumbColor 27 | thumbColorHighlighted:(UIColor *)highlightedThumbColor 28 | { 29 | 30 | UIImage *progressImage = [[UIImage imageWithColor:progressColor cornerRadius:5.0] 31 | imageWithMinimumSize:CGSizeMake(10, 10)]; 32 | UIImage *trackImage = [[UIImage imageWithColor:trackColor cornerRadius:5.0] 33 | imageWithMinimumSize:CGSizeMake(10, 10)]; 34 | 35 | [self setMinimumTrackImage:progressImage forState:UIControlStateNormal]; 36 | [self setMaximumTrackImage:trackImage forState:UIControlStateNormal]; 37 | 38 | UIImage *normalSliderImage = [UIImage circularImageWithColor:normalThumbColor size:CGSizeMake(24, 24)]; 39 | [self setThumbImage:normalSliderImage forState:UIControlStateNormal]; 40 | 41 | UIImage *highlighedSliderImage = [UIImage circularImageWithColor:highlightedThumbColor size:CGSizeMake(24, 24)]; 42 | [self setThumbImage:highlighedSliderImage forState:UIControlStateHighlighted]; 43 | } 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/UIStepper+FlatUI.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIStepper+FlatUI.h 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/3/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UIStepper (FlatUI) 12 | 13 | - (void) configureFlatStepperWithColor:(UIColor *)color 14 | highlightedColor:(UIColor *)highlightedColor 15 | disabledColor:(UIColor *)disabledColor 16 | iconColor:(UIColor *)iconColor; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/UIStepper+FlatUI.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIStepper+FlatUI.m 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/3/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import "UIStepper+FlatUI.h" 10 | #import "UIImage+FlatUI.h" 11 | #import 12 | 13 | @implementation UIStepper (FlatUI) 14 | 15 | - (void) configureFlatStepperWithColor:(UIColor *)color 16 | highlightedColor:(UIColor *)highlightedColor 17 | disabledColor:(UIColor *)disabledColor 18 | iconColor:(UIColor *)iconColor { 19 | 20 | // iOS 6 compat check 21 | if([self respondsToSelector:@selector(setBackgroundImage:forState:)]) 22 | { 23 | 24 | UIImage *normalImage = [UIImage imageWithColor:color cornerRadius:2.0]; 25 | UIImage *highlightedImage = [UIImage imageWithColor:highlightedColor cornerRadius:2.0]; 26 | UIImage *disabledImage = [UIImage imageWithColor:disabledColor cornerRadius:2.0]; 27 | [self setBackgroundImage:normalImage forState:UIControlStateNormal]; 28 | [self setBackgroundImage:highlightedImage forState:UIControlStateHighlighted]; 29 | [self setBackgroundImage:disabledImage forState:UIControlStateDisabled]; 30 | [self setDividerImage:[UIImage imageWithColor:highlightedColor cornerRadius:0] 31 | forLeftSegmentState:UIControlStateNormal 32 | rightSegmentState:UIControlStateNormal]; 33 | [self setDividerImage:[UIImage imageWithColor:highlightedColor cornerRadius:0] 34 | forLeftSegmentState:UIControlStateHighlighted 35 | rightSegmentState:UIControlStateNormal]; 36 | [self setDividerImage:[UIImage imageWithColor:highlightedColor cornerRadius:0] 37 | forLeftSegmentState:UIControlStateNormal 38 | rightSegmentState:UIControlStateHighlighted]; 39 | 40 | UIImage *plusImage = [UIImage stepperPlusImageWithColor:iconColor]; 41 | UIImage *minusImage = [UIImage stepperMinusImageWithColor:iconColor]; 42 | [self setIncrementImage:plusImage forState:UIControlStateNormal]; 43 | [self setIncrementImage:plusImage forState:UIControlStateDisabled]; 44 | [self setDecrementImage:minusImage forState:UIControlStateNormal]; 45 | [self setDecrementImage:minusImage forState:UIControlStateDisabled]; 46 | 47 | } 48 | 49 | } 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/UITabBar+FlatUI.h: -------------------------------------------------------------------------------- 1 | // 2 | // UITabBar+FlatUI.h 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/3/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UITabBar (FlatUI) 12 | 13 | - (void) configureFlatTabBarWithColor:(UIColor *)color 14 | selectedColor:(UIColor *)selectedColor; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /InfiniteScrollPickerExample/libraries/FlatUIKit/UITabBar+FlatUI.m: -------------------------------------------------------------------------------- 1 | // 2 | // UITabBar+FlatUI.m 3 | // FlatUI 4 | // 5 | // Created by Jack Flintermann on 5/3/13. 6 | // Copyright (c) 2013 Jack Flintermann. All rights reserved. 7 | // 8 | 9 | #import "UITabBar+FlatUI.h" 10 | #import "UIImage+FlatUI.h" 11 | 12 | @implementation UITabBar (FlatUI) 13 | 14 | - (void) configureFlatTabBarWithColor:(UIColor *)color 15 | selectedColor:(UIColor *)selectedColor { 16 | 17 | self.backgroundImage = [UIImage imageWithColor:color cornerRadius:0]; 18 | self.selectionIndicatorImage = [UIImage imageWithColor:selectedColor cornerRadius:6.0]; 19 | 20 | } 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | InfiniteScrollPicker 2 | ==================== 3 | 4 | InfiniteScrollPicker is a subclass of UIScrollView and providing infinite scrolling and size scaling for central items (refer to screenshot). This is a control that I wrote for Emodex (https://itunes.apple.com/app/emodex/id598162115?mt=8) and now I refactorred the code and open-source it to everyone. I am not going to maintain this control anymore. If you find any bug or idea to implement, please help to improve if you loved it. I appreciate for the help. 5 | 6 | [Video Demo](http://www.youtube.com/watch?v=-3Rq3ycxjs8) 7 | 8 | ![ScreenShot](https://raw.github.com/Seitk/InfiniteScrollPicker/master/screenshot0.png)   ![ScreenShot](https://raw.github.com/Seitk/InfiniteScrollPicker/master/emodex.jpg) 9 | 10 | Usage 11 | setImageAry - Basically you init the InfiniteScrollPicker with frame, set image array for it and add it to your view then everything is working. 12 | 13 | setItemSize - By default the item size is equal to your image size, but you can still set item size to specify another size for the item. 14 | Remarks: This control assumes all images in the array have the same size. 15 | 16 | setAlphaOfobjs - By default the item alpha is 1.0. You can configure the item alpha to have a highlighted feel. (Except the selected item, it's alpha is always 1.0) 17 | 18 | setPositionRatio - I am not going to talk a lot on it, but bascially it affects the alignment of items. PositionRatio = 1.0 (align bottom), PositionRatio = 2.0 (vertical align center), PositionRatio = itemSize.height (vertical align top) 19 | 20 | setHeightOffset - give offset to the scrolling items. It calculates from bottom to top. 21 | 22 | 23 | Item selection callback 24 | I was decided to make a delegate for this control but I need to subscribe to UIScrollViewDelegate in the picker view. So it is not allowed to have another delegate. At the result, it perform a selector when item snapped. You should implement the method in the view controller. It gives you an UIImage then you could calculate the selected index from the image array you passed in. 25 | \- (void)infiniteScrollPicker:(InfiniteScrollPicker *)infiniteScrollPicker didSelectAtImage:(UIImage *)image 26 | 27 | 28 | Example 29 | 30 | InfiniteScrollPicker *isp = [[InfiniteScrollPicker alloc] initWithFrame:CGRectMake(0, 0, 320, 100)]; 31 | [isp setItemSize:CGSizeMake(50, 50)]; 32 | [isp setImageAry:set1]; 33 | [self.view addSubview:isp]; 34 | 35 | InfiniteScrollPicker *isp3 = [[InfiniteScrollPicker alloc] initWithFrame:CGRectMake(0, 240, 320, 210)]; 36 | [isp3 setImageAry:set3]; 37 | [isp3 setHeightOffset:20]; 38 | [isp3 setPositionRatio:2]; 39 | [isp3 setAlphaOfobjs:0.8]; 40 | [self.view addSubview:isp3]; 41 | 42 | 43 | Contact Me 44 | You can add me on Facebook - http://www.facebook.com/seitkk 45 | -------------------------------------------------------------------------------- /Resources/Set1/s1_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set1/s1_0.png -------------------------------------------------------------------------------- /Resources/Set1/s1_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set1/s1_1.png -------------------------------------------------------------------------------- /Resources/Set1/s1_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set1/s1_2.png -------------------------------------------------------------------------------- /Resources/Set1/s1_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set1/s1_3.png -------------------------------------------------------------------------------- /Resources/Set1/s1_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set1/s1_4.png -------------------------------------------------------------------------------- /Resources/Set1/s1_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set1/s1_5.png -------------------------------------------------------------------------------- /Resources/Set2/s2_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set2/s2_1.png -------------------------------------------------------------------------------- /Resources/Set2/s2_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set2/s2_10.png -------------------------------------------------------------------------------- /Resources/Set2/s2_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set2/s2_2.png -------------------------------------------------------------------------------- /Resources/Set2/s2_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set2/s2_3.png -------------------------------------------------------------------------------- /Resources/Set2/s2_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set2/s2_4.png -------------------------------------------------------------------------------- /Resources/Set2/s2_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set2/s2_5.png -------------------------------------------------------------------------------- /Resources/Set2/s2_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set2/s2_6.png -------------------------------------------------------------------------------- /Resources/Set2/s2_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set2/s2_7.png -------------------------------------------------------------------------------- /Resources/Set2/s2_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set2/s2_8.png -------------------------------------------------------------------------------- /Resources/Set2/s2_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set2/s2_9.png -------------------------------------------------------------------------------- /Resources/Set3/s3_0.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_0.jpeg -------------------------------------------------------------------------------- /Resources/Set3/s3_1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_1.jpeg -------------------------------------------------------------------------------- /Resources/Set3/s3_10.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_10.jpeg -------------------------------------------------------------------------------- /Resources/Set3/s3_11.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_11.jpeg -------------------------------------------------------------------------------- /Resources/Set3/s3_12.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_12.jpeg -------------------------------------------------------------------------------- /Resources/Set3/s3_13.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_13.jpeg -------------------------------------------------------------------------------- /Resources/Set3/s3_14.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_14.jpeg -------------------------------------------------------------------------------- /Resources/Set3/s3_15.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_15.jpeg -------------------------------------------------------------------------------- /Resources/Set3/s3_16.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_16.jpeg -------------------------------------------------------------------------------- /Resources/Set3/s3_17.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_17.jpeg -------------------------------------------------------------------------------- /Resources/Set3/s3_18.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_18.jpeg -------------------------------------------------------------------------------- /Resources/Set3/s3_19.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_19.jpeg -------------------------------------------------------------------------------- /Resources/Set3/s3_2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_2.jpeg -------------------------------------------------------------------------------- /Resources/Set3/s3_3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_3.jpeg -------------------------------------------------------------------------------- /Resources/Set3/s3_4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_4.jpeg -------------------------------------------------------------------------------- /Resources/Set3/s3_5.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_5.jpeg -------------------------------------------------------------------------------- /Resources/Set3/s3_6.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_6.jpeg -------------------------------------------------------------------------------- /Resources/Set3/s3_7.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_7.jpeg -------------------------------------------------------------------------------- /Resources/Set3/s3_8.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_8.jpeg -------------------------------------------------------------------------------- /Resources/Set3/s3_9.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_9.jpeg -------------------------------------------------------------------------------- /Resources/Set3/s3_bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/Set3/s3_bg.jpg -------------------------------------------------------------------------------- /Resources/appicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/appicon.png -------------------------------------------------------------------------------- /Resources/appicon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/Resources/appicon@2x.png -------------------------------------------------------------------------------- /emodex.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/emodex.jpg -------------------------------------------------------------------------------- /screenshot0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seitk/InfiniteScrollPicker/578514bab09f61730f60719c3030ad0d16adb4ca/screenshot0.png --------------------------------------------------------------------------------