├── AppDelegate.h ├── AppDelegate.m ├── Assets.xcassets └── AppIcon.appiconset │ └── Contents.json ├── Base.lproj ├── LaunchScreen.storyboard └── Main.storyboard ├── Class ├── Model │ ├── JSGoodsModel.h │ └── JSGoodsModel.m ├── View │ ├── JSCarouselGoodsCell.h │ ├── JSCarouselGoodsCell.m │ ├── JSCarouselGoodsCell.xib │ ├── JSCarouselLayout.h │ └── JSCarouselLayout.m ├── ViewController │ ├── JSCarouselViewController.h │ └── JSCarouselViewController.m └── ViewModel │ ├── JSCarouselUIService.h │ ├── JSCarouselUIService.m │ ├── JSCarouselViewModel.h │ └── JSCarouselViewModel.m ├── Info.plist ├── JSCarouselDemo.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── Josin.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ └── Josin.xcuserdatad │ ├── xcdebugger │ └── Breakpoints_v2.xcbkptlist │ └── xcschemes │ ├── JSCarouselDemo.xcscheme │ └── xcschememanagement.plist ├── README.md ├── main.m └── res ├── gig.gif ├── pic_0.jpg ├── pic_1.jpg ├── pic_2.jpg └── pic_3.jpg /AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // JSCarouselDemo 4 | // 5 | // Created by 乔同新 on 16/6/13. 6 | // Copyright © 2016年 乔同新. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // JSCarouselDemo 4 | // 5 | // Created by 乔同新 on 16/6/13. 6 | // Copyright © 2016年 乔同新. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | #import "JSCarouselViewController.h" 11 | 12 | @interface AppDelegate () 13 | 14 | @end 15 | 16 | @implementation AppDelegate 17 | 18 | 19 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 20 | 21 | JSCarouselViewController *carouselVC = [[JSCarouselViewController alloc] init]; 22 | 23 | UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:carouselVC]; 24 | 25 | self.window.rootViewController = nav; 26 | 27 | return YES; 28 | } 29 | 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Class/Model/JSGoodsModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // JSGoodsModel.h 3 | // JSCarouselDemo 4 | // 5 | // Created by 乔同新 on 16/6/13. 6 | // Copyright © 2016年 乔同新. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JSGoodsModel : NSObject 12 | 13 | @property (nonatomic, strong) NSString *p_name; 14 | 15 | @property (nonatomic, strong) NSString *p_imageURL; 16 | 17 | @property (nonatomic, assign) float p_price; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /Class/Model/JSGoodsModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // JSGoodsModel.m 3 | // JSCarouselDemo 4 | // 5 | // Created by 乔同新 on 16/6/13. 6 | // Copyright © 2016年 乔同新. All rights reserved. 7 | // 8 | 9 | #import "JSGoodsModel.h" 10 | 11 | @implementation JSGoodsModel 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Class/View/JSCarouselGoodsCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // JSCarouselGoodsCell.h 3 | // JSCarouselDemo 4 | // 5 | // Created by 乔同新 on 16/6/13. 6 | // Copyright © 2016年 乔同新. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class JSGoodsModel; 12 | 13 | @interface JSCarouselGoodsCell : UICollectionViewCell 14 | 15 | @property (nonatomic, strong) JSGoodsModel *model; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Class/View/JSCarouselGoodsCell.m: -------------------------------------------------------------------------------- 1 | // 2 | // JSCarouselGoodsCell.m 3 | // JSCarouselDemo 4 | // 5 | // Created by 乔同新 on 16/6/13. 6 | // Copyright © 2016年 乔同新. All rights reserved. 7 | // 8 | 9 | #import "JSCarouselGoodsCell.h" 10 | #import "JSGoodsModel.h" 11 | 12 | @interface JSCarouselGoodsCell () 13 | @property (weak, nonatomic) IBOutlet UIImageView *goodImageView; 14 | @property (weak, nonatomic) IBOutlet UILabel *goodNameLabel; 15 | @property (weak, nonatomic) IBOutlet UILabel *goodPriceLabel; 16 | 17 | @end 18 | 19 | @implementation JSCarouselGoodsCell 20 | 21 | - (void)awakeFromNib { 22 | [super awakeFromNib]; 23 | // Initialization code 24 | } 25 | 26 | - (void)setModel:(JSGoodsModel *)model{ 27 | 28 | _model = model; 29 | 30 | _goodImageView.image = [UIImage imageNamed:model.p_imageURL]; 31 | 32 | _goodNameLabel.text = model.p_name; 33 | 34 | _goodPriceLabel.text = [NSString stringWithFormat:@"¥%0.2f",model.p_price]; 35 | } 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /Class/View/JSCarouselGoodsCell.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 28 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /Class/View/JSCarouselLayout.h: -------------------------------------------------------------------------------- 1 | // 2 | // JSCarouselLayout.h 3 | // JSCarouselDemo 4 | // 5 | // Created by 乔同新 on 16/6/13. 6 | // Copyright © 2016年 乔同新. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | typedef void(^JSCarouselSlideIndexBlock)(NSInteger index); 12 | 13 | @interface JSCarouselLayout : UICollectionViewLayout 14 | 15 | @property (nonatomic, copy) JSCarouselSlideIndexBlock carouselSlideIndexBlock; 16 | 17 | @property (nonatomic) NSInteger visibleCount; 18 | 19 | @property (nonatomic) CGSize itemSize; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /Class/View/JSCarouselLayout.m: -------------------------------------------------------------------------------- 1 | // 2 | // JSCarouselLayout.m 3 | // JSCarouselDemo 4 | // 5 | // Created by 乔同新 on 16/6/13. 6 | // Copyright © 2016年 乔同新. All rights reserved. 7 | // 8 | 9 | #import "JSCarouselLayout.h" 10 | 11 | @interface JSCarouselLayout () 12 | { 13 | CGFloat _viewHeight; 14 | CGFloat _itemHeight; 15 | CGFloat _DefaultInsetLeft; 16 | } 17 | @end 18 | 19 | @implementation JSCarouselLayout 20 | 21 | /** 22 | * 覆写prepareLayout,储存布局信息 23 | */ 24 | - (void)prepareLayout{ 25 | 26 | [super prepareLayout]; 27 | 28 | self.visibleCount = self.visibleCount<1?5:self.visibleCount; 29 | 30 | _viewHeight = CGRectGetWidth(self.collectionView.frame); 31 | _itemHeight = self.itemSize.width; 32 | //初始状态 33 | _DefaultInsetLeft = _DefaultInsetLeft == 0?-(_viewHeight - _itemHeight)/ 2:_DefaultInsetLeft; 34 | self.collectionView.contentInset = UIEdgeInsetsMake(0, _DefaultInsetLeft, 0, (_viewHeight - _itemHeight) / 2); 35 | 36 | } 37 | /** 38 | * 储存视图内容 39 | * 40 | * @param indexPath indexpath 41 | * 42 | * @return frame、size、apha、hiden 43 | */ 44 | - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath{ 45 | 46 | UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; 47 | 48 | attributes.size = self.itemSize; 49 | 50 | CGFloat cY = (self.collectionView.contentOffset.x) + _viewHeight / 2; 51 | CGFloat attributesY = _itemHeight * indexPath.row + _itemHeight / 2; 52 | attributes.zIndex = -ABS(attributesY - cY); 53 | 54 | CGFloat delta = cY - attributesY; 55 | CGFloat ratio = - delta / (_itemHeight * 2); 56 | CGFloat scale = 1 - ABS(delta) / (_itemHeight * 6.0) * cos(ratio * M_PI_4); 57 | 58 | attributes.alpha = scale; 59 | 60 | attributes.transform = CGAffineTransformMakeScale(scale, scale); 61 | 62 | CGFloat centerY = attributesY; 63 | 64 | attributes.center = CGPointMake(centerY, CGRectGetHeight(self.collectionView.frame) / 2); 65 | 66 | return attributes; 67 | } 68 | /** 69 | * 返回内容尺寸 70 | * 71 | * @return 内容尺寸 72 | */ 73 | - (CGSize)collectionViewContentSize{ 74 | 75 | NSInteger cellCount = [self.collectionView numberOfItemsInSection:0]; 76 | return CGSizeMake(cellCount * _itemHeight, CGRectGetHeight(self.collectionView.frame)); 77 | } 78 | /** 79 | * 指定的区域显示cell、SupplementaryView和DecorationView中哪些视图 80 | * 81 | * @param rect rect 82 | * 83 | * @return 返回一组UICollectionViewLayoutAttributes类型对象 84 | */ 85 | - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect { 86 | NSInteger cellCount = [self.collectionView numberOfItemsInSection:0]; 87 | CGFloat centerY = ( self.collectionView.contentOffset.x) + _viewHeight / 2; 88 | NSInteger index = centerY / _itemHeight; 89 | NSInteger count = (self.visibleCount - 1) / 2; 90 | NSInteger minIndex = MAX(0, (index - count)); 91 | NSInteger maxIndex = MIN((cellCount - 1), (index + count)); 92 | NSMutableArray *array = [NSMutableArray array]; 93 | for (NSInteger i = minIndex; i <= maxIndex; i++) { 94 | NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0]; 95 | UICollectionViewLayoutAttributes *attributes = [self layoutAttributesForItemAtIndexPath:indexPath]; 96 | [array addObject:attributes]; 97 | } 98 | return array; 99 | } 100 | 101 | - (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset 102 | withScrollingVelocity:(CGPoint)velocity { 103 | 104 | CGFloat index = roundf((( proposedContentOffset.x) + _viewHeight / 2 - _itemHeight / 2) / _itemHeight); 105 | 106 | proposedContentOffset.x = _itemHeight * index + _itemHeight / 2 - _viewHeight / 2; 107 | 108 | if (self.carouselSlideIndexBlock) { 109 | self.carouselSlideIndexBlock((NSInteger)index); 110 | } 111 | 112 | _DefaultInsetLeft = (_viewHeight - _itemHeight)/ 2; 113 | 114 | return proposedContentOffset; 115 | } 116 | 117 | - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds { 118 | return !CGRectEqualToRect(newBounds, self.collectionView.bounds); 119 | } 120 | 121 | @end 122 | -------------------------------------------------------------------------------- /Class/ViewController/JSCarouselViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // JSCarouselViewController.h 3 | // JSCarouselDemo 4 | // 5 | // Created by 乔同新 on 16/6/13. 6 | // Copyright © 2016年 乔同新. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JSCarouselViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Class/ViewController/JSCarouselViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // JSCarouselViewController.m 3 | // JSCarouselDemo 4 | // 5 | // Created by 乔同新 on 16/6/13. 6 | // Copyright © 2016年 乔同新. All rights reserved. 7 | // 8 | 9 | #import "JSCarouselViewController.h" 10 | #import "JSCarouselLayout.h" 11 | #import "JSCarouselViewModel.h" 12 | #import "JSCarouselUIService.h" 13 | 14 | @interface JSCarouselViewController () 15 | 16 | @property (nonatomic, strong) UICollectionView *carouselCollectionView; 17 | 18 | @property (nonatomic, strong) JSCarouselViewModel *viewModel; 19 | 20 | @property (nonatomic, strong) JSCarouselUIService *service; 21 | 22 | @property (nonatomic, retain) UILabel *indexLabel; 23 | 24 | @property (nonatomic, assign) NSInteger allCount; 25 | 26 | @end 27 | 28 | @implementation JSCarouselViewController 29 | 30 | - (void)viewDidLoad { 31 | [super viewDidLoad]; 32 | 33 | self.title = @"JSCarousel"; 34 | self.view.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:0.8]; 35 | self.automaticallyAdjustsScrollViewInsets = NO; 36 | /* */ 37 | [self.view addSubview:self.carouselCollectionView]; 38 | /* */ 39 | [self.viewModel getData]; 40 | [self.carouselCollectionView reloadData]; 41 | /* */ 42 | _indexLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(self.carouselCollectionView.frame), self.view.frame.size.width, 20)]; 43 | _indexLabel.textAlignment = NSTextAlignmentCenter; 44 | _indexLabel.font = [UIFont systemFontOfSize:13]; 45 | _allCount = [self.viewModel.data count]; 46 | _indexLabel.text = [NSString stringWithFormat:@"浏览记录(2/%li)",_allCount]; 47 | [self.view addSubview:_indexLabel]; 48 | 49 | } 50 | 51 | #pragma mark - lazy load 52 | 53 | - (JSCarouselViewModel *)viewModel{ 54 | 55 | if (!_viewModel) { 56 | _viewModel = [[JSCarouselViewModel alloc] init]; 57 | } 58 | return _viewModel; 59 | } 60 | 61 | - (JSCarouselUIService *)service{ 62 | 63 | if (!_service) { 64 | _service = [[JSCarouselUIService alloc] init]; 65 | _service.viewModel = self.viewModel; 66 | } 67 | return _service; 68 | } 69 | 70 | - (UICollectionView *)carouselCollectionView{ 71 | 72 | if (!_carouselCollectionView) { 73 | 74 | JSCarouselLayout *layout = [[JSCarouselLayout alloc] init]; 75 | __weak typeof (self)weakSelf = self; 76 | layout.carouselSlideIndexBlock = ^(NSInteger index){ 77 | weakSelf.indexLabel.text = [NSString stringWithFormat:@"浏览足迹(%li/%li)",index+1,_allCount]; 78 | }; 79 | layout.itemSize = CGSizeMake(190, 262); 80 | _carouselCollectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, 270) 81 | collectionViewLayout:layout]; 82 | _carouselCollectionView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5]; 83 | _carouselCollectionView.dataSource = self.service; 84 | _carouselCollectionView.delegate = self.service; 85 | _carouselCollectionView.showsHorizontalScrollIndicator = NO; 86 | _carouselCollectionView.showsVerticalScrollIndicator = NO; 87 | [_carouselCollectionView registerNib:[UINib nibWithNibName:@"JSCarouselGoodsCell" bundle:nil] 88 | forCellWithReuseIdentifier:@"JSCarouselGoodsCell"]; 89 | } 90 | return _carouselCollectionView; 91 | } 92 | 93 | @end 94 | -------------------------------------------------------------------------------- /Class/ViewModel/JSCarouselUIService.h: -------------------------------------------------------------------------------- 1 | // 2 | // JSCarouselUIService.h 3 | // JSCarouselDemo 4 | // 5 | // Created by 乔同新 on 16/6/13. 6 | // Copyright © 2016年 乔同新. All rights reserved. 7 | // 8 | #import 9 | 10 | @class JSCarouselViewModel; 11 | 12 | @interface JSCarouselUIService : NSObject 13 | 14 | @property (nonatomic, strong) JSCarouselViewModel *viewModel; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /Class/ViewModel/JSCarouselUIService.m: -------------------------------------------------------------------------------- 1 | // 2 | // JSCarouselUIService.m 3 | // JSCarouselDemo 4 | // 5 | // Created by 乔同新 on 16/6/13. 6 | // Copyright © 2016年 乔同新. All rights reserved. 7 | // 8 | 9 | #import "JSCarouselUIService.h" 10 | #import "JSCarouselGoodsCell.h" 11 | #import "JSCarouselViewModel.h" 12 | #import "JSGoodsModel.h" 13 | 14 | @implementation JSCarouselUIService 15 | 16 | #pragma mark - UICollectionView Delegate / DataSource 17 | 18 | - (NSInteger)collectionView:(UICollectionView *)collectionView 19 | numberOfItemsInSection:(NSInteger)section { 20 | return self.viewModel.data.count; 21 | } 22 | 23 | - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView 24 | cellForItemAtIndexPath:(NSIndexPath *)indexPath { 25 | 26 | JSCarouselGoodsCell *cell= [collectionView dequeueReusableCellWithReuseIdentifier:@"JSCarouselGoodsCell" 27 | forIndexPath:indexPath]; 28 | 29 | NSInteger row = indexPath.row; 30 | JSGoodsModel *model = self.viewModel.data[row]; 31 | cell.model = model; 32 | 33 | return cell; 34 | } 35 | - (void)collectionView:(UICollectionView *)collectionView 36 | didSelectItemAtIndexPath:(NSIndexPath *)indexPath { 37 | 38 | 39 | } 40 | 41 | @end 42 | -------------------------------------------------------------------------------- /Class/ViewModel/JSCarouselViewModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // JSCarouselViewModel.h 3 | // JSCarouselDemo 4 | // 5 | // Created by 乔同新 on 16/6/13. 6 | // Copyright © 2016年 乔同新. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface JSCarouselViewModel : NSObject 12 | 13 | @property (nonatomic, strong) NSMutableArray *data; 14 | 15 | - (void)getData; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Class/ViewModel/JSCarouselViewModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // JSCarouselViewModel.m 3 | // JSCarouselDemo 4 | // 5 | // Created by 乔同新 on 16/6/13. 6 | // Copyright © 2016年 乔同新. All rights reserved. 7 | // 8 | 9 | #import "JSCarouselViewModel.h" 10 | #import "JSGoodsModel.h" 11 | 12 | @implementation JSCarouselViewModel 13 | 14 | - (void)getData{ 15 | 16 | NSInteger count = 20; 17 | 18 | NSMutableArray *data = [[NSMutableArray alloc] initWithCapacity:count]; 19 | int frakeIndex = 0; 20 | for (int i = 0; i3?0:frakeIndex; 28 | 29 | [data addObject:model]; 30 | } 31 | self.data = data; 32 | } 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /JSCarouselDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 546FD0AA1D0E847700E48F49 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 546FD0891D0E847700E48F49 /* AppDelegate.m */; }; 11 | 546FD0AB1D0E847700E48F49 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 546FD08A1D0E847700E48F49 /* Assets.xcassets */; }; 12 | 546FD0AC1D0E847700E48F49 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 546FD08C1D0E847700E48F49 /* LaunchScreen.storyboard */; }; 13 | 546FD0AD1D0E847700E48F49 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 546FD08E1D0E847700E48F49 /* Main.storyboard */; }; 14 | 546FD0AE1D0E847700E48F49 /* JSGoodsModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 546FD0931D0E847700E48F49 /* JSGoodsModel.m */; }; 15 | 546FD0AF1D0E847700E48F49 /* JSCarouselGoodsCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 546FD0961D0E847700E48F49 /* JSCarouselGoodsCell.m */; }; 16 | 546FD0B01D0E847700E48F49 /* JSCarouselGoodsCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 546FD0971D0E847700E48F49 /* JSCarouselGoodsCell.xib */; }; 17 | 546FD0B11D0E847700E48F49 /* JSCarouselLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 546FD0991D0E847700E48F49 /* JSCarouselLayout.m */; }; 18 | 546FD0B21D0E847700E48F49 /* JSCarouselViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 546FD09C1D0E847700E48F49 /* JSCarouselViewController.m */; }; 19 | 546FD0B31D0E847700E48F49 /* JSCarouselUIService.m in Sources */ = {isa = PBXBuildFile; fileRef = 546FD09F1D0E847700E48F49 /* JSCarouselUIService.m */; }; 20 | 546FD0B41D0E847700E48F49 /* JSCarouselViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 546FD0A11D0E847700E48F49 /* JSCarouselViewModel.m */; }; 21 | 546FD0B51D0E847700E48F49 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 546FD0A21D0E847700E48F49 /* Info.plist */; }; 22 | 546FD0B61D0E847700E48F49 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 546FD0A31D0E847700E48F49 /* main.m */; }; 23 | 546FD0B71D0E847700E48F49 /* gig.gif in Resources */ = {isa = PBXBuildFile; fileRef = 546FD0A51D0E847700E48F49 /* gig.gif */; }; 24 | 546FD0B81D0E847700E48F49 /* pic_0.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 546FD0A61D0E847700E48F49 /* pic_0.jpg */; }; 25 | 546FD0B91D0E847700E48F49 /* pic_1.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 546FD0A71D0E847700E48F49 /* pic_1.jpg */; }; 26 | 546FD0BA1D0E847700E48F49 /* pic_2.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 546FD0A81D0E847700E48F49 /* pic_2.jpg */; }; 27 | 546FD0BB1D0E847700E48F49 /* pic_3.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 546FD0A91D0E847700E48F49 /* pic_3.jpg */; }; 28 | /* End PBXBuildFile section */ 29 | 30 | /* Begin PBXFileReference section */ 31 | 546FD0361D0E428400E48F49 /* JSCarouselDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = JSCarouselDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 32 | 546FD0881D0E847700E48F49 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 33 | 546FD0891D0E847700E48F49 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 34 | 546FD08A1D0E847700E48F49 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = ../Assets.xcassets; sourceTree = ""; }; 35 | 546FD08D1D0E847700E48F49 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = LaunchScreen.storyboard; sourceTree = ""; }; 36 | 546FD08F1D0E847700E48F49 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Main.storyboard; sourceTree = ""; }; 37 | 546FD0921D0E847700E48F49 /* JSGoodsModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSGoodsModel.h; sourceTree = ""; }; 38 | 546FD0931D0E847700E48F49 /* JSGoodsModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSGoodsModel.m; sourceTree = ""; }; 39 | 546FD0951D0E847700E48F49 /* JSCarouselGoodsCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSCarouselGoodsCell.h; sourceTree = ""; }; 40 | 546FD0961D0E847700E48F49 /* JSCarouselGoodsCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSCarouselGoodsCell.m; sourceTree = ""; }; 41 | 546FD0971D0E847700E48F49 /* JSCarouselGoodsCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSCarouselGoodsCell.xib; sourceTree = ""; }; 42 | 546FD0981D0E847700E48F49 /* JSCarouselLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSCarouselLayout.h; sourceTree = ""; }; 43 | 546FD0991D0E847700E48F49 /* JSCarouselLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSCarouselLayout.m; sourceTree = ""; }; 44 | 546FD09B1D0E847700E48F49 /* JSCarouselViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSCarouselViewController.h; sourceTree = ""; }; 45 | 546FD09C1D0E847700E48F49 /* JSCarouselViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSCarouselViewController.m; sourceTree = ""; }; 46 | 546FD09E1D0E847700E48F49 /* JSCarouselUIService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSCarouselUIService.h; sourceTree = ""; }; 47 | 546FD09F1D0E847700E48F49 /* JSCarouselUIService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSCarouselUIService.m; sourceTree = ""; }; 48 | 546FD0A01D0E847700E48F49 /* JSCarouselViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSCarouselViewModel.h; sourceTree = ""; }; 49 | 546FD0A11D0E847700E48F49 /* JSCarouselViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSCarouselViewModel.m; sourceTree = ""; }; 50 | 546FD0A21D0E847700E48F49 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = ../Info.plist; sourceTree = ""; }; 51 | 546FD0A31D0E847700E48F49 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = ../main.m; sourceTree = ""; }; 52 | 546FD0A51D0E847700E48F49 /* gig.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = gig.gif; sourceTree = ""; }; 53 | 546FD0A61D0E847700E48F49 /* pic_0.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = pic_0.jpg; sourceTree = ""; }; 54 | 546FD0A71D0E847700E48F49 /* pic_1.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = pic_1.jpg; sourceTree = ""; }; 55 | 546FD0A81D0E847700E48F49 /* pic_2.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = pic_2.jpg; sourceTree = ""; }; 56 | 546FD0A91D0E847700E48F49 /* pic_3.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = pic_3.jpg; sourceTree = ""; }; 57 | /* End PBXFileReference section */ 58 | 59 | /* Begin PBXFrameworksBuildPhase section */ 60 | 546FD0331D0E428400E48F49 /* Frameworks */ = { 61 | isa = PBXFrameworksBuildPhase; 62 | buildActionMask = 2147483647; 63 | files = ( 64 | ); 65 | runOnlyForDeploymentPostprocessing = 0; 66 | }; 67 | /* End PBXFrameworksBuildPhase section */ 68 | 69 | /* Begin PBXGroup section */ 70 | 546FD02D1D0E428400E48F49 = { 71 | isa = PBXGroup; 72 | children = ( 73 | 546FD0881D0E847700E48F49 /* AppDelegate.h */, 74 | 546FD0891D0E847700E48F49 /* AppDelegate.m */, 75 | 546FD0901D0E847700E48F49 /* Class */, 76 | 546FD0A41D0E847700E48F49 /* res */, 77 | 546FD08B1D0E847700E48F49 /* Base.lproj */, 78 | 546FD0371D0E428400E48F49 /* Products */, 79 | ); 80 | sourceTree = ""; 81 | }; 82 | 546FD0371D0E428400E48F49 /* Products */ = { 83 | isa = PBXGroup; 84 | children = ( 85 | 546FD0361D0E428400E48F49 /* JSCarouselDemo.app */, 86 | ); 87 | name = Products; 88 | sourceTree = ""; 89 | }; 90 | 546FD08B1D0E847700E48F49 /* Base.lproj */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | 546FD0A31D0E847700E48F49 /* main.m */, 94 | 546FD0A21D0E847700E48F49 /* Info.plist */, 95 | 546FD08A1D0E847700E48F49 /* Assets.xcassets */, 96 | 546FD08C1D0E847700E48F49 /* LaunchScreen.storyboard */, 97 | 546FD08E1D0E847700E48F49 /* Main.storyboard */, 98 | ); 99 | path = Base.lproj; 100 | sourceTree = ""; 101 | }; 102 | 546FD0901D0E847700E48F49 /* Class */ = { 103 | isa = PBXGroup; 104 | children = ( 105 | 546FD0911D0E847700E48F49 /* Model */, 106 | 546FD0941D0E847700E48F49 /* View */, 107 | 546FD09A1D0E847700E48F49 /* ViewController */, 108 | 546FD09D1D0E847700E48F49 /* ViewModel */, 109 | ); 110 | path = Class; 111 | sourceTree = ""; 112 | }; 113 | 546FD0911D0E847700E48F49 /* Model */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | 546FD0921D0E847700E48F49 /* JSGoodsModel.h */, 117 | 546FD0931D0E847700E48F49 /* JSGoodsModel.m */, 118 | ); 119 | path = Model; 120 | sourceTree = ""; 121 | }; 122 | 546FD0941D0E847700E48F49 /* View */ = { 123 | isa = PBXGroup; 124 | children = ( 125 | 546FD0951D0E847700E48F49 /* JSCarouselGoodsCell.h */, 126 | 546FD0961D0E847700E48F49 /* JSCarouselGoodsCell.m */, 127 | 546FD0971D0E847700E48F49 /* JSCarouselGoodsCell.xib */, 128 | 546FD0981D0E847700E48F49 /* JSCarouselLayout.h */, 129 | 546FD0991D0E847700E48F49 /* JSCarouselLayout.m */, 130 | ); 131 | path = View; 132 | sourceTree = ""; 133 | }; 134 | 546FD09A1D0E847700E48F49 /* ViewController */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | 546FD09B1D0E847700E48F49 /* JSCarouselViewController.h */, 138 | 546FD09C1D0E847700E48F49 /* JSCarouselViewController.m */, 139 | ); 140 | path = ViewController; 141 | sourceTree = ""; 142 | }; 143 | 546FD09D1D0E847700E48F49 /* ViewModel */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | 546FD09E1D0E847700E48F49 /* JSCarouselUIService.h */, 147 | 546FD09F1D0E847700E48F49 /* JSCarouselUIService.m */, 148 | 546FD0A01D0E847700E48F49 /* JSCarouselViewModel.h */, 149 | 546FD0A11D0E847700E48F49 /* JSCarouselViewModel.m */, 150 | ); 151 | path = ViewModel; 152 | sourceTree = ""; 153 | }; 154 | 546FD0A41D0E847700E48F49 /* res */ = { 155 | isa = PBXGroup; 156 | children = ( 157 | 546FD0A51D0E847700E48F49 /* gig.gif */, 158 | 546FD0A61D0E847700E48F49 /* pic_0.jpg */, 159 | 546FD0A71D0E847700E48F49 /* pic_1.jpg */, 160 | 546FD0A81D0E847700E48F49 /* pic_2.jpg */, 161 | 546FD0A91D0E847700E48F49 /* pic_3.jpg */, 162 | ); 163 | path = res; 164 | sourceTree = ""; 165 | }; 166 | /* End PBXGroup section */ 167 | 168 | /* Begin PBXNativeTarget section */ 169 | 546FD0351D0E428400E48F49 /* JSCarouselDemo */ = { 170 | isa = PBXNativeTarget; 171 | buildConfigurationList = 546FD04D1D0E428400E48F49 /* Build configuration list for PBXNativeTarget "JSCarouselDemo" */; 172 | buildPhases = ( 173 | 546FD0321D0E428400E48F49 /* Sources */, 174 | 546FD0331D0E428400E48F49 /* Frameworks */, 175 | 546FD0341D0E428400E48F49 /* Resources */, 176 | ); 177 | buildRules = ( 178 | ); 179 | dependencies = ( 180 | ); 181 | name = JSCarouselDemo; 182 | productName = JSCarouselDemo; 183 | productReference = 546FD0361D0E428400E48F49 /* JSCarouselDemo.app */; 184 | productType = "com.apple.product-type.application"; 185 | }; 186 | /* End PBXNativeTarget section */ 187 | 188 | /* Begin PBXProject section */ 189 | 546FD02E1D0E428400E48F49 /* Project object */ = { 190 | isa = PBXProject; 191 | attributes = { 192 | LastUpgradeCheck = 0730; 193 | ORGANIZATIONNAME = "乔同新"; 194 | TargetAttributes = { 195 | 546FD0351D0E428400E48F49 = { 196 | CreatedOnToolsVersion = 7.3.1; 197 | }; 198 | }; 199 | }; 200 | buildConfigurationList = 546FD0311D0E428400E48F49 /* Build configuration list for PBXProject "JSCarouselDemo" */; 201 | compatibilityVersion = "Xcode 3.2"; 202 | developmentRegion = English; 203 | hasScannedForEncodings = 0; 204 | knownRegions = ( 205 | en, 206 | Base, 207 | ); 208 | mainGroup = 546FD02D1D0E428400E48F49; 209 | productRefGroup = 546FD0371D0E428400E48F49 /* Products */; 210 | projectDirPath = ""; 211 | projectRoot = ""; 212 | targets = ( 213 | 546FD0351D0E428400E48F49 /* JSCarouselDemo */, 214 | ); 215 | }; 216 | /* End PBXProject section */ 217 | 218 | /* Begin PBXResourcesBuildPhase section */ 219 | 546FD0341D0E428400E48F49 /* Resources */ = { 220 | isa = PBXResourcesBuildPhase; 221 | buildActionMask = 2147483647; 222 | files = ( 223 | 546FD0B81D0E847700E48F49 /* pic_0.jpg in Resources */, 224 | 546FD0B71D0E847700E48F49 /* gig.gif in Resources */, 225 | 546FD0BB1D0E847700E48F49 /* pic_3.jpg in Resources */, 226 | 546FD0AD1D0E847700E48F49 /* Main.storyboard in Resources */, 227 | 546FD0AB1D0E847700E48F49 /* Assets.xcassets in Resources */, 228 | 546FD0B91D0E847700E48F49 /* pic_1.jpg in Resources */, 229 | 546FD0BA1D0E847700E48F49 /* pic_2.jpg in Resources */, 230 | 546FD0AC1D0E847700E48F49 /* LaunchScreen.storyboard in Resources */, 231 | 546FD0B51D0E847700E48F49 /* Info.plist in Resources */, 232 | 546FD0B01D0E847700E48F49 /* JSCarouselGoodsCell.xib in Resources */, 233 | ); 234 | runOnlyForDeploymentPostprocessing = 0; 235 | }; 236 | /* End PBXResourcesBuildPhase section */ 237 | 238 | /* Begin PBXSourcesBuildPhase section */ 239 | 546FD0321D0E428400E48F49 /* Sources */ = { 240 | isa = PBXSourcesBuildPhase; 241 | buildActionMask = 2147483647; 242 | files = ( 243 | 546FD0B21D0E847700E48F49 /* JSCarouselViewController.m in Sources */, 244 | 546FD0AF1D0E847700E48F49 /* JSCarouselGoodsCell.m in Sources */, 245 | 546FD0AA1D0E847700E48F49 /* AppDelegate.m in Sources */, 246 | 546FD0B11D0E847700E48F49 /* JSCarouselLayout.m in Sources */, 247 | 546FD0B41D0E847700E48F49 /* JSCarouselViewModel.m in Sources */, 248 | 546FD0B31D0E847700E48F49 /* JSCarouselUIService.m in Sources */, 249 | 546FD0B61D0E847700E48F49 /* main.m in Sources */, 250 | 546FD0AE1D0E847700E48F49 /* JSGoodsModel.m in Sources */, 251 | ); 252 | runOnlyForDeploymentPostprocessing = 0; 253 | }; 254 | /* End PBXSourcesBuildPhase section */ 255 | 256 | /* Begin PBXVariantGroup section */ 257 | 546FD08C1D0E847700E48F49 /* LaunchScreen.storyboard */ = { 258 | isa = PBXVariantGroup; 259 | children = ( 260 | 546FD08D1D0E847700E48F49 /* Base */, 261 | ); 262 | name = LaunchScreen.storyboard; 263 | sourceTree = ""; 264 | }; 265 | 546FD08E1D0E847700E48F49 /* Main.storyboard */ = { 266 | isa = PBXVariantGroup; 267 | children = ( 268 | 546FD08F1D0E847700E48F49 /* Base */, 269 | ); 270 | name = Main.storyboard; 271 | sourceTree = ""; 272 | }; 273 | /* End PBXVariantGroup section */ 274 | 275 | /* Begin XCBuildConfiguration section */ 276 | 546FD04B1D0E428400E48F49 /* Debug */ = { 277 | isa = XCBuildConfiguration; 278 | buildSettings = { 279 | ALWAYS_SEARCH_USER_PATHS = NO; 280 | CLANG_ANALYZER_NONNULL = YES; 281 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 282 | CLANG_CXX_LIBRARY = "libc++"; 283 | CLANG_ENABLE_MODULES = YES; 284 | CLANG_ENABLE_OBJC_ARC = YES; 285 | CLANG_WARN_BOOL_CONVERSION = YES; 286 | CLANG_WARN_CONSTANT_CONVERSION = YES; 287 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 288 | CLANG_WARN_EMPTY_BODY = YES; 289 | CLANG_WARN_ENUM_CONVERSION = YES; 290 | CLANG_WARN_INT_CONVERSION = YES; 291 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 292 | CLANG_WARN_UNREACHABLE_CODE = YES; 293 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 294 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 295 | COPY_PHASE_STRIP = NO; 296 | DEBUG_INFORMATION_FORMAT = dwarf; 297 | ENABLE_STRICT_OBJC_MSGSEND = YES; 298 | ENABLE_TESTABILITY = YES; 299 | GCC_C_LANGUAGE_STANDARD = gnu99; 300 | GCC_DYNAMIC_NO_PIC = NO; 301 | GCC_NO_COMMON_BLOCKS = YES; 302 | GCC_OPTIMIZATION_LEVEL = 0; 303 | GCC_PREPROCESSOR_DEFINITIONS = ( 304 | "DEBUG=1", 305 | "$(inherited)", 306 | ); 307 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 308 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 309 | GCC_WARN_UNDECLARED_SELECTOR = YES; 310 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 311 | GCC_WARN_UNUSED_FUNCTION = YES; 312 | GCC_WARN_UNUSED_VARIABLE = YES; 313 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 314 | MTL_ENABLE_DEBUG_INFO = YES; 315 | ONLY_ACTIVE_ARCH = YES; 316 | SDKROOT = iphoneos; 317 | }; 318 | name = Debug; 319 | }; 320 | 546FD04C1D0E428400E48F49 /* Release */ = { 321 | isa = XCBuildConfiguration; 322 | buildSettings = { 323 | ALWAYS_SEARCH_USER_PATHS = NO; 324 | CLANG_ANALYZER_NONNULL = YES; 325 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 326 | CLANG_CXX_LIBRARY = "libc++"; 327 | CLANG_ENABLE_MODULES = YES; 328 | CLANG_ENABLE_OBJC_ARC = YES; 329 | CLANG_WARN_BOOL_CONVERSION = YES; 330 | CLANG_WARN_CONSTANT_CONVERSION = YES; 331 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 332 | CLANG_WARN_EMPTY_BODY = YES; 333 | CLANG_WARN_ENUM_CONVERSION = YES; 334 | CLANG_WARN_INT_CONVERSION = YES; 335 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 336 | CLANG_WARN_UNREACHABLE_CODE = YES; 337 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 338 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 339 | COPY_PHASE_STRIP = NO; 340 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 341 | ENABLE_NS_ASSERTIONS = NO; 342 | ENABLE_STRICT_OBJC_MSGSEND = YES; 343 | GCC_C_LANGUAGE_STANDARD = gnu99; 344 | GCC_NO_COMMON_BLOCKS = YES; 345 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 346 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 347 | GCC_WARN_UNDECLARED_SELECTOR = YES; 348 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 349 | GCC_WARN_UNUSED_FUNCTION = YES; 350 | GCC_WARN_UNUSED_VARIABLE = YES; 351 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 352 | MTL_ENABLE_DEBUG_INFO = NO; 353 | SDKROOT = iphoneos; 354 | VALIDATE_PRODUCT = YES; 355 | }; 356 | name = Release; 357 | }; 358 | 546FD04E1D0E428400E48F49 /* Debug */ = { 359 | isa = XCBuildConfiguration; 360 | buildSettings = { 361 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 362 | INFOPLIST_FILE = "$(SRCROOT)/Info.plist"; 363 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 364 | PRODUCT_BUNDLE_IDENTIFIER = com.jyd.JSCarouselDemo; 365 | PRODUCT_NAME = "$(TARGET_NAME)"; 366 | }; 367 | name = Debug; 368 | }; 369 | 546FD04F1D0E428400E48F49 /* Release */ = { 370 | isa = XCBuildConfiguration; 371 | buildSettings = { 372 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 373 | INFOPLIST_FILE = "$(SRCROOT)/Info.plist"; 374 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 375 | PRODUCT_BUNDLE_IDENTIFIER = com.jyd.JSCarouselDemo; 376 | PRODUCT_NAME = "$(TARGET_NAME)"; 377 | }; 378 | name = Release; 379 | }; 380 | /* End XCBuildConfiguration section */ 381 | 382 | /* Begin XCConfigurationList section */ 383 | 546FD0311D0E428400E48F49 /* Build configuration list for PBXProject "JSCarouselDemo" */ = { 384 | isa = XCConfigurationList; 385 | buildConfigurations = ( 386 | 546FD04B1D0E428400E48F49 /* Debug */, 387 | 546FD04C1D0E428400E48F49 /* Release */, 388 | ); 389 | defaultConfigurationIsVisible = 0; 390 | defaultConfigurationName = Release; 391 | }; 392 | 546FD04D1D0E428400E48F49 /* Build configuration list for PBXNativeTarget "JSCarouselDemo" */ = { 393 | isa = XCConfigurationList; 394 | buildConfigurations = ( 395 | 546FD04E1D0E428400E48F49 /* Debug */, 396 | 546FD04F1D0E428400E48F49 /* Release */, 397 | ); 398 | defaultConfigurationIsVisible = 0; 399 | defaultConfigurationName = Release; 400 | }; 401 | /* End XCConfigurationList section */ 402 | }; 403 | rootObject = 546FD02E1D0E428400E48F49 /* Project object */; 404 | } 405 | -------------------------------------------------------------------------------- /JSCarouselDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /JSCarouselDemo.xcodeproj/project.xcworkspace/xcuserdata/Josin.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Josin22/JSCarouselDemo/e8117883b7a8ff1dcbf4398faf25b37623421187/JSCarouselDemo.xcodeproj/project.xcworkspace/xcuserdata/Josin.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /JSCarouselDemo.xcodeproj/xcuserdata/Josin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /JSCarouselDemo.xcodeproj/xcuserdata/Josin.xcuserdatad/xcschemes/JSCarouselDemo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /JSCarouselDemo.xcodeproj/xcuserdata/Josin.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | JSCarouselDemo.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 546FD0351D0E428400E48F49 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![image](https://github.com/Josin22/JSCarouselDemo/blob/master/res/gig.gif) 2 | >JSCarouselDemo 3 | >> MVVM &&喜欢点个star吧,谢谢~ 4 | -------------------------------------------------------------------------------- /main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // JSCarouselDemo 4 | // 5 | // Created by 乔同新 on 16/6/13. 6 | // Copyright © 2016年 乔同新. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /res/gig.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Josin22/JSCarouselDemo/e8117883b7a8ff1dcbf4398faf25b37623421187/res/gig.gif -------------------------------------------------------------------------------- /res/pic_0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Josin22/JSCarouselDemo/e8117883b7a8ff1dcbf4398faf25b37623421187/res/pic_0.jpg -------------------------------------------------------------------------------- /res/pic_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Josin22/JSCarouselDemo/e8117883b7a8ff1dcbf4398faf25b37623421187/res/pic_1.jpg -------------------------------------------------------------------------------- /res/pic_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Josin22/JSCarouselDemo/e8117883b7a8ff1dcbf4398faf25b37623421187/res/pic_2.jpg -------------------------------------------------------------------------------- /res/pic_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Josin22/JSCarouselDemo/e8117883b7a8ff1dcbf4398faf25b37623421187/res/pic_3.jpg --------------------------------------------------------------------------------