- 一个控制器中包含多个子控制器。
- 分析:可以利用父子关系,建立联系。一个控制器可以有一个父控制器,也可以有多个子控制器。就像导航控制器,tabbar是它的父控制器,它又可以添加多个子控制器。
- 逻辑分析:
-- 这里上面有5个按钮,点击每个按钮,出现不一样的画面。第一种是添加5个view,交给父控制器——也就是整个界面管理,但是一旦逻辑复杂,这个大的父控制器很有可能会累死!另外还有一种方法,每个按钮点击,就创建一个新的控制器,也就是说添加5个控制器,而最大的父控制器只需要管理上面的这个bar。那总共就需要创建6个控制器。就能完美的解决这个问题了。
- 界面分析:
-- 01.添加scrollView:滑动屏幕和点击按钮都可以进入与之对应的控制器,说明最大的这个控制器需要添加一个scrollView,并且能够分页。
-- 02.细节处理:在iOS7之后,添加到导航栏的控制器或者View都会产生一个自动布局滚动边距,添加一个控制器或者view进去,它的y值会加上一个64,但是又只会影响一个控制器或者view,所以这个属性有时挺碍事的,在这里我们需要把这个属性去掉。并且也要把它的水平滚动条和垂直滚动条去掉。
-- 03.添加5个按钮。这5个按钮表面上看只需要添加5个词语,一个红色的view就可以了。观察可以看到5个按钮的背景颜色是一样的,高亮状态是一样的。所以可以添加一个viewBar,在这个bar中利用循环添加5个按钮。
-- 04.按钮细节处理。在这里按钮的文字恰巧都是两个字,所以按钮的宽度非常好设定,但是如果文字的字数是不一样的,那么宽度就需要根据文字进行计算了。
// 添加标签bar
NSArray*titleArray = @[@"全部",@"视频",@"声音",@"图片",@"段子"];
UIView*titleView = [[UIView alloc] init];
[titleView setBackgroundColor:[UIColor colorWithWhite:1 alpha:0.7]];
titleView.width=CXLScreenW;
titleView.height=CXLTitleViewHeight;
titleView.x= 0;
titleView.y=CXLNavigationBarMaxY;
[self.viewaddSubview:titleView];
// 添加底部红色条
UIView *bottomView = [[UIView alloc] init];
bottomView.height= 2;
bottomView.y= titleView.height- bottomView.height;
[bottomView setBackgroundColor:[UIColor redColor]];
[titleView addSubview:bottomView];
self.bottomView= bottomView;
// 添加按钮
CGFloatbtnW = titleView.width/ titleArray.count;
CGFloatbtnH = titleView.height;
for(int i = 0; i<titleArray.count;i++){
// 按钮创建
CXLTitleButton*button = [CXLTitleButton buttonWithType:UIButtonTypeCustom];
button.frame=CGRectMake(i*btnW, 0, btnW, btnH);
[button addTarget:selfaction:@selector(didTitleButton:) forControlEvents:UIControlEventTouchUpInside];
[titleView addSubview:button];
button.tag= i;
[self.buttonArray addObject:button];
[button setTitle:titleArray[i] forState:UIControlStateNormal];
if(i==0) {
// 默认被选中
button.selected=YES;
self.clickedButton= button;
[button.titleLabel sizeToFit];
self.bottomView.width= button.titleLabel.width;
self.bottomView.centerX= button.centerX;
}
}
-- 05.添加5个子控制器,添加完成就可以设置scrollView的滚动范围了。
-- 06. 监听按钮的点击,设置选中状态三部曲。利用动画设置滚动效果
-- 07.点击按钮后,控制器需要滚动。这里需要使用到scrollView的代理方法。点击按钮时停止滚动,与拖动停止滚动都要实现代理方法。
- 控制器内部的实现,涉及到数据问题,另外讲述。这里主要意识到的就是子控制器与父控制器的问题。可以通过父子控制器这条线,拿到数据,或者做很多逻辑判断,非常方便。
网友评论