前言:转眼间将近两个月没有更新了,今天来给大家讲解一个封装的简单容器控制器RHNavController,在APP中应用的还是很多的。废话不多说,大家先来看图:
原理:标题使用UIButton添加点击事件,下方页面使用UICollectionView实现滑动的控制器。点击上方标题,通过代理回调改变UICollectionView的contentOffset来实现页面的自动左右切换,手动滑动页面改变当前选中的标题实现页面也标题同步。
下面,按照图层从上到下来给大家详细讲解各个类的实现。
首先是标题按钮,定制一个继承与UIButton的子类,通过重写构造方法快速实现各个属性的设置,.m实现如下:
#import "RHNavItem.h"
@implementation RHNavItem
- (instancetype)initWithFrame:(CGRect)frame itemModel:(RHNavItemModel *)model {
self = [super initWithFrame:frame];
if (self) {
self.titleLabel.font = model.titleFont;
[self setTitle:model.title forState:UIControlStateNormal];
[self setTitleColor:model.normalColor forState:UIControlStateNormal];
[self setTitleColor:model.selectColor forState:UIControlStateSelected];
}
return self;
}
@end
在此使用了一个model来存储了各个属性,方便对应管理。model.h如下:
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface RHNavItemModel : NSObject
接下来是上方标题按钮所在view的实现,.h文件如下:
#import <UIKit/UIKit.h>
#import "RHNavItem.h"
#define kScreen_W [UIScreen mainScreen].bounds.size.width
#define kScreen_H [UIScreen mainScreen].bounds.size.height
@protocol RHNavViewDelegate;
@interface RHNavView : UIView
@property (nonatomic, weak) id<RHNavViewDelegate> delegate;
@property (nonatomic, strong) NSArray * itemModelArr;
@property (nonatomic, assign) NSInteger selectedIndex;
- (instancetype)initWithFrame:(CGRect)frame itemModels:(NSArray<RHNavItemModel *> *)models;
@end
@protocol RHNavViewDelegate <NSObject>
@optional
- (void)navView:(RHNavView *)navView didSelectedItemAtIndex:(NSInteger)index;
@end
在此定义了回调的代理及重写了构造方法以快速创建对象。下面是在.m文件中的实现:
#import "RHNavView.h"
#define BtnTag 2016
#define SVHeight 44
|