分享

轻松实现标签视图切换效果

 爽行天下丶 2015-06-26


一、先上效果图,看了自然就明白


二、设计思路

1、如何实现类似功能或效果呢,首先顶部标签切换效果在前面已有专门的贴子做了详细说明,参考http://bbs./thread-8961-1-1.html

2、下面视图切换的基本思路是根据上面标签的数目创建对应多个View,放到ScrollView上面,通过pageingEnable属性分屏切换

3、通过ScrollView的代理方法,监听当前ScrollView的滚动状态与上面标签栏联动

4、同样,上面标签栏点击事件动态改变ScrollView的contentOffset,使得下面视图与标签保持对应一致

三、使用说明

1、该控件包含三个类:SASwitchBar、SASwitchView、SASwitchCtrl,分别为标签栏、视图、控制器,前两个类为视图负责展示并监听事件,最后一个类负责事件处理与视图控制;

2、使用时只需要新建一个控制器并继承自SASwitchCtrl即可,然后设置SASwitchBar的items数组,再设置SASwitchView的视图数组,搞定!

3、示例:

    // 设置标签选项卡
    self.switchBar.items = @[@"蓝", @"橙", @"红"];
   
    // 创建三个切换演示视图
    UIView *blue = [[UIView alloc] init];
    blue.backgroundColor = [UIColor blueColor];
    UIView *orange = [[UIView alloc] init];
    orange.backgroundColor = [UIColor orangeColor];
    UIView *red = [[UIView alloc] init];
    red.backgroundColor = [UIColor redColor];

   
    // 添加演示视图
    self.switchView.views = @[blue, orange, red];


四、关键代码
1、SASwitchView.h
  1. #import <UIKit/UIKit.h>

  2. @interface SASwitchView : UIScrollView

  3. @property (nonatomic, strong)  NSArray  *views;

  4. @end
复制代码
2、SASwitchView.m
  1. #import "SASwitchView.h"

  2. @implementation SASwitchView

  3. - (void)setViews:(NSArray *)views
  4. {
  5.     _views = views;
  6.     CGFloat width = [[UIScreen mainScreen] bounds].size.width;
  7.     // 在视图数组赋值时,同时整理各视图的布局,主要是x/y坐标,此时还不能确定视图大小
  8.     for (int i = 0; i < self.views.count; i++){
  9.         UIView *view = self.views[i];
  10.         view.frame = (CGRect){width * i, 0, width, 0};
  11.         [self addSubview:view];
  12.     }
  13.     self.contentSize = (CGSize){width * views.count, 0};
  14. }

  15. - (void)setFrame:(CGRect)frame
  16. {
  17.     [super setFrame:frame];
  18.     // 外部给视图设置大小时,同时调整内部子视图,保持子视图与父控制大小一致
  19.     for (UIView *view in self.subviews) {
  20.         CGRect rect = view.frame;
  21.         rect.size.height = frame.size.height;
  22.         view.frame = rect;
  23.     }
  24. }

  25. @end
复制代码
3、SASwitchCtrl.h
  1. #import <UIKit/UIKit.h>
  2. #import "SASwitchBar.h"
  3. #import "SASwitchView.h"

  4. @interface SASwitchCtrl : UIViewController

  5. @property (strong, nonatomic)  SASwitchBar *switchBar;

  6. @property (strong, nonatomic)  SASwitchView *switchView;

  7. @end
复制代码
4、SASwitchCtrl.m
  1. #define kSASwitchBarH 44
  2. #import "SASwitchCtrl.h"

  3. @interface SASwitchCtrl () <SASwitchBarDelegate, UIScrollViewDelegate>

  4. @end

  5. @implementation SASwitchCtrl

  6. #pragma mark - 初始化方法
  7. - (instancetype)init
  8. {
  9.     if (self = [super init]) {
  10.         self.switchBar = [[SASwitchBar alloc] init];
  11.         self.switchView = [[SASwitchView alloc] init];
  12.         self.switchView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin;
  13.         [self.view addSubview:self.switchBar];
  14.         [self.view addSubview:self.switchView];
  15.     }
  16.     return self;
  17. }

  18. - (void)viewDidLoad
  19. {
  20.     [super viewDidLoad];
  21.     self.edgesForExtendedLayout = UIRectEdgeNone;
  22.     self.switchView.showsHorizontalScrollIndicator = NO;
  23.     self.switchView.pagingEnabled = YES;
  24.     self.switchBar.delegate = self;
  25.     self.switchView.delegate = self;
  26. }

  27. - (void)viewWillAppear:(BOOL)animated
  28. {
  29.     [super viewWillAppear:animated];
  30.     {
  31.         CGFloat w = self.view.frame.size.width;
  32.         CGFloat h = self.view.frame.size.height - kSASwitchBarH;
  33.         self.switchBar.frame = (CGRect){0, 0, w, kSASwitchBarH};
  34.         self.switchView.frame = (CGRect){0, kSASwitchBarH, w, h};
  35.     }
  36. }

  37. #pragma mark - 代理方法
  38. // 上部标签栏事件处理
  39. - (void)switchBar:(SASwitchBar *)switchBar seletedIndex:(NSInteger)index
  40. {
  41.     // 标签点击第几个,scrollView的offset即跳转到第几屏,并以动画形式转场
  42.     CGPoint offset = (CGPoint){self.view.frame.size.width * index, 0};
  43.     [UIView animateWithDuration:0.3 animations:^{
  44.         self.switchView.contentOffset = offset;
  45.     }];
  46. }
  47. // scrollView代理方法
  48. - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
  49. {
  50.     int page = scrollView.contentOffset.x / self.view.frame.size.width;
  51.     self.switchBar.selectedIndex = page;
  52. }
  53. @end
复制代码

五、Demo下载:
游客,如果您要查看本帖隐藏内容请回复

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多