DLTabedSlideView.m 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. //
  2. // DLTabedSlideView.m
  3. // DLSlideController
  4. //
  5. // Created by Dongle Su on 14-12-8.
  6. // Copyright (c) 2014年 dongle. All rights reserved.
  7. //
  8. #import "DLTabedSlideView.h"
  9. #import "DLFixedTabbarView.h"
  10. #import "DLSlideView.h"
  11. #import "DLLRUCache.h"
  12. #define kDefaultTabbarHeight 39
  13. #define kDefaultTabbarBottomSpacing 0
  14. #define kDefaultCacheCount 4
  15. @implementation DLTabedbarItem
  16. + (DLTabedbarItem *)itemWithTitle:(NSString *)title image:(UIImage *)image selectedImage:(UIImage *)selectedImage{
  17. DLTabedbarItem *item = [[DLTabedbarItem alloc] init];
  18. item.title = title;
  19. item.image = image;
  20. item.selectedImage = selectedImage;
  21. return item;
  22. }
  23. @end
  24. @interface DLTabedSlideView()<DLSlideViewDelegate, DLSlideViewDataSource>
  25. @end
  26. @implementation DLTabedSlideView{
  27. DLSlideView *slideView_;
  28. DLFixedTabbarView *tabbar_;
  29. DLLRUCache *ctrlCache_;
  30. }
  31. - (void)commonInit{
  32. self.tabbarHeight = kDefaultTabbarHeight;
  33. self.tabbarBottomSpacing = kDefaultTabbarBottomSpacing;
  34. tabbar_ = [[DLFixedTabbarView alloc] initWithFrame:CGRectMake(0, 0, self.bounds.size.width, self.tabbarHeight)];
  35. tabbar_.delegate = self;
  36. [self addSubview:tabbar_];
  37. slideView_ = [[DLSlideView alloc] initWithFrame:CGRectMake(0, self.tabbarHeight+self.tabbarBottomSpacing, self.bounds.size.width, self.bounds.size.height-self.tabbarHeight-self.tabbarBottomSpacing)];
  38. slideView_.delegate = self;
  39. slideView_.dataSource = self;
  40. [self addSubview:slideView_];
  41. ctrlCache_ = [[DLLRUCache alloc] initWithCount:4];
  42. }
  43. - (id)initWithCoder:(NSCoder *)aDecoder{
  44. if (self = [super initWithCoder:aDecoder]) {
  45. [self commonInit];
  46. }
  47. return self;
  48. }
  49. - (id)initWithFrame:(CGRect)frame{
  50. if (self = [super initWithFrame:frame]) {
  51. [self commonInit];
  52. }
  53. return self;
  54. }
  55. - (void)layoutSubviews{
  56. [super layoutSubviews];
  57. [self layoutBarAndSlide];
  58. }
  59. - (void)layoutBarAndSlide{
  60. UIView *barView = (UIView *)tabbar_;
  61. barView.frame = CGRectMake(0, 0, CGRectGetWidth(self.bounds), self.tabbarHeight);
  62. slideView_.frame = CGRectMake(0, self.tabbarHeight+self.tabbarBottomSpacing, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds)-self.tabbarHeight-self.tabbarBottomSpacing);
  63. }
  64. //- (void)setViewControllers:(NSArray *)viewControllers{
  65. // //assert(self.tabarView == nil || viewControllers.count == [self.tabarView tabbarCount]);
  66. //
  67. // slideView_.viewControllers = viewControllers;
  68. //}
  69. - (void)setBaseViewController:(UIViewController *)baseViewController{
  70. slideView_.baseViewController = baseViewController;
  71. }
  72. - (void)buildTabbar{
  73. NSMutableArray *tabbarItems = [NSMutableArray array];
  74. for (DLTabedbarItem *item in self.tabbarItems) {
  75. DLFixedTabbarViewTabItem *barItem = [[DLFixedTabbarViewTabItem alloc] init];
  76. barItem.title = item.title;
  77. barItem.titleColor = self.tabItemNormalColor;
  78. barItem.selectedTitleColor = self.tabItemSelectedColor;
  79. barItem.image = item.image;
  80. barItem.selectedImage = item.selectedImage;
  81. [tabbarItems addObject:barItem];
  82. }
  83. tabbar_.tabbarItems = tabbarItems;
  84. tabbar_.trackColor = self.tabbarTrackColor;
  85. tabbar_.backgroundImage = self.tabbarBackgroundImage;
  86. }
  87. //- (void)setTabarView:(id<DLSlideTabbarProtocol>)tabarView{
  88. // assert([tabarView isKindOfClass:[UIView class]]);
  89. // assert(slideView_.viewControllers == nil || slideView_.viewControllers.count == [tabarView tabbarCount]);
  90. //
  91. // if (_tabarView != tabarView) {
  92. // _tabarView.delegate = nil;
  93. // _tabarView = tabarView;
  94. //
  95. // tabarView.delegate = self;
  96. // [self layoutBarAndSlide];
  97. //
  98. // }
  99. //}
  100. - (void)setSelectedIndex:(NSInteger)selectedIndex{
  101. _selectedIndex = selectedIndex;
  102. [slideView_ setSelectedIndex:selectedIndex];
  103. [tabbar_ setSelectedIndex:selectedIndex];
  104. }
  105. - (void)DLSlideTabbar:(id)sender selectAt:(NSInteger)index{
  106. [slideView_ setSelectedIndex:index];
  107. }
  108. - (NSInteger)numberOfControllersInDLSlideView:(DLSlideView *)sender{
  109. return [self.delegate numberOfTabsInDLTabedSlideView:self];
  110. }
  111. - (UIViewController *)DLSlideView:(DLSlideView *)sender controllerAt:(NSInteger)index{
  112. NSString *key = [NSString stringWithFormat:@"%ld", (long)index];
  113. if ([ctrlCache_ objectForKey:key]) {
  114. return [ctrlCache_ objectForKey:key];
  115. }
  116. else{
  117. UIViewController *ctrl = [self.delegate DLTabedSlideView:self controllerAt:index];
  118. [ctrlCache_ setObject:ctrl forKey:key];
  119. return ctrl;
  120. }
  121. }
  122. - (void)DLSlideView:(DLSlideView *)slide switchingFrom:(NSInteger)oldIndex to:(NSInteger)toIndex percent:(float)percent{
  123. [tabbar_ switchingFrom:oldIndex to:toIndex percent:percent];
  124. }
  125. - (void)DLSlideView:(DLSlideView *)slide didSwitchTo:(NSInteger)index{
  126. _selectedIndex = index;
  127. [tabbar_ setSelectedIndex:index];
  128. if (self.delegate && [self.delegate respondsToSelector:@selector(DLTabedSlideView:didSelectedAt:)]) {
  129. [self.delegate DLTabedSlideView:self didSelectedAt:index];
  130. }
  131. }
  132. - (void)DLSlideView:(DLSlideView *)slide switchCanceled:(NSInteger)oldIndex{
  133. [tabbar_ setSelectedIndex:oldIndex];
  134. }
  135. @end