iOS开发-iPad侧边栏Tab选项卡切换(转)

Android中习惯了叫侧边栏,iOS中如果不习惯侧边栏称呼的话可以叫dock,侧边栏的切换,类似于Android中的底部导航栏的切换,iPad尺寸大了一些,导航的栏目放在侧边会显示的更好耐看一些。选项卡是用按钮实现的,通过按钮的状态控制按钮的背景图片,最后通过按钮的Tag属性进行相对应的操作,iPad需要考虑一个横竖屏的问题,不过现在有些项目为了效果也好,为了开发效率也罢,可能只是选中了横屏效果。

基本布局

布局之前先来看一下最终需要实现的效果:

image

需要最四个图片进行相应的操作,通过图片控制最后的切换效果,黑色的属于侧边栏的区域,四个图片是按钮的背景图片,不过由于需要经常操作区域的宽度和按钮的宽度,需要预定义一下,新建一个Common.h文件,如果你不习惯,你也可以定义为Config.h,能看懂即可:

|

1

2

3

|

//侧边栏条目的尺寸

#define GPDockItemWidth 100

#define GPDockItemHeight 80

|

在之前的xCode中是默认的有pch文件的,xCode6.1中没有,需要新建一个pch文件:

image

新建之后并不能保证你运行成功,还需要去编译中设置一下Prefix Header($(SRCROOT)/PrefixHeader.pch),清理下项目,导入Common.h文件即可成功;

image

Demo实战

①首先需要新建一个

GPMainController控制器,控制页面页面逻辑:

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

|

//

// GPMainController.h

// GrouponProject

//http://www.cnblogs.com/xiaofeixiang

// Created by keso on 15/3/9.

// Copyright (c) 2015年 keso. All rights reserved.

//

#import <UIKit/UIKit.h>

#import "GPDock.h"

@interface

GPMainController : UIViewController <GPDockItemDelegate>

@end

|

需要在ViewDidLoad加载侧边栏区域:

|

1

2

3

4

5

6

7

8

9

10

11

|

- (``void``)viewDidLoad {

[``super

viewDidLoad];

// Do any additional setup after loading the view.

self``.view.backgroundColor=[UIColor greenColor];

//加入侧边栏Dock

GPDock *dock=[[GPDock alloc]initWithFrame:CGRectMake(0, 0,GPDockItemWidth, self``.view.frame.size.height)];

dock.dockDelegate=``self``;

[``self``.view addSubview:dock];

}

|

响应侧边栏的点击事件,需要用到委托,如果委托不是很熟悉,可以参考本人之前的博客:

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

|

-(``void``)switchMainByTabItem:(GPDock *)gpdock originalTab:(``int``)start destinationTab:(``int``)end{

switch

(end) {

case

0:

self``.view.backgroundColor=[UIColor blackColor];

break``;

case

1:

self``.view.backgroundColor=[UIColor blueColor];

break``;

case

2:

self``.view.backgroundColor=[UIColor redColor];

break``;

case

3:

self``.view.backgroundColor=[UIColor purpleColor];

break``;

default``:

break``;

}

}

|

GPMainContrller主要用于处理页面的逻辑,同时需要在AppDelegate中设置一下根控制器:

|

1

2

3

4

5

6

|

- (``BOOL``)application:(UIApplication *)application didFinishLaunchingWithOptions:(``NSDictionary

*)launchOptions {

// Override point for customization after application launch.

[UIView setAnimationDuration:2.0];

self``.window.rootViewController=[[GPMainController alloc]init];

return

YES``;

}

|

②设置侧边栏区域,继承自UIView:

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

|

//

// GPDock.h

// GrouponProject

//http://www.cnblogs.com/xiaofeixiang

// Created by keso on 15/3/10.

// Copyright (c) 2015年 keso. All rights reserved.

//

#import <UIKit/UIKit.h>

#import "GPTabItem.h"

@class

GPDock;

@protocol

GPDockItemDelegate <``NSObject``>

-(``void``)switchMainByTabItem:(GPDock*)gpdock originalTab:(``int``)start destinationTab:(``int``)end;

@end

@interface

GPDock : UIView

{

GPTabItem *selectedTabItem;

}

@property

(``nonatomic``,weak) id``<GPDockItemDelegate> dockDelegate;

@end

|

初始化侧边栏:

|

1

2

3

4

5

6

7

8

9

10

11

|

-(instancetype)initWithFrame:(CGRect)frame{

self``=[``super

initWithFrame:frame];

if

(``self``) {

//自动伸缩高度可伸缩,右边距可以伸缩

self``.autoresizingMask=UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleRightMargin;

//设置背景图片

self``.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@``"Toolbar_bg_tabbar.png"``]];

[``self

addTabItems];

}

return

self``;

}

|

添加Tab选项卡:

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

|

//添加Tab选项卡

- (``void``)addTabItems

{

//首页

[``self

addSingleTab:@``"Toolbar_searchshop.png"

selectedImage:@``"Toolbar_searchshop_selected.png"

weight:1];

//团购

[``self

addSingleTab:@``"Toolbar_groupon.png"

selectedImage:@``"Toolbar_groupon_selected.png"

weight:2];

//排行榜

[``self

addSingleTab:@``"Toolbar_ranklist.png"

selectedImage:@``"Toolbar_ranklist_selected.png"

weight:3];

// 个人中心

[``self

addSingleTab:@``"Toolbar_usercenter.png"

selectedImage:@``"Toolbar_usercenter_selected.png"

weight:4];

}

|

因为代码类似,所以封装到一个方法里面:

|

1

2

3

4

5

6

7

8

9

10

11

12

13

|

- (``void``)addSingleTab:(``NSString

*)backgroundImage selectedImage:(``NSString

*)selectedImage weight:(``int``)weight

{

GPTabItem *tabItem=[[GPTabItem alloc]init];

[tabItem setBackgroundImage:backgroundImage];

[tabItem setSelectedImage:selectedImage];

//设置位置

tabItem.frame = CGRectMake(0, GPDockItemHeight * (weight+1), 0, 0);

//设置选中触摸选中事件

[tabItem addTarget:``self

action:``@selector``(tabItemTouchEvent:) forControlEvents:UIControlEventTouchDown];

tabItem.tag = weight - 1;

[``self

addSubview:tabItem];

}

|

设置触摸事件:

|

1

2

3

4

5

6

7

8

9

10

11

12

|

//设置触摸事件

- (``void``)tabItemTouchEvent:(GPTabItem *)tabItem

{

if

([``self``.dockDelegate respondsToSelector:``@selector``(switchMainByTabItem:originalTab:destinationTab:)]) {

[``self``.dockDelegate switchMainByTabItem:``self

originalTab:selectedTabItem.tag destinationTab:tabItem.tag];

}

selectedTabItem.enabled=``YES``;

tabItem.enabled = NO``;

//将当前选中的赋值

selectedTabItem =tabItem;

}

|

③封装侧边栏的GPDockItem,然后选项卡上的可以继承:

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

|

//

// GPDockItem.h

// GrouponProject

//博客园FlyElephant:http://www.cnblogs.com/xiaofeixiang

// Created by keso on 15/3/11.

// Copyright (c) 2015年 keso. All rights reserved.

//

#import <UIKit/UIKit.h>

@interface

GPDockItem : UIButton

//背景图片

@property

(``nonatomic``,strong) NSString

*backgroundImage;

//选中图片

@property

(``nonatomic``,strong) NSString

*selectedImage;

@end

|

设置背景图片和选中图片:

|

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

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

|

//

// GPDockItem.m

// GrouponProject

//博客园FlyElephant:http://www.cnblogs.com/xiaofeixiang

// Created by keso on 15/3/11.

// Copyright (c) 2015年 keso. All rights reserved.

//

#import "GPDockItem.h"

@implementation

GPDockItem

/*

// Only override drawRect: if you perform custom drawing.

// An empty implementation adversely affects performance during animation.

- (void)drawRect:(CGRect)rect {

// Drawing code

}

*/

-(instancetype)initWithFrame:(CGRect)frame{

self``=[``super

initWithFrame:frame];

if

(``self``) {

// Item分割线

UIImageView *splitLine = [[UIImageView alloc] init];

splitLine.frame = CGRectMake(0, 0, GPDockItemWidth, 2);

splitLine.image = [UIImage imageNamed:@``"separator_tabbar_item.png"``];

[``self

addSubview:splitLine];

}

return

self``;

}

//设置背景图片

-(``void``)setBackgroundImage:(``NSString

*)backgroundImage{

_backgroundImage=backgroundImage;

[``self

setImage:[UIImage imageNamed:backgroundImage] forState:UIControlStateNormal];

}

//设置选中图片

-(``void``)setSelectedImage:(``NSString

*)selectedImage{

_selectedImage=selectedImage;

[``self

setImage:[UIImage imageNamed:selectedImage] forState:UIControlStateDisabled];

}

-(``void``)setFrame:(CGRect)frame{

//固定Item宽高

frame.size=CGSizeMake(GPDockItemWidth, GPDockItemHeight);

[``super

setFrame:frame];

}

@end

|

GPTabItem代码:

|

1

2

3

4

5

|

#import "GPDockItem.h"

@interface

GPTabItem : GPDockItem

@end

|

设置选中时的背景图片:

|

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

29

30

|

//

// GPTabItem.m

// GrouponProject

//博客园FlyElephant:http://www.cnblogs.com/xiaofeixiang

// Created by keso on 15/3/11.

// Copyright (c) 2015年 keso. All rights reserved.

//

#import "GPTabItem.h"

@implementation

GPTabItem

/*

// Only override drawRect: if you perform custom drawing.

// An empty implementation adversely affects performance during animation.

- (void)drawRect:(CGRect)rect {

// Drawing code

}

*/

-(instancetype)initWithFrame:(CGRect)frame{

self``=[``super

initWithFrame:frame];

if

(``self``) {

// 设置选中时背景图片

[``self

setBackgroundImage:[UIImage imageNamed:@``"bg_tabbar_item.png"``] forState:UIControlStateDisabled];

}

return

self``;

}

@end

|

最终效果如下:

image

代码相对以往较多,如有遗漏,请随时与我联系,如有好感,推荐或关注均可~

作者:FlyElephant
出处:http://www.cnblogs.com/xiaofeixiang
说明:博客经个人辛苦努力所得,如有转载会特别申明,博客不求技惊四座,但求与有缘人分享个人学习知识,生活学习提高之用,博客所有权归本人和博客园所有,如有转载请在显著位置给出博文链接和作者姓名,否则本人将付诸法律。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,406评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,976评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,302评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,366评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,372评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,457评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,872评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,521评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,717评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,523评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,590评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,299评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,859评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,883评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,127评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,760评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,290评论 2 342

推荐阅读更多精彩内容