From ad0eaafe12a1af2725f6a9c6796f406d74a887a5 Mon Sep 17 00:00:00 2001 From: Angel Garcia Date: Thu, 4 Oct 2012 13:50:28 +0200 Subject: [PATCH 1/4] Added ability to set views from Interface Builder with different layout --- Demo.xcodeproj/project.pbxproj | 2 + Demo/MHTabBarController-Protected.h | 18 ++++ Demo/MHTabBarController.m | 148 ++++++++++++++-------------- 3 files changed, 96 insertions(+), 72 deletions(-) create mode 100644 Demo/MHTabBarController-Protected.h diff --git a/Demo.xcodeproj/project.pbxproj b/Demo.xcodeproj/project.pbxproj index 82474f7..ce3295f 100644 --- a/Demo.xcodeproj/project.pbxproj +++ b/Demo.xcodeproj/project.pbxproj @@ -21,6 +21,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 0B0F9FFB161DAF34000B7AD7 /* MHTabBarController-Protected.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MHTabBarController-Protected.h"; sourceTree = ""; }; 7BCE96EA1469751600135C63 /* Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Demo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 7BCE96EE1469751600135C63 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 7BCE96F01469751600135C63 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -90,6 +91,7 @@ 7BCE970B146975EA00135C63 /* ListViewController.h */, 7BCE970C146975EA00135C63 /* ListViewController.m */, 7BCE97001469751600135C63 /* MHTabBarController.h */, + 0B0F9FFB161DAF34000B7AD7 /* MHTabBarController-Protected.h */, 7BCE97011469751600135C63 /* MHTabBarController.m */, 7BCE96F51469751600135C63 /* Supporting Files */, ); diff --git a/Demo/MHTabBarController-Protected.h b/Demo/MHTabBarController-Protected.h new file mode 100644 index 0000000..01239b6 --- /dev/null +++ b/Demo/MHTabBarController-Protected.h @@ -0,0 +1,18 @@ +// +// MHTabBarController-Protected.h +// Pods +// +// Created by Angel Garcia on 10/4/12. +// +// + +#import "MHTabBarController.h" + +@interface MHTabBarController () + +@property(nonatomic, strong) IBOutlet UIView *tabButtonsContainerView; +@property(nonatomic, strong) IBOutlet UIView *contentContainerView; +@property(nonatomic, strong) IBOutlet UIImageView *indicatorImageView; + + +@end \ No newline at end of file diff --git a/Demo/MHTabBarController.m b/Demo/MHTabBarController.m index c8fa562..a6d2cc0 100644 --- a/Demo/MHTabBarController.m +++ b/Demo/MHTabBarController.m @@ -23,54 +23,29 @@ */ #import "MHTabBarController.h" +#import "MHTabBarController-Protected.h" static const float TAB_BAR_HEIGHT = 44.0f; static const NSInteger TAG_OFFSET = 1000; @implementation MHTabBarController -{ - UIView *tabButtonsContainerView; - UIView *contentContainerView; - UIImageView *indicatorImageView; -} -@synthesize viewControllers = _viewControllers; -@synthesize selectedIndex = _selectedIndex; -@synthesize delegate = _delegate; +@synthesize viewControllers; +@synthesize selectedIndex; +@synthesize delegate; +@synthesize tabButtonsContainerView; +@synthesize contentContainerView; +@synthesize indicatorImageView; - (void)centerIndicatorOnButton:(UIButton *)button { CGRect rect = indicatorImageView.frame; - rect.origin.x = button.center.x - floorf(indicatorImageView.frame.size.width/2.0f); - rect.origin.y = TAB_BAR_HEIGHT - indicatorImageView.frame.size.height; + CGPoint buttonCenter = [[indicatorImageView superview] convertPoint:button.center fromView:button.superview]; + rect.origin.x = buttonCenter.x - floorf(indicatorImageView.frame.size.width/2.0f); indicatorImageView.frame = rect; indicatorImageView.hidden = NO; } -- (void)selectTabButton:(UIButton *)button -{ - [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; - - UIImage *image = [[UIImage imageNamed:@"MHTabBarActiveTab"] stretchableImageWithLeftCapWidth:0 topCapHeight:0]; - [button setBackgroundImage:image forState:UIControlStateNormal]; - [button setBackgroundImage:image forState:UIControlStateHighlighted]; - - [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; - [button setTitleShadowColor:[UIColor colorWithWhite:0.0f alpha:0.5f] forState:UIControlStateNormal]; -} - -- (void)deselectTabButton:(UIButton *)button -{ - [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; - - UIImage *image = [[UIImage imageNamed:@"MHTabBarInactiveTab"] stretchableImageWithLeftCapWidth:1 topCapHeight:0]; - [button setBackgroundImage:image forState:UIControlStateNormal]; - [button setBackgroundImage:image forState:UIControlStateHighlighted]; - - [button setTitleColor:[UIColor colorWithRed:175/255.0f green:85/255.0f blue:58/255.0f alpha:1.0f] forState:UIControlStateNormal]; - [button setTitleShadowColor:[UIColor whiteColor] forState:UIControlStateNormal]; -} - - (void)removeTabButtons { NSArray *buttons = [tabButtonsContainerView subviews]; @@ -86,10 +61,31 @@ - (void)addTabButtons UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.tag = TAG_OFFSET + index; [button setTitle:viewController.title forState:UIControlStateNormal]; - [button addTarget:self action:@selector(tabButtonPressed:) forControlEvents:UIControlEventTouchDown]; + [button addTarget:self action:@selector(tabButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; + button.titleLabel.font = [UIFont boldSystemFontOfSize:18]; button.titleLabel.shadowOffset = CGSizeMake(0, 1); - [self deselectTabButton:button]; + + //TODO: Make this customizable + UIImage *imageActive = [[UIImage imageNamed:@"MHTabBarActiveTab"] stretchableImageWithLeftCapWidth:0 topCapHeight:0]; + UIImage *imageInactive = [[UIImage imageNamed:@"MHTabBarInactiveTab"] stretchableImageWithLeftCapWidth:1 topCapHeight:0]; + + [button setBackgroundImage:imageInactive forState:UIControlStateNormal]; + [button setBackgroundImage:imageActive forState:UIControlStateHighlighted]; + [button setBackgroundImage:imageActive forState:UIControlStateSelected]; + [button setBackgroundImage:imageActive forState:UIControlStateHighlighted | UIControlStateSelected]; + + [button setTitleColor:[UIColor colorWithRed:175/255.0f green:85/255.0f blue:58/255.0f alpha:1.0f] forState:UIControlStateNormal]; + [button setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted]; + [button setTitleColor:[UIColor whiteColor] forState:UIControlStateSelected]; + [button setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted | UIControlStateSelected]; + + [button setTitleShadowColor:[UIColor whiteColor] forState:UIControlStateNormal]; + [button setTitleShadowColor:[UIColor colorWithWhite:0.0f alpha:0.5f] forState:UIControlStateHighlighted]; + [button setTitleShadowColor:[UIColor colorWithWhite:0.0f alpha:0.5f] forState:UIControlStateSelected]; + [button setTitleShadowColor:[UIColor colorWithWhite:0.0f alpha:0.5f] forState:UIControlStateHighlighted | UIControlStateSelected]; + + [button setSelected:NO]; [tabButtonsContainerView addSubview:button]; ++index; @@ -102,8 +98,8 @@ - (void)reloadTabButtons [self addTabButtons]; // Force redraw of the previously active tab. - NSUInteger lastIndex = _selectedIndex; - _selectedIndex = NSNotFound; + NSUInteger lastIndex = selectedIndex; + selectedIndex = NSNotFound; self.selectedIndex = lastIndex; } @@ -112,7 +108,7 @@ - (void)layoutTabButtons NSUInteger index = 0; NSUInteger count = [self.viewControllers count]; - CGRect rect = CGRectMake(0, 0, floorf(self.view.bounds.size.width / count), TAB_BAR_HEIGHT); + CGRect rect = CGRectMake(0, 0, floorf(tabButtonsContainerView.bounds.size.width / count), tabButtonsContainerView.bounds.size.height); indicatorImageView.hidden = YES; @@ -120,7 +116,7 @@ - (void)layoutTabButtons for (UIButton *button in buttons) { if (index == count - 1) - rect.size.width = self.view.bounds.size.width - rect.origin.x; + rect.size.width = tabButtonsContainerView.bounds.size.width - rect.origin.x; button.frame = rect; rect.origin.x += rect.size.width; @@ -137,20 +133,28 @@ - (void)viewDidLoad [super viewDidLoad]; self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - - CGRect rect = CGRectMake(0, 0, self.view.bounds.size.width, TAB_BAR_HEIGHT); - tabButtonsContainerView = [[UIView alloc] initWithFrame:rect]; - tabButtonsContainerView.autoresizingMask = UIViewAutoresizingFlexibleWidth; - [self.view addSubview:tabButtonsContainerView]; - - rect.origin.y = TAB_BAR_HEIGHT; - rect.size.height = self.view.bounds.size.height - TAB_BAR_HEIGHT; - contentContainerView = [[UIView alloc] initWithFrame:rect]; - contentContainerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - [self.view addSubview:contentContainerView]; - - indicatorImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"MHTabBarIndicator"]]; - [self.view addSubview:indicatorImageView]; + + if (tabButtonsContainerView == nil) { + CGRect rect = CGRectMake(0, 0, self.view.bounds.size.width, TAB_BAR_HEIGHT); + tabButtonsContainerView = [[UIView alloc] initWithFrame:rect]; + tabButtonsContainerView.autoresizingMask = UIViewAutoresizingFlexibleWidth; + [self.view addSubview:tabButtonsContainerView]; + } + + if (contentContainerView == nil) { + CGRect rect = CGRectMake(0, tabButtonsContainerView.frame.size.height, self.view.bounds.size.width, self.view.bounds.size.height - tabButtonsContainerView.frame.size.height); + contentContainerView = [[UIView alloc] initWithFrame:rect]; + contentContainerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + [self.view addSubview:contentContainerView]; + } + + if (indicatorImageView == nil) { + indicatorImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"MHTabBarIndicator"]]; + CGRect rect = indicatorImageView.frame; + rect.origin.y = CGRectGetMaxY(tabButtonsContainerView.frame) - rect.size.height; + indicatorImageView.frame = rect; + [self.view addSubview:indicatorImageView]; + } [self reloadTabButtons]; } @@ -187,26 +191,26 @@ - (void)setViewControllers:(NSArray *)newViewControllers UIViewController *oldSelectedViewController = self.selectedViewController; // Remove the old child view controllers. - for (UIViewController *viewController in _viewControllers) + for (UIViewController *viewController in viewControllers) { [viewController willMoveToParentViewController:nil]; [viewController removeFromParentViewController]; } - _viewControllers = [newViewControllers copy]; + viewControllers = [newViewControllers copy]; // This follows the same rules as UITabBarController for trying to // re-select the previously selected view controller. - NSUInteger newIndex = [_viewControllers indexOfObject:oldSelectedViewController]; + NSUInteger newIndex = [viewControllers indexOfObject:oldSelectedViewController]; if (newIndex != NSNotFound) - _selectedIndex = newIndex; - else if (newIndex < [_viewControllers count]) - _selectedIndex = newIndex; + selectedIndex = newIndex; + else if (newIndex < [viewControllers count]) + selectedIndex = newIndex; else - _selectedIndex = 0; + selectedIndex = 0; // Add the new child view controllers. - for (UIViewController *viewController in _viewControllers) + for (UIViewController *viewController in viewControllers) { [self addChildViewController:viewController]; [viewController didMoveToParentViewController:self]; @@ -234,28 +238,28 @@ - (void)setSelectedIndex:(NSUInteger)newSelectedIndex animated:(BOOL)animated if (![self isViewLoaded]) { - _selectedIndex = newSelectedIndex; + selectedIndex = newSelectedIndex; } - else if (_selectedIndex != newSelectedIndex) + else if (selectedIndex != newSelectedIndex) { UIViewController *fromViewController; UIViewController *toViewController; - if (_selectedIndex != NSNotFound) + if (selectedIndex != NSNotFound) { - UIButton *fromButton = (UIButton *)[tabButtonsContainerView viewWithTag:TAG_OFFSET + _selectedIndex]; - [self deselectTabButton:fromButton]; + UIButton *fromButton = (UIButton *)[tabButtonsContainerView viewWithTag:TAG_OFFSET + selectedIndex]; + fromButton.selected = NO; fromViewController = self.selectedViewController; } - NSUInteger oldSelectedIndex = _selectedIndex; - _selectedIndex = newSelectedIndex; + NSUInteger oldSelectedIndex = selectedIndex; + selectedIndex = newSelectedIndex; UIButton *toButton; - if (_selectedIndex != NSNotFound) + if (selectedIndex != NSNotFound) { - toButton = (UIButton *)[tabButtonsContainerView viewWithTag:TAG_OFFSET + _selectedIndex]; - [self selectTabButton:toButton]; + toButton = (UIButton *)[tabButtonsContainerView viewWithTag:TAG_OFFSET + selectedIndex]; + toButton.selected = YES; toViewController = self.selectedViewController; } From d3ef7726127115b78a1855f1d6347aed2fcb245c Mon Sep 17 00:00:00 2001 From: Angel Garcia Date: Thu, 4 Oct 2012 15:06:02 +0200 Subject: [PATCH 2/4] Added customisation to tabs --- Demo/MHTabBarController-Protected.h | 14 ++++++ Demo/MHTabBarController.m | 75 +++++++++++++++++++++-------- 2 files changed, 69 insertions(+), 20 deletions(-) diff --git a/Demo/MHTabBarController-Protected.h b/Demo/MHTabBarController-Protected.h index 01239b6..a3e14ab 100644 --- a/Demo/MHTabBarController-Protected.h +++ b/Demo/MHTabBarController-Protected.h @@ -14,5 +14,19 @@ @property(nonatomic, strong) IBOutlet UIView *contentContainerView; @property(nonatomic, strong) IBOutlet UIImageView *indicatorImageView; +//Tab Customization +@property(nonatomic, strong) UIFont *tabTitleFont; + +@property(nonatomic, assign) CGSize tabShadowOffset; + +@property(nonatomic, strong) UIImage *tabInactiveBackgroundImage; +@property(nonatomic, strong) UIImage *tabActiveBackgroundImage; + +@property(nonatomic, strong) UIColor *tabInactiveTitleColor; +@property(nonatomic, strong) UIColor *tabActiveTitleColor; + +@property(nonatomic, strong) UIColor *tabInactiveShadowColor; +@property(nonatomic, strong) UIColor *tabActiveShadowColor; + @end \ No newline at end of file diff --git a/Demo/MHTabBarController.m b/Demo/MHTabBarController.m index a6d2cc0..2488077 100644 --- a/Demo/MHTabBarController.m +++ b/Demo/MHTabBarController.m @@ -37,6 +37,23 @@ @implementation MHTabBarController @synthesize contentContainerView; @synthesize indicatorImageView; +@synthesize tabTitleFont; +@synthesize tabShadowOffset; +@synthesize tabInactiveBackgroundImage; +@synthesize tabActiveBackgroundImage; +@synthesize tabInactiveTitleColor; +@synthesize tabActiveTitleColor; +@synthesize tabInactiveShadowColor; +@synthesize tabActiveShadowColor; + +- (id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + tabShadowOffset = CGSizeMake(0, 1); + } + return self; +} + - (void)centerIndicatorOnButton:(UIButton *)button { CGRect rect = indicatorImageView.frame; @@ -63,27 +80,23 @@ - (void)addTabButtons [button setTitle:viewController.title forState:UIControlStateNormal]; [button addTarget:self action:@selector(tabButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; - button.titleLabel.font = [UIFont boldSystemFontOfSize:18]; - button.titleLabel.shadowOffset = CGSizeMake(0, 1); - - //TODO: Make this customizable - UIImage *imageActive = [[UIImage imageNamed:@"MHTabBarActiveTab"] stretchableImageWithLeftCapWidth:0 topCapHeight:0]; - UIImage *imageInactive = [[UIImage imageNamed:@"MHTabBarInactiveTab"] stretchableImageWithLeftCapWidth:1 topCapHeight:0]; + button.titleLabel.font = tabTitleFont; + button.titleLabel.shadowOffset = tabShadowOffset; + + [button setBackgroundImage:tabInactiveBackgroundImage forState:UIControlStateNormal]; + [button setBackgroundImage:tabActiveBackgroundImage forState:UIControlStateHighlighted]; + [button setBackgroundImage:tabActiveBackgroundImage forState:UIControlStateSelected]; + [button setBackgroundImage:tabActiveBackgroundImage forState:UIControlStateHighlighted | UIControlStateSelected]; - [button setBackgroundImage:imageInactive forState:UIControlStateNormal]; - [button setBackgroundImage:imageActive forState:UIControlStateHighlighted]; - [button setBackgroundImage:imageActive forState:UIControlStateSelected]; - [button setBackgroundImage:imageActive forState:UIControlStateHighlighted | UIControlStateSelected]; + [button setTitleColor:tabInactiveTitleColor forState:UIControlStateNormal]; + [button setTitleColor:tabActiveTitleColor forState:UIControlStateHighlighted]; + [button setTitleColor:tabActiveTitleColor forState:UIControlStateSelected]; + [button setTitleColor:tabActiveTitleColor forState:UIControlStateHighlighted | UIControlStateSelected]; - [button setTitleColor:[UIColor colorWithRed:175/255.0f green:85/255.0f blue:58/255.0f alpha:1.0f] forState:UIControlStateNormal]; - [button setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted]; - [button setTitleColor:[UIColor whiteColor] forState:UIControlStateSelected]; - [button setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted | UIControlStateSelected]; - - [button setTitleShadowColor:[UIColor whiteColor] forState:UIControlStateNormal]; - [button setTitleShadowColor:[UIColor colorWithWhite:0.0f alpha:0.5f] forState:UIControlStateHighlighted]; - [button setTitleShadowColor:[UIColor colorWithWhite:0.0f alpha:0.5f] forState:UIControlStateSelected]; - [button setTitleShadowColor:[UIColor colorWithWhite:0.0f alpha:0.5f] forState:UIControlStateHighlighted | UIControlStateSelected]; + [button setTitleShadowColor:tabInactiveShadowColor forState:UIControlStateNormal]; + [button setTitleShadowColor:tabActiveShadowColor forState:UIControlStateHighlighted]; + [button setTitleShadowColor:tabActiveShadowColor forState:UIControlStateSelected]; + [button setTitleShadowColor:tabActiveShadowColor forState:UIControlStateHighlighted | UIControlStateSelected]; [button setSelected:NO]; [tabButtonsContainerView addSubview:button]; @@ -155,7 +168,29 @@ - (void)viewDidLoad indicatorImageView.frame = rect; [self.view addSubview:indicatorImageView]; } - + + if (tabTitleFont == nil) { + tabTitleFont = [UIFont boldSystemFontOfSize:18]; + } + if (tabActiveBackgroundImage == nil) { + tabActiveBackgroundImage = [[UIImage imageNamed:@"MHTabBarActiveTab"] stretchableImageWithLeftCapWidth:0 topCapHeight:0]; + } + if (tabInactiveBackgroundImage == nil) { + tabInactiveBackgroundImage = [[UIImage imageNamed:@"MHTabBarInactiveTab"] stretchableImageWithLeftCapWidth:1 topCapHeight:0]; + } + if (tabInactiveTitleColor == nil) { + tabInactiveTitleColor = [UIColor colorWithRed:175/255.0f green:85/255.0f blue:58/255.0f alpha:1.0f]; + } + if (tabActiveTitleColor == nil) { + tabActiveTitleColor = [UIColor whiteColor]; + } + if (tabInactiveShadowColor == nil) { + tabInactiveShadowColor = [UIColor whiteColor]; + } + if (tabActiveShadowColor == nil) { + tabActiveShadowColor = [UIColor colorWithWhite:0.0f alpha:0.5f]; + } + [self reloadTabButtons]; } From d57643e25c27ed8597706fb192159706a5e51002 Mon Sep 17 00:00:00 2001 From: "Angel G. Olloqui" Date: Thu, 4 Oct 2012 16:19:53 +0300 Subject: [PATCH 3/4] Update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 48fe6cb..a886bba 100755 --- a/README.md +++ b/README.md @@ -4,6 +4,10 @@ This is a custom container view controller for iOS 5 that works just like a regu ![Screenshot](https://github.com/hollance/MHTabBarController/raw/master/Screenshot.png) -To customize the tab bar's appearance you currently have to mess around in the code a bit. +You can customize the tab bar's appearance by setting the view positions with Interface Builder or setting the properties declared in the `MHTabBarController-Protected.h` file. The MHTabBarController source code is copyright 2011 Matthijs Hollemans and is licensed under the terms of the MIT license. + +Collaborators: + +[@angelolloqui](http://twitter.com/angelolloqui) [angelolloqui.com](http://angelolloqui.com) From 07b1e7f3e594ab33bbfcedfc2fce5f5500458bd6 Mon Sep 17 00:00:00 2001 From: "Angel G. Olloqui" Date: Thu, 4 Oct 2012 16:21:06 +0300 Subject: [PATCH 4/4] Updated header of MHTabBarController-Protected.h --- Demo/MHTabBarController-Protected.h | 31 +++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/Demo/MHTabBarController-Protected.h b/Demo/MHTabBarController-Protected.h index a3e14ab..634ebd3 100644 --- a/Demo/MHTabBarController-Protected.h +++ b/Demo/MHTabBarController-Protected.h @@ -1,11 +1,26 @@ -// -// MHTabBarController-Protected.h -// Pods -// -// Created by Angel Garcia on 10/4/12. -// -// - +/*! + * \file MHTabBarController-Protected.h + * + * Copyright (c) 2011 Matthijs Hollemans + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ #import "MHTabBarController.h" @interface MHTabBarController ()