diff --git a/ICViewPager/Controller/ContentViewController.h b/ICViewPager/Controller/ContentViewController.h index f77a6c6..0684a6b 100644 --- a/ICViewPager/Controller/ContentViewController.h +++ b/ICViewPager/Controller/ContentViewController.h @@ -7,6 +7,7 @@ // #import +#define NSLog(__FORMAT__, ...) @interface ContentViewController : UIViewController diff --git a/ICViewPager/Controller/HostViewController.m b/ICViewPager/Controller/HostViewController.m index b113549..ff226e6 100644 --- a/ICViewPager/Controller/HostViewController.m +++ b/ICViewPager/Controller/HostViewController.m @@ -12,6 +12,7 @@ @interface HostViewController () @property (nonatomic) NSUInteger numberOfTabs; +@property (strong, nonatomic) NSArray* tabTitles; @end @@ -25,20 +26,13 @@ - (void)viewDidLoad { self.delegate = self; self.title = @"View Pager"; + self.tabTitles = @[@"DESTACADOS", @"ARTE & CULTURA",@"COMIDA",@"CINE", @"MUSICA", @"TEATRO", @"DEPORTE", @"HAPPY HOURS"]; // Keeps tab bar below navigation bar on iOS 7.0+ // if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) { // self.edgesForExtendedLayout = UIRectEdgeNone; // } - self.navigationItem.rightBarButtonItem = ({ - - UIBarButtonItem *button; - button = [[UIBarButtonItem alloc] initWithTitle:@"Tab #5" style:UIBarButtonItemStylePlain target:self action:@selector(selectTabWithNumberFive)]; - - button; - }); - } - (void)viewDidAppear:(BOOL)animated { @@ -58,6 +52,7 @@ - (void)setNumberOfTabs:(NSUInteger)numberOfTabs { // Set numberOfTabs _numberOfTabs = numberOfTabs; + _numberOfTabs = self.tabTitles.count; // Reload data [self reloadData]; @@ -88,19 +83,22 @@ - (UIView *)viewPager:(ViewPagerController *)viewPager viewForTabAtIndex:(NSUInt UILabel *label = [UILabel new]; label.backgroundColor = [UIColor clearColor]; label.font = [UIFont systemFontOfSize:12.0]; - label.text = [NSString stringWithFormat:@"Tab #%i", index]; + label.text = [NSString stringWithFormat:@"%@", self.tabTitles[index]]; label.textAlignment = NSTextAlignmentCenter; label.textColor = [UIColor blackColor]; [label sizeToFit]; return label; } +-(NSArray*) viewPagerTabs { + return self.tabTitles; +} - (UIViewController *)viewPager:(ViewPagerController *)viewPager contentViewControllerForTabAtIndex:(NSUInteger)index { ContentViewController *cvc = [self.storyboard instantiateViewControllerWithIdentifier:@"contentViewController"]; - cvc.labelString = [NSString stringWithFormat:@"Content View #%i", index]; + cvc.labelString = [NSString stringWithFormat:@"Content View #%lu", (unsigned long)index]; return cvc; } @@ -114,7 +112,7 @@ - (CGFloat)viewPager:(ViewPagerController *)viewPager valueForOption:(ViewPagerO case ViewPagerOptionCenterCurrentTab: return 1.0; case ViewPagerOptionTabLocation: - return 0.0; + return 1.0; case ViewPagerOptionTabHeight: return 49.0; case ViewPagerOptionTabOffset: @@ -122,8 +120,22 @@ - (CGFloat)viewPager:(ViewPagerController *)viewPager valueForOption:(ViewPagerO case ViewPagerOptionTabWidth: return UIInterfaceOrientationIsLandscape(self.interfaceOrientation) ? 128.0 : 96.0; case ViewPagerOptionFixFormerTabsPositions: - return 1.0; + return 0.0; case ViewPagerOptionFixLatterTabsPositions: + return 0.0; + case ViewPagerOptionLowerTabBar: + return 0.0; + case ViewPagerOptionRelativeTitleSizes: + return 1.0; + case ViewPagerOptionRelativeTitlePadding: + return 20.0; + case ViewPagerOptionTaBarBottomPadding: + + return 0.0; + case ViewPagerOptionScrollBounce: + + return UIInterfaceOrientationIsLandscape(self.interfaceOrientation) ? 1.0 : 0.0; + case ViewPagerOptionShowTabs: return 1.0; default: return value; diff --git a/ICViewPager/ICViewPager/ViewPagerController.h b/ICViewPager/ICViewPager/ViewPagerController.h index 6652bfd..f7049e6 100644 --- a/ICViewPager/ICViewPager/ViewPagerController.h +++ b/ICViewPager/ICViewPager/ViewPagerController.h @@ -7,6 +7,7 @@ // #import +#define NSLog(__FORMAT__, ...) /** * Every option has a default value. @@ -19,6 +20,10 @@ * ViewPagerOptionCenterCurrentTab: 1.0: YES, 0.0: NO, defines if tabs should be centered, with the given tabWidth. Defaults to NO * ViewPagerOptionFixFormerTabsPositions: 1.0: YES, 0.0: NO, defines if the active tab should be placed margined by the offset amount to the left. Effects only the former tabs. If set 1.0 (YES), first tab will be placed at the same position with the second one, leaving space before itself. Defaults to NO * ViewPagerOptionFixLatterTabsPositions: 1.0: YES, 0.0: NO, like ViewPagerOptionFixFormerTabsPositions, but effects the latter tabs, making them leave space after themselves. Defaults to NO + + * ViewPagerOptionRelativeTitleSizes: 1.0: YES, 0.0: NO, if YES will calculate the tab width based on the view's width. Defaults to NO + * ViewPagerOptionRelativeTitlePadding: The spacing between tabs, defaults to 15.0. This will only have an effect if ViewPagerOptionRelativeTitleSizes is YES + * ViewPagerOptionLowerTabBar: Lowers the tabs n the view controller by the amount. Defaults to 0.0 which makesthe tabs be on top or on bottom depending on ViewPagerOptionTabLocation. Accepts negative values to raise the tabs. */ typedef NS_ENUM(NSUInteger, ViewPagerOption) { ViewPagerOptionTabHeight, @@ -28,7 +33,14 @@ typedef NS_ENUM(NSUInteger, ViewPagerOption) { ViewPagerOptionStartFromSecondTab, ViewPagerOptionCenterCurrentTab, ViewPagerOptionFixFormerTabsPositions, - ViewPagerOptionFixLatterTabsPositions + ViewPagerOptionFixLatterTabsPositions, + ViewPagerOptionRelativeTitleSizes, + ViewPagerOptionRelativeTitlePadding, + ViewPagerOptionLowerTabBar, + ViewPagerOptionTaBarBottomPadding, + ViewPagerOptionScrollBounce, + ViewPagerOptionShowTabs + }; /** @@ -154,7 +166,6 @@ typedef NS_ENUM(NSUInteger, ViewPagerComponent) { * @return A view which will be shown as content */ - (UIView *)viewPager:(ViewPagerController *)viewPager contentViewForTabAtIndex:(NSUInteger)index; - @end #pragma mark delegate diff --git a/ICViewPager/ICViewPager/ViewPagerController.m b/ICViewPager/ICViewPager/ViewPagerController.m index 14c21df..25c015e 100644 --- a/ICViewPager/ICViewPager/ViewPagerController.m +++ b/ICViewPager/ICViewPager/ViewPagerController.m @@ -21,6 +21,13 @@ #define kCenterCurrentTab 0.0 #define kFixFormerTabsPositions 0.0 #define kFixLatterTabsPositions 0.0 +#define kLowerTabLocation 0.0 +#define kRelativeTitle 0.0 +#define kRelativeTitlePadding 10.0 +#define kTabBarBottomPadding 0.0 +#define kScrollBounce 1.0 +#define kShowTabs 1.0 + #define kIndicatorColor [UIColor colorWithRed:178.0/255.0 green:203.0/255.0 blue:57.0/255.0 alpha:0.75] #define kTabsViewBackgroundColor [UIColor colorWithRed:234.0/255.0 green:234.0/255.0 blue:234.0/255.0 alpha:0.75] @@ -81,22 +88,6 @@ - (void)drawRect:(CGRect)rect { UIBezierPath *bezierPath; - // Draw top line - bezierPath = [UIBezierPath bezierPath]; - [bezierPath moveToPoint:CGPointMake(0.0, 0.0)]; - [bezierPath addLineToPoint:CGPointMake(CGRectGetWidth(rect), 0.0)]; - [[UIColor colorWithWhite:197.0/255.0 alpha:0.75] setStroke]; - [bezierPath setLineWidth:1.0]; - [bezierPath stroke]; - - // Draw bottom line - bezierPath = [UIBezierPath bezierPath]; - [bezierPath moveToPoint:CGPointMake(0.0, CGRectGetHeight(rect))]; - [bezierPath addLineToPoint:CGPointMake(CGRectGetWidth(rect), CGRectGetHeight(rect))]; - [[UIColor colorWithWhite:197.0/255.0 alpha:0.75] setStroke]; - [bezierPath setLineWidth:1.0]; - [bezierPath stroke]; - // Draw an indicator line if tab is selected if (self.selected) { @@ -135,6 +126,12 @@ @interface ViewPagerController () =0?relativeTitlePadding:[NSNumber numberWithFloat:kRelativeTitlePadding]; +} + - (void)setActiveTabIndex:(NSUInteger)activeTabIndex { TabView *activeTabView; @@ -549,6 +620,67 @@ - (UIColor *)contentViewBackgroundColor { } return _contentViewBackgroundColor; } +- (NSNumber *)tabBarBottomPadding { + if (!_tabBarBottomPadding) { + CGFloat value = kTabBarBottomPadding; + if ([self.delegate respondsToSelector:@selector(viewPager:valueForOption:withDefault:)]) + value = [self.delegate viewPager:self valueForOption:ViewPagerOptionTaBarBottomPadding withDefault:value]; + self.tabBarBottomPadding = [NSNumber numberWithFloat:value]; + } + return _tabBarBottomPadding; +} + +- (NSNumber *)showTabs { + if (!_showTabs) { + CGFloat value = kShowTabs; + if ([self.delegate respondsToSelector:@selector(viewPager:valueForOption:withDefault:)]) + value = [self.delegate viewPager:self valueForOption:ViewPagerOptionShowTabs withDefault:value]; + self.showTabs = [NSNumber numberWithFloat:value]; + } + return _showTabs; +} + +- (NSNumber *)scrollBounce { + if (!_scrollBounce) { + CGFloat value = kScrollBounce; + if ([self.delegate respondsToSelector:@selector(viewPager:valueForOption:withDefault:)]) + value = [self.delegate viewPager:self valueForOption:ViewPagerOptionScrollBounce withDefault:value]; + self.scrollBounce = [NSNumber numberWithFloat:value]; + } + return _scrollBounce; +} + +- (NSNumber *)relativeTitleSizes { + if (!_tabWidth) { + CGFloat value = kRelativeTitle; + if ([self.delegate respondsToSelector:@selector(viewPager:valueForOption:withDefault:)]) + value = [self.delegate viewPager:self valueForOption:ViewPagerOptionRelativeTitleSizes withDefault:value]; + self.tabWidth = [NSNumber numberWithFloat:value]; + } + return _tabWidth; +} +- (NSNumber *)lowerTabLocation { + if (!_lowerTabLocation) { + CGFloat value = kLowerTabLocation; + if ([self.delegate respondsToSelector:@selector(viewPager:valueForOption:withDefault:)]) + value = [self.delegate viewPager:self valueForOption:ViewPagerOptionLowerTabBar withDefault:value]; + self.lowerTabLocation = [NSNumber numberWithFloat:value]; + } + return _lowerTabLocation; +} + +- (NSNumber*)relativeTitlePadding { + if (!_relativeTitlePadding) { + CGFloat value = kRelativeTitlePadding; + if ([self.delegate respondsToSelector:@selector(viewPager:valueForOption:withDefault:)]) + value = [self.delegate viewPager:self valueForOption:ViewPagerOptionRelativeTitlePadding withDefault:value]; + _relativeTitlePadding = [NSNumber numberWithFloat:value]; + } + _relativeTitlePadding = _relativeTitlePadding>=0?_relativeTitlePadding:[NSNumber numberWithFloat:kRelativeTitlePadding]; + + return _relativeTitlePadding; +} + #pragma mark - Public methods - (void)reloadData { @@ -558,6 +690,9 @@ - (void)reloadData { // Empty all options _tabHeight = nil; _tabOffset = nil; + _tabBarBottomPadding = nil; + _scrollBounce=nil; + _showTabs=nil; _tabWidth = nil; _tabLocation = nil; _startFromSecondTab = nil; @@ -607,6 +742,13 @@ - (void)setNeedsReloadOptions { self.centerCurrentTab = [NSNumber numberWithFloat:[self.delegate viewPager:self valueForOption:ViewPagerOptionCenterCurrentTab withDefault:kCenterCurrentTab]]; self.fixFormerTabsPositions = [NSNumber numberWithFloat:[self.delegate viewPager:self valueForOption:ViewPagerOptionFixFormerTabsPositions withDefault:kFixFormerTabsPositions]]; self.fixLatterTabsPositions = [NSNumber numberWithFloat:[self.delegate viewPager:self valueForOption:ViewPagerOptionFixLatterTabsPositions withDefault:kFixLatterTabsPositions]]; + self.lowerTabLocation = [NSNumber numberWithFloat:[self.delegate viewPager:self valueForOption:ViewPagerOptionLowerTabBar withDefault:kFixLatterTabsPositions]]; + + self.tabBarBottomPadding = [NSNumber numberWithFloat:[self.delegate viewPager:self valueForOption:ViewPagerOptionTaBarBottomPadding withDefault:kTabBarBottomPadding]]; + + self.scrollBounce = [NSNumber numberWithFloat:[self.delegate viewPager:self valueForOption:ViewPagerOptionScrollBounce withDefault:kScrollBounce]]; + self.showTabs = [NSNumber numberWithFloat:[self.delegate viewPager:self valueForOption:ViewPagerOptionShowTabs withDefault:kScrollBounce]]; + // We should update contentSize property of our tabsView, so we should recalculate it with the new values CGFloat contentSizeWidth = 0; @@ -649,6 +791,9 @@ - (void)setNeedsReloadOptions { // Update tabsView's contentSize with the new width self.tabsView.contentSize = CGSizeMake(contentSizeWidth, [self.tabHeight floatValue]); + + + } - (void)setNeedsReloadColors { @@ -721,6 +866,18 @@ - (CGFloat)valueForOption:(ViewPagerOption)option { return [[self startFromSecondTab] floatValue]; case ViewPagerOptionCenterCurrentTab: return [[self centerCurrentTab] floatValue]; + case ViewPagerOptionRelativeTitleSizes: + return [[self relativeTitleSizes] floatValue]; + case ViewPagerOptionRelativeTitlePadding: + return [[self relativeTitlePadding] floatValue]; + case ViewPagerOptionLowerTabBar: + return [[self lowerTabLocation] floatValue]; + case ViewPagerOptionTaBarBottomPadding: + return [[self tabBarBottomPadding] floatValue]; + case ViewPagerOptionScrollBounce: + return [[self scrollBounce] floatValue]; + case ViewPagerOptionShowTabs: + return [[self showTabs] floatValue]; default: return NAN; } @@ -759,6 +916,7 @@ - (void)defaultSettings { self.animatingToTab = NO; self.defaultSetupDone = NO; + self.isScrolling = NO; } - (void)defaultSetup { @@ -821,7 +979,15 @@ - (void)defaultSetup { CGRect frame = tabView.frame; frame.origin.x = contentSizeWidth; - frame.size.width = [self.tabWidth floatValue]; + + CGFloat tabWidth = [self.tabWidth floatValue]; + //Set the tab's frame + if (self.relativeTitleSizes){ + tabWidth = [self tabViewAtIndex:i].frame.size.width;//[self.dataSource viewPager:self viewForTabAtIndex:i].frame.size.width; + } + + frame.size.width = tabWidth; + tabView.frame = frame; [self.tabsView addSubview:tabView]; @@ -832,6 +998,7 @@ - (void)defaultSetup { UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]; [tabView addGestureRecognizer:tapGestureRecognizer]; } + NSLog(@"content size: %f", contentSizeWidth); // Extend contentSizeWidth if fixLatterTabsPositions is provided YES if ([self.fixLatterTabsPositions boolValue]) { @@ -866,6 +1033,9 @@ - (void)defaultSetup { // Set setup done self.defaultSetupDone = YES; + + + } - (TabView *)tabViewAtIndex:(NSUInteger)index { @@ -881,7 +1051,14 @@ - (TabView *)tabViewAtIndex:(NSUInteger)index { tabViewContent.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; // Create TabView and subview the content - TabView *tabView = [[TabView alloc] initWithFrame:CGRectMake(0.0, 0.0, [self.tabWidth floatValue], [self.tabHeight floatValue])]; + TabView *tabView = nil; + if (self.relativeTitleSizes){ + + tabView = [[TabView alloc] initWithFrame:CGRectMake(0.0, 0.0, tabViewContent.frame.size.width+[self.relativeTitlePadding floatValue], [self.tabHeight floatValue])]; + }else { + tabView = [[TabView alloc] initWithFrame:CGRectMake(0.0, 0.0, [self.tabWidth floatValue], [self.tabHeight floatValue])]; + } + [tabView addSubview:tabViewContent]; [tabView setClipsToBounds:YES]; [tabView setIndicatorColor:self.indicatorColor]; @@ -997,6 +1174,7 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView { } } - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { + self.isScrolling = YES; if ([self.actualDelegate respondsToSelector:@selector(scrollViewWillBeginDragging:)]) { [self.actualDelegate scrollViewWillBeginDragging:scrollView]; } @@ -1028,6 +1206,7 @@ - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView { } } - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { + self.isScrolling = NO; if ([self.actualDelegate respondsToSelector:@selector(scrollViewDidEndDecelerating:)]) { [self.actualDelegate scrollViewDidEndDecelerating:scrollView]; } diff --git a/ICViewPager/Images.xcassets/AppIcon.appiconset/Contents.json b/ICViewPager/Images.xcassets/AppIcon.appiconset/Contents.json index 8dc09c3..1806879 100644 --- a/ICViewPager/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/ICViewPager/Images.xcassets/AppIcon.appiconset/Contents.json @@ -32,6 +32,11 @@ "filename" : "Icon.png", "scale" : "2x" }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, { "idiom" : "ipad", "size" : "29x29",