iOS开发-自定制滑动容器控制器RHNavController
<div><p>前言:转眼间将近两个月没有更新了,今天来给大家讲解一个封装的简单容器控制器RHNavController,在APP中应用的还是很多的。废话不多说,大家先来看图:</p>
<br>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="373" data-height="684"><img src="//upload-images.jianshu.io/upload_images/3015321-ae63366be1f372b3.gif?imageMogr2/auto-orient/strip|imageView2/2/w/373/format/webp"></div>
</div>
<div class="image-caption">RHNavController.gif</div>
</div>
<p>原理:标题使用<code>UIButton</code>添加点击事件,下方页面使用<code>UICollectionView</code>实现滑动的控制器。点击上方标题,通过代理回调改变<code>UICollectionView</code>的<code>contentOffset</code>来实现页面的自动左右切换,手动滑动页面改变当前选中的标题实现页面也标题同步。</p>
<p>下面,按照图层从上到下来给大家详细讲解各个类的实现。<br>
首先是标题按钮,定制一个继承与<code>UIButton</code>的子类,通过重写构造方法快速实现各个属性的设置,<code>.m</code>实现如下:</p>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-objectivec"><code class="language-objectivec"><span class="token macro property">#<span class="token directive keyword">import "RHNavItem.h"
<span class="token keyword">@implementation RHNavItem
<span class="token operator">- <span class="token punctuation">(instancetype<span class="token punctuation">)initWithFrame<span class="token punctuation">:<span class="token punctuation">(CGRect<span class="token punctuation">)frame itemModel<span class="token punctuation">:<span class="token punctuation">(RHNavItemModel <span class="token operator">*<span class="token punctuation">)model <span class="token punctuation">{
<span class="token keyword">self <span class="token operator">= <span class="token punctuation">[<span class="token keyword">super initWithFrame<span class="token punctuation">:frame<span class="token punctuation">]<span class="token punctuation">;
<span class="token keyword">if <span class="token punctuation">(<span class="token keyword">self<span class="token punctuation">) <span class="token punctuation">{
<span class="token keyword">self<span class="token punctuation">.titleLabel<span class="token punctuation">.font <span class="token operator">= model<span class="token punctuation">.titleFont<span class="token punctuation">;
<span class="token punctuation">[<span class="token keyword">self setTitle<span class="token punctuation">:model<span class="token punctuation">.title forState<span class="token punctuation">:UIControlStateNormal<span class="token punctuation">]<span class="token punctuation">;
<span class="token punctuation">[<span class="token keyword">self setTitleColor<span class="token punctuation">:model<span class="token punctuation">.normalColor forState<span class="token punctuation">:UIControlStateNormal<span class="token punctuation">]<span class="token punctuation">;
<span class="token punctuation">[<span class="token keyword">self setTitleColor<span class="token punctuation">:model<span class="token punctuation">.selectColor forState<span class="token punctuation">:UIControlStateSelected<span class="token punctuation">]<span class="token punctuation">;
<span class="token punctuation">}
<span class="token keyword">return <span class="token keyword">self<span class="token punctuation">;
<span class="token punctuation">}
<span class="token keyword">@end
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<p>在此使用了一个<code>model</code>来存储了各个属性,方便对应管理。<code>model.h</code>如下:</p>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-objectivec"><code class="language-objectivec"><span class="token macro property">#<span class="token directive keyword">import <Foundation/Foundation.h>
<span class="token macro property">#<span class="token directive keyword">import <UIKit/UIKit.h>
<span class="token keyword">@interface RHNavItemModel <span class="token punctuation">: NSObject
<span class="token comment">// 标题
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, copy<span class="token punctuation">) NSString <span class="token operator">* title<span class="token punctuation">;
<span class="token comment">// 标题文字宽度
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, assign<span class="token punctuation">) CGFloat titleWidth<span class="token punctuation">;
<span class="token comment">// 标题对应的按钮宽度
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, assign<span class="token punctuation">) CGFloat itemWidth<span class="token punctuation">;
<span class="token comment">// 标题下方线宽度
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, assign<span class="token punctuation">) CGFloat lineWidth<span class="token punctuation">;
<span class="token comment">// 标题字体大小
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, strong<span class="token punctuation">) UIFont <span class="token operator">* titleFont<span class="token punctuation">;
<span class="token comment">// 标题未选中颜色
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, strong<span class="token punctuation">) UIColor <span class="token operator">* normalColor<span class="token punctuation">;
<span class="token comment">// 标题选中颜色
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, strong<span class="token punctuation">) UIColor <span class="token operator">* selectColor<span class="token punctuation">;
<span class="token comment">// 构造方法快速创建model
<span class="token operator">- <span class="token punctuation">(instancetype<span class="token punctuation">)initWithTitle<span class="token punctuation">:<span class="token punctuation">(NSString <span class="token operator">*<span class="token punctuation">)title font<span class="token punctuation">:<span class="token punctuation">(UIFont <span class="token operator">*<span class="token punctuation">)font normalColor<span class="token punctuation">:<span class="token punctuation">(UIColor <span class="token operator">*<span class="token punctuation">)normalColor selectColor<span class="token punctuation">:<span class="token punctuation">(UIColor <span class="token operator">*<span class="token punctuation">)selectColor<span class="token punctuation">;
<span class="token keyword">@end
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<p>接下来是上方标题按钮所在<code>view</code>的实现,<code>.h</code>文件如下:</p>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-objectivec"><code class="language-objectivec"><span class="token macro property">#<span class="token directive keyword">import <UIKit/UIKit.h>
<span class="token macro property">#<span class="token directive keyword">import "RHNavItem.h"
<span class="token macro property">#<span class="token directive keyword">define kScreen_W .bounds.size.width
<span class="token macro property">#<span class="token directive keyword">define kScreen_H .bounds.size.height
<span class="token keyword">@protocol RHNavViewDelegate<span class="token punctuation">;
<span class="token keyword">@interface RHNavView <span class="token punctuation">: UIView
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, weak<span class="token punctuation">) id<span class="token operator"><RHNavViewDelegate<span class="token operator">> delegate<span class="token punctuation">;
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, strong<span class="token punctuation">) NSArray <span class="token operator">* itemModelArr<span class="token punctuation">;
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, assign<span class="token punctuation">) NSInteger selectedIndex<span class="token punctuation">;
<span class="token operator">- <span class="token punctuation">(instancetype<span class="token punctuation">)initWithFrame<span class="token punctuation">:<span class="token punctuation">(CGRect<span class="token punctuation">)frame itemModels<span class="token punctuation">:<span class="token punctuation">(NSArray<span class="token operator"><RHNavItemModel <span class="token operator">*<span class="token operator">> <span class="token operator">*<span class="token punctuation">)models<span class="token punctuation">;
<span class="token keyword">@end
<span class="token keyword">@protocol RHNavViewDelegate <span class="token operator"><NSObject<span class="token operator">>
<span class="token operator">@optional
<span class="token operator">- <span class="token punctuation">(<span class="token keyword">void<span class="token punctuation">)navView<span class="token punctuation">:<span class="token punctuation">(RHNavView <span class="token operator">*<span class="token punctuation">)navView didSelectedItemAtIndex<span class="token punctuation">:<span class="token punctuation">(NSInteger<span class="token punctuation">)index<span class="token punctuation">;
<span class="token keyword">@end
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<p>在此定义了回调的代理及重写了构造方法以快速创建对象。下面是在<code>.m</code>文件中的实现:</p>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-objectivec"><code class="language-objectivec"><span class="token macro property">#<span class="token directive keyword">import "RHNavView.h"
<span class="token macro property">#<span class="token directive keyword">define BtnTag 2016
<span class="token macro property">#<span class="token directive keyword">define SVHeight 44 <span class="token comment">// scrollview高度
<span class="token macro property">#<span class="token directive keyword">define LineHeight 2 <span class="token comment">// 移动线高度
<span class="token macro property">#<span class="token directive keyword">define ItemHeight 41 <span class="token comment">// 按钮高度
<span class="token macro property">#<span class="token directive keyword">define LineOriginYSVHeight - LineHeight - 1<span class="token comment">// 移动线 y 点
<span class="token keyword">@interface RHNavView <span class="token punctuation">(<span class="token punctuation">) <span class="token operator"><UIScrollViewDelegate<span class="token operator">>
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, strong<span class="token punctuation">) UIScrollView <span class="token operator">* scrollView<span class="token punctuation">;
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, strong<span class="token punctuation">) UILabel <span class="token operator">* lab_line<span class="token punctuation">;
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, strong<span class="token punctuation">) UILabel <span class="token operator">* lab_lineH<span class="token punctuation">;
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, strong<span class="token punctuation">) NSMutableArray <span class="token operator">* modelArr<span class="token punctuation">;
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, strong<span class="token punctuation">) NSMutableArray <span class="token operator">* itemArr<span class="token punctuation">;
<span class="token keyword">@end
<span class="token keyword">@implementation RHNavView
<span class="token operator">- <span class="token punctuation">(instancetype<span class="token punctuation">)initWithFrame<span class="token punctuation">:<span class="token punctuation">(CGRect<span class="token punctuation">)frame itemModels<span class="token punctuation">:<span class="token punctuation">(NSArray<span class="token operator"><RHNavItemModel <span class="token operator">*<span class="token operator">> <span class="token operator">*<span class="token punctuation">)models <span class="token punctuation">{
<span class="token keyword">self <span class="token operator">= <span class="token punctuation">[<span class="token keyword">super initWithFrame<span class="token punctuation">:frame<span class="token punctuation">]<span class="token punctuation">;
<span class="token keyword">if <span class="token punctuation">(<span class="token keyword">self<span class="token punctuation">) <span class="token punctuation">{
<span class="token keyword">self<span class="token punctuation">.backgroundColor <span class="token operator">= <span class="token punctuation"><span class="token punctuation">;
<span class="token punctuation">[<span class="token keyword">self<span class="token punctuation">.modelArr removeAllObjects<span class="token punctuation">]<span class="token punctuation">;
<span class="token punctuation">[<span class="token keyword">self<span class="token punctuation">.modelArr addObjectsFromArray<span class="token punctuation">:models<span class="token punctuation">]<span class="token punctuation">;
<span class="token punctuation">[<span class="token keyword">self addSubviews<span class="token punctuation">]<span class="token punctuation">;
<span class="token punctuation">}
<span class="token keyword">return <span class="token keyword">self<span class="token punctuation">;
<span class="token punctuation">}
<span class="token operator">- <span class="token punctuation">(<span class="token keyword">void<span class="token punctuation">)layoutSubviews <span class="token punctuation">{
<span class="token keyword">self<span class="token punctuation">.scrollView<span class="token punctuation">.frame <span class="token operator">= <span class="token function">CGRectMake<span class="token punctuation">(<span class="token number">0<span class="token punctuation">, <span class="token keyword">self<span class="token punctuation">.bounds<span class="token punctuation">.size<span class="token punctuation">.height <span class="token operator">- SVHeight<span class="token punctuation">, <span class="token keyword">self<span class="token punctuation">.bounds<span class="token punctuation">.size<span class="token punctuation">.width<span class="token punctuation">, SVHeight<span class="token punctuation">)<span class="token punctuation">;
<span class="token keyword">self<span class="token punctuation">.lab_lineH<span class="token punctuation">.frame <span class="token operator">= <span class="token function">CGRectMake<span class="token punctuation">(<span class="token number">0<span class="token punctuation">, <span class="token keyword">self<span class="token punctuation">.bounds<span class="token punctuation">.size<span class="token punctuation">.height <span class="token operator">- <span class="token number">1<span class="token punctuation">, <span class="token keyword">self<span class="token punctuation">.bounds<span class="token punctuation">.size<span class="token punctuation">.width<span class="token punctuation">, <span class="token number">1<span class="token punctuation">)<span class="token punctuation">;
<span class="token punctuation">[<span class="token keyword">super layoutSubviews<span class="token punctuation">]<span class="token punctuation">;
<span class="token punctuation">}
<span class="token macro property">#<span class="token directive keyword">pragma mark - create UI
<span class="token operator">- <span class="token punctuation">(<span class="token keyword">void<span class="token punctuation">)addSubviews <span class="token punctuation">{
<span class="token keyword">if <span class="token punctuation">(_modelArr<span class="token punctuation">.count <span class="token operator">== <span class="token number">0<span class="token punctuation">) <span class="token punctuation">{
<span class="token keyword">return<span class="token punctuation">;
<span class="token punctuation">}
<span class="token keyword">float totalItemWidth <span class="token operator">= <span class="token number">0<span class="token punctuation">;
<span class="token keyword">for <span class="token punctuation">(RHNavItemModel <span class="token operator">* model <span class="token keyword">in _modelArr<span class="token punctuation">) <span class="token punctuation">{
totalItemWidth <span class="token operator">+<span class="token operator">= model<span class="token punctuation">.itemWidth<span class="token punctuation">;
<span class="token punctuation">}
<span class="token punctuation">[<span class="token keyword">self addSubview<span class="token punctuation">:<span class="token keyword">self<span class="token punctuation">.scrollView<span class="token punctuation">]<span class="token punctuation">;
<span class="token punctuation"><span class="token punctuation">;
<span class="token punctuation">[<span class="token keyword">self addSubview<span class="token punctuation">:<span class="token keyword">self<span class="token punctuation">.lab_lineH<span class="token punctuation">]<span class="token punctuation">;
RHNavItemModel <span class="token operator">* mod <span class="token operator">= _modelArr<span class="token punctuation">.firstObject<span class="token punctuation">;
_lab_line<span class="token punctuation">.backgroundColor <span class="token operator">= mod<span class="token punctuation">.selectColor<span class="token punctuation">;
<span class="token keyword">if <span class="token punctuation">(_modelArr<span class="token punctuation">.count <span class="token operator">== <span class="token number">1<span class="token punctuation">) <span class="token punctuation">{
RHNavItemModel <span class="token operator">* model <span class="token operator">= _modelArr<span class="token punctuation">.firstObject<span class="token punctuation">;
RHNavItem <span class="token operator">* item <span class="token operator">= <span class="token punctuation">[<span class="token punctuation"> initWithFrame<span class="token punctuation">:<span class="token function">CGRectMake<span class="token punctuation">(<span class="token punctuation">(kScreen_W <span class="token operator">- model<span class="token punctuation">.itemWidth<span class="token punctuation">)<span class="token operator">/<span class="token number">2<span class="token punctuation">, <span class="token number">0<span class="token punctuation">, model<span class="token punctuation">.itemWidth<span class="token punctuation">, ItemHeight<span class="token punctuation">) itemModel<span class="token punctuation">:model<span class="token punctuation">]<span class="token punctuation">;
<span class="token punctuation">[<span class="token keyword">self itemClick<span class="token punctuation">:item<span class="token punctuation">]<span class="token punctuation">;
<span class="token punctuation"><span class="token punctuation">;
<span class="token punctuation">[<span class="token keyword">self<span class="token punctuation">.itemArr addObject<span class="token punctuation">:item<span class="token punctuation">]<span class="token punctuation">;
_lab_line<span class="token punctuation">.frame <span class="token operator">= <span class="token function">CGRectMake<span class="token punctuation">(<span class="token number">0<span class="token punctuation">, LineOriginY<span class="token punctuation">, model<span class="token punctuation">.lineWidth<span class="token punctuation">, LineHeight<span class="token punctuation">)<span class="token punctuation">;
_lab_line<span class="token punctuation">.center <span class="token operator">= <span class="token function">CGPointMake<span class="token punctuation">(item<span class="token punctuation">.center<span class="token punctuation">.x<span class="token punctuation">, _lab_line<span class="token punctuation">.center<span class="token punctuation">.y<span class="token punctuation">)<span class="token punctuation">;
<span class="token punctuation">} <span class="token keyword">else <span class="token keyword">if <span class="token punctuation">(_modelArr<span class="token punctuation">.count <span class="token operator">== <span class="token number">2<span class="token punctuation">) <span class="token punctuation">{
<span class="token keyword">for <span class="token punctuation">(<span class="token keyword">int i <span class="token operator">= <span class="token number">0<span class="token punctuation">; i <span class="token operator">< _modelArr<span class="token punctuation">.count<span class="token punctuation">; i<span class="token operator">++<span class="token punctuation">) <span class="token punctuation">{
RHNavItemModel <span class="token operator">* model <span class="token operator">= _modelArr<span class="token punctuation"><span class="token punctuation">;
RHNavItem <span class="token operator">* item <span class="token operator">= <span class="token punctuation">[<span class="token punctuation"> initWithFrame<span class="token punctuation">:<span class="token function">CGRectMake<span class="token punctuation">(i <span class="token operator">* <span class="token punctuation">(kScreen_W<span class="token operator">/<span class="token number">2<span class="token punctuation">)<span class="token punctuation">, <span class="token number">0<span class="token punctuation">, kScreen_W<span class="token operator">/<span class="token number">2<span class="token punctuation">, ItemHeight<span class="token punctuation">) itemModel<span class="token punctuation">:model<span class="token punctuation">]<span class="token punctuation">;
item<span class="token punctuation">.tag <span class="token operator">= BtnTag <span class="token operator">+ i<span class="token punctuation">;
<span class="token punctuation"><span class="token punctuation">;
<span class="token punctuation"><span class="token punctuation">;
<span class="token punctuation">[<span class="token keyword">self<span class="token punctuation">.itemArr addObject<span class="token punctuation">:item<span class="token punctuation">]<span class="token punctuation">;
<span class="token keyword">if <span class="token punctuation">(i <span class="token operator">== <span class="token number">0<span class="token punctuation">) <span class="token punctuation">{
_lab_line<span class="token punctuation">.frame <span class="token operator">= <span class="token function">CGRectMake<span class="token punctuation">(<span class="token number">0<span class="token punctuation">, LineOriginY<span class="token punctuation">, model<span class="token punctuation">.lineWidth<span class="token punctuation">, LineHeight<span class="token punctuation">)<span class="token punctuation">;
_lab_line<span class="token punctuation">.center <span class="token operator">= <span class="token function">CGPointMake<span class="token punctuation">(item<span class="token punctuation">.center<span class="token punctuation">.x<span class="token punctuation">, _lab_line<span class="token punctuation">.center<span class="token punctuation">.y<span class="token punctuation">)<span class="token punctuation">;
<span class="token punctuation">[<span class="token keyword">self itemClick<span class="token punctuation">:item<span class="token punctuation">]<span class="token punctuation">;
<span class="token punctuation">}
<span class="token punctuation">}
<span class="token punctuation">} <span class="token keyword">else <span class="token keyword">if <span class="token punctuation">(kScreen_W <span class="token operator">>= totalItemWidth<span class="token punctuation">) <span class="token punctuation">{
<span class="token keyword">for <span class="token punctuation">(<span class="token keyword">int i <span class="token operator">= <span class="token number">0<span class="token punctuation">; i <span class="token operator">< _modelArr<span class="token punctuation">.count<span class="token punctuation">; i<span class="token operator">++<span class="token punctuation">) <span class="token punctuation">{
RHNavItemModel <span class="token operator">* model <span class="token operator">= _modelArr<span class="token punctuation"><span class="token punctuation">;
model<span class="token punctuation">.itemWidth <span class="token operator">+<span class="token operator">= <span class="token punctuation">(kScreen_W <span class="token operator">- totalItemWidth<span class="token punctuation">)<span class="token operator">/_modelArr<span class="token punctuation">.count<span class="token punctuation">;
<span class="token punctuation">}
<span class="token keyword">float originX <span class="token operator">= <span class="token number">0<span class="token punctuation">;
<span class="token keyword">for <span class="token punctuation">(<span class="token keyword">int i <span class="token operator">= <span class="token number">0<span class="token punctuation">; i <span class="token operator">< _modelArr<span class="token punctuation">.count<span class="token punctuation">; i<span class="token operator">++<span class="token punctuation">) <span class="token punctuation">{
RHNavItemModel <span class="token operator">* model <span class="token operator">= _modelArr<span class="token punctuation"><span class="token punctuation">;
RHNavItem <span class="token operator">* item <span class="token operator">= <span class="token punctuation">[<span class="token punctuation"> initWithFrame<span class="token punctuation">:<span class="token function">CGRectMake<span class="token punctuation">(originX<span class="token punctuation">, <span class="token number">0<span class="token punctuation">, model<span class="token punctuation">.itemWidth<span class="token punctuation">, ItemHeight<span class="token punctuation">) itemModel<span class="token punctuation">:model<span class="token punctuation">]<span class="token punctuation">;
item<span class="token punctuation">.tag <span class="token operator">= BtnTag <span class="token operator">+ i<span class="token punctuation">;
<span class="token punctuation"><span class="token punctuation">;
<span class="token punctuation"><span class="token punctuation">;
<span class="token punctuation">[<span class="token keyword">self<span class="token punctuation">.itemArr addObject<span class="token punctuation">:item<span class="token punctuation">]<span class="token punctuation">;
originX <span class="token operator">+<span class="token operator">= model<span class="token punctuation">.itemWidth<span class="token punctuation">;
<span class="token keyword">if <span class="token punctuation">(i <span class="token operator">== <span class="token number">0<span class="token punctuation">) <span class="token punctuation">{
_lab_line<span class="token punctuation">.frame </span><span class="token operator">= </span><span class="token function">CGRectMake</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">, LineOriginY</span><span class="token punctuation">, model</span><span class="token punctuation">.lineWidth</span><span class="token punctuation">, LineHeight</span><span class="token punctuation">)</span><span class="token punctuation">;
_lab_line</span><span class="token punctuation">.center </span><span class="token operator">= </span><span class="token function">CGPointMake</span><span class="token punctuation">(item</span><span class="token punctuation">.center</span><span class="token punctuation">.x</span><span class="token punctuation">, _lab_line</span><span class="token punctuation">.center</span><span class="token punctuation">.y</span><span class="token punctuation">)</span><span class="token punctuation">;
</span><span class="token punctuation">[</span><span class="token keyword">self itemClick</span><span class="token punctuation">:item</span><span class="token punctuation">]</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token punctuation">}
</span><span class="token punctuation">} </span><span class="token keyword">else </span><span class="token punctuation">{
_scrollView</span><span class="token punctuation">.contentSize </span><span class="token operator">= </span><span class="token function">CGSizeMake</span><span class="token punctuation">(totalItemWidth</span><span class="token punctuation">, </span><span class="token number">44</span><span class="token punctuation">)</span><span class="token punctuation">;
_scrollView</span><span class="token punctuation">.showsHorizontalScrollIndicator </span><span class="token operator">= NO</span><span class="token punctuation">;
</span><span class="token keyword">float originX </span><span class="token operator">= </span><span class="token number">0</span><span class="token punctuation">;
</span><span class="token keyword">for </span><span class="token punctuation">(</span><span class="token keyword">int i </span><span class="token operator">= </span><span class="token number">0</span><span class="token punctuation">; i </span><span class="token operator">< _modelArr</span><span class="token punctuation">.count</span><span class="token punctuation">; i</span><span class="token operator">++</span><span class="token punctuation">) </span><span class="token punctuation">{
RHNavItemModel </span><span class="token operator">* model </span><span class="token operator">= _modelArr</span><span class="token punctuation"></span><span class="token punctuation">;
RHNavItem </span><span class="token operator">* item </span><span class="token operator">= </span><span class="token punctuation">[</span><span class="token punctuation"> initWithFrame</span><span class="token punctuation">:</span><span class="token function">CGRectMake</span><span class="token punctuation">(originX</span><span class="token punctuation">, </span><span class="token number">0</span><span class="token punctuation">, model</span><span class="token punctuation">.itemWidth</span><span class="token punctuation">, ItemHeight</span><span class="token punctuation">) itemModel</span><span class="token punctuation">:model</span><span class="token punctuation">]</span><span class="token punctuation">;
item</span><span class="token punctuation">.tag </span><span class="token operator">= BtnTag </span><span class="token operator">+ i</span><span class="token punctuation">;
</span><span class="token punctuation"></span><span class="token punctuation">;
</span><span class="token punctuation"></span><span class="token punctuation">;
</span><span class="token punctuation">[</span><span class="token keyword">self</span><span class="token punctuation">.itemArr addObject</span><span class="token punctuation">:item</span><span class="token punctuation">]</span><span class="token punctuation">;
originX </span><span class="token operator">+</span><span class="token operator">= model</span><span class="token punctuation">.itemWidth</span><span class="token punctuation">;
</span><span class="token keyword">if </span><span class="token punctuation">(i </span><span class="token operator">== </span><span class="token number">0</span><span class="token punctuation">) </span><span class="token punctuation">{
_lab_line</span><span class="token punctuation">.frame </span><span class="token operator">= </span><span class="token function">CGRectMake</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">, LineOriginY</span><span class="token punctuation">, model</span><span class="token punctuation">.lineWidth</span><span class="token punctuation">, LineHeight</span><span class="token punctuation">)</span><span class="token punctuation">;
_lab_line</span><span class="token punctuation">.center </span><span class="token operator">= </span><span class="token function">CGPointMake</span><span class="token punctuation">(item</span><span class="token punctuation">.center</span><span class="token punctuation">.x</span><span class="token punctuation">, _lab_line</span><span class="token punctuation">.center</span><span class="token punctuation">.y</span><span class="token punctuation">)</span><span class="token punctuation">;
</span><span class="token punctuation">[</span><span class="token keyword">self itemClick</span><span class="token punctuation">:item</span><span class="token punctuation">]</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token punctuation">}
</span><span class="token punctuation">}
</span><span class="token punctuation">}
</span><span class="token macro property">#</span><span class="token directive keyword">pragma mark - item event
</span><span class="token operator">- </span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)itemClick</span><span class="token punctuation">:</span><span class="token punctuation">(RHNavItem </span><span class="token operator">*</span><span class="token punctuation">)item</span><span class="token punctuation">{
NSInteger index </span><span class="token operator">= item</span><span class="token punctuation">.tag </span><span class="token operator">- BtnTag</span><span class="token punctuation">;
</span><span class="token keyword">if </span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token keyword">self</span><span class="token punctuation">.delegate respondsToSelector</span><span class="token punctuation">:</span><span class="token keyword">@selector</span><span class="token punctuation">(navView</span><span class="token punctuation">:didSelectedItemAtIndex</span><span class="token punctuation">:</span><span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">) </span><span class="token punctuation">{
</span><span class="token punctuation">[</span><span class="token keyword">self</span><span class="token punctuation">.delegate navView</span><span class="token punctuation">:</span><span class="token keyword">self didSelectedItemAtIndex</span><span class="token punctuation">:index</span><span class="token punctuation">]</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token punctuation">[</span><span class="token keyword">self setScrollViewContentOffsetWithItem</span><span class="token punctuation">:item</span><span class="token punctuation">]</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token macro property">#</span><span class="token directive keyword">pragma mark - 重写属性set方法实现item自动切换
</span><span class="token operator">- </span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)setSelectedIndex</span><span class="token punctuation">:</span><span class="token punctuation">(NSInteger</span><span class="token punctuation">)selectedIndex </span><span class="token punctuation">{
RHNavItem </span><span class="token operator">* item </span><span class="token operator">= </span><span class="token punctuation">[</span><span class="token keyword">self viewWithTag</span><span class="token punctuation">:BtnTag </span><span class="token operator">+ selectedIndex</span><span class="token punctuation">]</span><span class="token punctuation">;
</span><span class="token punctuation">[</span><span class="token keyword">self setScrollViewContentOffsetWithItem</span><span class="token punctuation">:item</span><span class="token punctuation">]</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token macro property">#</span><span class="token directive keyword">pragma mark - 设置item的位置
</span><span class="token operator">- </span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)setScrollViewContentOffsetWithItem</span><span class="token punctuation">:</span><span class="token punctuation">(RHNavItem </span><span class="token operator">*</span><span class="token punctuation">)item </span><span class="token punctuation">{
NSInteger index </span><span class="token operator">= item</span><span class="token punctuation">.tag </span><span class="token operator">- BtnTag</span><span class="token punctuation">;
RHNavItemModel </span><span class="token operator">* model </span><span class="token operator">= _modelArr</span><span class="token punctuation"></span><span class="token punctuation">;
</span><span class="token keyword">float scaleX </span><span class="token operator">= model</span><span class="token punctuation">.lineWidth </span><span class="token operator">/ _lab_line</span><span class="token punctuation">.bounds</span><span class="token punctuation">.size</span><span class="token punctuation">.width</span><span class="token punctuation">;
</span><span class="token function">dispatch_async</span><span class="token punctuation">(</span><span class="token function">dispatch_get_main_queue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">, </span><span class="token operator">^</span><span class="token punctuation">{
</span><span class="token punctuation">[UIView animateWithDuration</span><span class="token punctuation">:</span><span class="token number">0.25 animations</span><span class="token punctuation">:</span><span class="token operator">^</span><span class="token punctuation">{
_lab_line</span><span class="token punctuation">.center </span><span class="token operator">= </span><span class="token function">CGPointMake</span><span class="token punctuation">(item</span><span class="token punctuation">.center</span><span class="token punctuation">.x</span><span class="token punctuation">, _lab_line</span><span class="token punctuation">.center</span><span class="token punctuation">.y</span><span class="token punctuation">)</span><span class="token punctuation">;
_lab_line</span><span class="token punctuation">.transform </span><span class="token operator">= </span><span class="token function">CGAffineTransformMakeScale</span><span class="token punctuation">(scaleX</span><span class="token punctuation">, </span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;
</span><span class="token punctuation">} completion</span><span class="token punctuation">:</span><span class="token operator">^</span><span class="token punctuation">(BOOL finished</span><span class="token punctuation">) </span><span class="token punctuation">{
_lab_line</span><span class="token punctuation">.frame </span><span class="token operator">= </span><span class="token function">CGRectMake</span><span class="token punctuation">(item</span><span class="token punctuation">.frame</span><span class="token punctuation">.origin</span><span class="token punctuation">.x </span><span class="token operator">+ </span><span class="token punctuation">(model</span><span class="token punctuation">.itemWidth </span><span class="token operator">- model</span><span class="token punctuation">.lineWidth</span><span class="token punctuation">)</span><span class="token operator">/</span><span class="token number">2</span><span class="token punctuation">, LineOriginY</span><span class="token punctuation">, model</span><span class="token punctuation">.lineWidth</span><span class="token punctuation">, LineHeight</span><span class="token punctuation">)</span><span class="token punctuation">;
</span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">;
</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;
</span><span class="token comment">//遍历ScrollView的RHNavItem 判断如果是当前点中的item 改变其selected属性为YES否则改为NO
</span><span class="token keyword">for </span><span class="token punctuation">(RHNavItem </span><span class="token operator">* navItem </span><span class="token keyword">in </span><span class="token keyword">self</span><span class="token punctuation">.itemArr</span><span class="token punctuation">) </span><span class="token punctuation">{
</span><span class="token keyword">if </span><span class="token punctuation">(navItem </span><span class="token operator">!= item</span><span class="token punctuation">) </span><span class="token punctuation">{
navItem</span><span class="token punctuation">.selected </span><span class="token operator">= NO</span><span class="token punctuation">;
</span><span class="token punctuation">} </span><span class="token keyword">else </span><span class="token punctuation">{
navItem</span><span class="token punctuation">.selected </span><span class="token operator">= YES</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token punctuation">}
</span><span class="token keyword">float totalItemWidth </span><span class="token operator">= </span><span class="token number">0</span><span class="token punctuation">;
</span><span class="token keyword">for </span><span class="token punctuation">(RHNavItemModel </span><span class="token operator">* model </span><span class="token keyword">in _modelArr</span><span class="token punctuation">) </span><span class="token punctuation">{
totalItemWidth </span><span class="token operator">+</span><span class="token operator">= model</span><span class="token punctuation">.itemWidth</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token keyword">if </span><span class="token punctuation">(kScreen_W </span><span class="token operator">>= totalItemWidth</span><span class="token punctuation">) </span><span class="token punctuation">{
</span><span class="token keyword">return</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token keyword">if </span><span class="token punctuation">(item</span><span class="token punctuation">.center</span><span class="token punctuation">.x </span><span class="token operator">- kScreen_W</span><span class="token operator">/</span><span class="token number">2 </span><span class="token operator"><= </span><span class="token number">0</span><span class="token punctuation">) </span><span class="token punctuation">{
</span><span class="token punctuation"></span><span class="token punctuation">;
</span><span class="token keyword">return</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token keyword">if </span><span class="token punctuation">(item</span><span class="token punctuation">.center</span><span class="token punctuation">.x </span><span class="token operator">- kScreen_W</span><span class="token operator">/</span><span class="token number">2 </span><span class="token operator">> </span><span class="token number">0 </span><span class="token operator">&& _scrollView</span><span class="token punctuation">.contentSize</span><span class="token punctuation">.width </span><span class="token operator">- item</span><span class="token punctuation">.center</span><span class="token punctuation">.x </span><span class="token operator">> kScreen_W</span><span class="token operator">/</span><span class="token number">2</span><span class="token punctuation">) </span><span class="token punctuation">{
</span><span class="token punctuation"></span><span class="token punctuation">;
</span><span class="token keyword">return</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token keyword">if </span><span class="token punctuation">(_scrollView</span><span class="token punctuation">.contentSize</span><span class="token punctuation">.width </span><span class="token operator">- item</span><span class="token punctuation">.center</span><span class="token punctuation">.x </span><span class="token operator"><= kScreen_W</span><span class="token operator">/</span><span class="token number">2</span><span class="token punctuation">) </span><span class="token punctuation">{
</span><span class="token punctuation"></span><span class="token punctuation">;
</span><span class="token keyword">return</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token punctuation">}
</span><span class="token macro property">#</span><span class="token directive keyword">pragma mark - setter and getter
</span><span class="token operator">- </span><span class="token punctuation">(UIScrollView </span><span class="token operator">*</span><span class="token punctuation">)scrollView </span><span class="token punctuation">{
</span><span class="token keyword">if </span><span class="token punctuation">(</span><span class="token operator">!_scrollView</span><span class="token punctuation">) </span><span class="token punctuation">{
UIScrollView </span><span class="token operator">* scrollView </span><span class="token operator">= </span><span class="token punctuation">[</span><span class="token punctuation"> init</span><span class="token punctuation">]</span><span class="token punctuation">;
_scrollView </span><span class="token operator">= scrollView</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token keyword">return _scrollView</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token operator">- </span><span class="token punctuation">(UILabel </span><span class="token operator">*</span><span class="token punctuation">)lab_line </span><span class="token punctuation">{
</span><span class="token keyword">if </span><span class="token punctuation">(</span><span class="token operator">!_lab_line</span><span class="token punctuation">) </span><span class="token punctuation">{
UILabel </span><span class="token operator">* label </span><span class="token operator">= </span><span class="token punctuation">[</span><span class="token punctuation"> init</span><span class="token punctuation">]</span><span class="token punctuation">;
_lab_line </span><span class="token operator">= label</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token keyword">return _lab_line</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token operator">- </span><span class="token punctuation">(UILabel </span><span class="token operator">*</span><span class="token punctuation">)lab_lineH </span><span class="token punctuation">{
</span><span class="token keyword">if </span><span class="token punctuation">(</span><span class="token operator">!_lab_lineH</span><span class="token punctuation">) </span><span class="token punctuation">{
UILabel </span><span class="token operator">* label </span><span class="token operator">= </span><span class="token punctuation">[</span><span class="token punctuation"> init</span><span class="token punctuation">]</span><span class="token punctuation">;
label</span><span class="token punctuation">.backgroundColor </span><span class="token operator">= </span><span class="token punctuation"></span><span class="token punctuation">;
_lab_lineH </span><span class="token operator">= label</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token keyword">return _lab_lineH</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token operator">- </span><span class="token punctuation">(NSMutableArray </span><span class="token operator">*</span><span class="token punctuation">)modelArr </span><span class="token punctuation">{
</span><span class="token keyword">if </span><span class="token punctuation">(</span><span class="token operator">!_modelArr</span><span class="token punctuation">) </span><span class="token punctuation">{
_modelArr </span><span class="token operator">= </span><span class="token punctuation">[</span><span class="token punctuation"> init</span><span class="token punctuation">]</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token keyword">return _modelArr</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token operator">- </span><span class="token punctuation">(NSMutableArray </span><span class="token operator">*</span><span class="token punctuation">)itemArr </span><span class="token punctuation">{
</span><span class="token keyword">if </span><span class="token punctuation">(</span><span class="token operator">!_itemArr</span><span class="token punctuation">) </span><span class="token punctuation">{
_itemArr </span><span class="token operator">= </span><span class="token punctuation">[</span><span class="token punctuation"> init</span><span class="token punctuation">]</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token keyword">return _itemArr</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token operator">- </span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)setItemModelArr</span><span class="token punctuation">:</span><span class="token punctuation">(NSArray </span><span class="token operator">*</span><span class="token punctuation">)itemModelArr </span><span class="token punctuation">{
_itemModelArr </span><span class="token operator">= itemModelArr</span><span class="token punctuation">;
</span><span class="token punctuation">[</span><span class="token keyword">self</span><span class="token punctuation">.modelArr removeAllObjects</span><span class="token punctuation">]</span><span class="token punctuation">;
</span><span class="token punctuation">[</span><span class="token keyword">self</span><span class="token punctuation">.modelArr addObjectsFromArray</span><span class="token punctuation">:itemModelArr</span><span class="token punctuation">]</span><span class="token punctuation">;
</span><span class="token keyword">for </span><span class="token punctuation">(</span><span class="token keyword">int i </span><span class="token operator">= </span><span class="token number">0</span><span class="token punctuation">; i </span><span class="token operator">< _itemArr</span><span class="token punctuation">.count</span><span class="token punctuation">; i</span><span class="token operator">++</span><span class="token punctuation">) </span><span class="token punctuation">{
RHNavItem </span><span class="token operator">* item </span><span class="token operator">= _itemArr</span><span class="token punctuation"></span><span class="token punctuation">;
RHNavItemModel </span><span class="token operator">* model </span><span class="token operator">= _itemModelArr</span><span class="token punctuation"></span><span class="token punctuation">;
item</span><span class="token punctuation">.titleLabel</span><span class="token punctuation">.font </span><span class="token operator">= model</span><span class="token punctuation">.titleFont</span><span class="token punctuation">;
</span><span class="token punctuation"></span><span class="token punctuation">;
</span><span class="token punctuation"></span><span class="token punctuation">;
</span><span class="token keyword">if </span><span class="token punctuation">(i </span><span class="token operator">== </span><span class="token number">0</span><span class="token punctuation">) </span><span class="token punctuation">{
_lab_line</span><span class="token punctuation">.backgroundColor </span><span class="token operator">= model</span><span class="token punctuation">.selectColor</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token punctuation">}
</span><span class="token punctuation">}
</span><span class="token keyword">@end
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<p>如果看完了这个类,可以看出这里对标题的个数对应不同的布局做了简单的区分,把所有代码都拿过来了,有点繁琐,还请不要介意。</p>
<p>下面是关键了,是下方滑动界面与上方标题栏相互关联的实现,这里用到了<code>UIViewController</code>来实现,为了能够更清晰的给大家展示如何封装,还请大家不要觉得代码繁琐,<code>.h</code>文件如下:</p>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-objectivec"><code class="language-objectivec"><span class="token macro property">#<span class="token directive keyword">import <UIKit/UIKit.h>
<span class="token keyword">@interface RHNavController <span class="token punctuation">: UIViewController
<span class="token comment">// navView 背景色
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, strong<span class="token punctuation">) UIColor <span class="token operator">* tintColor<span class="token punctuation">;
<span class="token comment">// 未选中 item 字体颜色
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, strong<span class="token punctuation">) UIColor <span class="token operator">* itemNormalColor<span class="token punctuation">;
<span class="token comment">// 选中 item 字体颜色
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, strong<span class="token punctuation">) UIColor <span class="token operator">* itemSelectColor<span class="token punctuation">;
<span class="token comment">// item 字体大小
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, strong<span class="token punctuation">) UIFont <span class="token operator">* itemFont<span class="token punctuation">;
<span class="token comment">// 父 vc
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, weak<span class="token punctuation">) UIViewController <span class="token operator">* parentController<span class="token punctuation">;
<span class="token comment">// 当前选中的下标
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, assign<span class="token punctuation">, readonly<span class="token punctuation">) NSInteger selectedIndex<span class="token punctuation">;
<span class="token comment">// vc 与 title 个数必须一致
<span class="token operator">- <span class="token punctuation">(instancetype<span class="token punctuation">)initWithControllers<span class="token punctuation">:<span class="token punctuation">(NSArray<span class="token operator"><UIViewController <span class="token operator">*<span class="token operator">> <span class="token operator">*<span class="token punctuation">)controllers itemTitles<span class="token punctuation">:<span class="token punctuation">(NSArray<span class="token operator"><NSString <span class="token operator">*<span class="token operator">> <span class="token operator">*<span class="token punctuation">)titles<span class="token punctuation">;
<span class="token keyword">@end
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<p><code>.m</code>文件的实现:</p>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-objectivec"><code class="language-objectivec"><span class="token macro property">#<span class="token directive keyword">import "RHNavController.h"
<span class="token macro property">#<span class="token directive keyword">import "RHNavView.h"
<span class="token comment">// 标题默认未选中颜色
<span class="token macro property">#<span class="token directive keyword">define NORMAL_COLOR
<span class="token comment">// 标题默认选中颜色
<span class="token macro property">#<span class="token directive keyword">define SELECT_COLOR
<span class="token macro property">#<span class="token directive keyword">define RHNAV_COLLECTION_CELL @"RHNav_Collection_Cell_ID"
<span class="token keyword">@interface RHNavController <span class="token punctuation">(<span class="token punctuation">) <span class="token operator"><UICollectionViewDataSource<span class="token punctuation">, UICollectionViewDelegate<span class="token punctuation">, UICollectionViewDelegateFlowLayout<span class="token punctuation">, RHNavViewDelegate<span class="token operator">>
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, strong<span class="token punctuation">) NSMutableArray <span class="token operator">* controllerArr<span class="token punctuation">;
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, strong<span class="token punctuation">) NSMutableArray <span class="token operator">* modelArr<span class="token punctuation">;
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, strong<span class="token punctuation">) UICollectionView <span class="token operator">* collectionView<span class="token punctuation">;
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, strong<span class="token punctuation">) RHNavView <span class="token operator">* navView<span class="token punctuation">;
<span class="token comment">// 是否手动拖拽collectionView
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, assign<span class="token punctuation">) BOOL isDrag<span class="token punctuation">;
<span class="token keyword">@property <span class="token punctuation">(nonatomic<span class="token punctuation">, assign<span class="token punctuation">) CGFloat navViewH<span class="token punctuation">;
<span class="token keyword">@end
<span class="token keyword">@implementation RHNavController
<span class="token operator">- <span class="token punctuation">(instancetype<span class="token punctuation">)initWithControllers<span class="token punctuation">:<span class="token punctuation">(NSArray<span class="token operator"><UIViewController <span class="token operator">*<span class="token operator">> <span class="token operator">*<span class="token punctuation">)controllers itemTitles<span class="token punctuation">:<span class="token punctuation">(NSArray<span class="token operator"><NSString <span class="token operator">*<span class="token operator">> <span class="token operator">*<span class="token punctuation">)titles <span class="token punctuation">{
<span class="token keyword">self <span class="token operator">= <span class="token punctuation">[<span class="token keyword">super init<span class="token punctuation">]<span class="token punctuation">;
<span class="token keyword">if <span class="token punctuation">(<span class="token keyword">self<span class="token punctuation">) <span class="token punctuation">{
<span class="token punctuation">[<span class="token keyword">self<span class="token punctuation">.controllerArr addObjectsFromArray<span class="token punctuation">:controllers<span class="token punctuation">]<span class="token punctuation">;
<span class="token keyword">for <span class="token punctuation">(<span class="token keyword">int i <span class="token operator">= <span class="token number">0<span class="token punctuation">; i <span class="token operator">< titles<span class="token punctuation">.count<span class="token punctuation">; i<span class="token operator">++<span class="token punctuation">) <span class="token punctuation">{
RHNavItemModel <span class="token operator">* model <span class="token operator">= <span class="token punctuation">[<span class="token punctuation"> initWithTitle<span class="token punctuation">:titles<span class="token punctuation"> font<span class="token punctuation">:<span class="token punctuation"> normalColor<span class="token punctuation">:NORMAL_COLOR selectColor<span class="token punctuation">:SELECT_COLOR<span class="token punctuation">]<span class="token punctuation">;
<span class="token punctuation">[<span class="token keyword">self<span class="token punctuation">.modelArr addObject<span class="token punctuation">:model<span class="token punctuation">]<span class="token punctuation">;
<span class="token punctuation">}
<span class="token punctuation">}
<span class="token keyword">return <span class="token keyword">self<span class="token punctuation">;
<span class="token punctuation">}
<span class="token operator">- <span class="token punctuation">(<span class="token keyword">void<span class="token punctuation">)viewDidLoad <span class="token punctuation">{
<span class="token punctuation">[<span class="token keyword">super viewDidLoad<span class="token punctuation">]<span class="token punctuation">;
<span class="token punctuation">[<span class="token keyword">self addChildViewControllers<span class="token punctuation">]<span class="token punctuation">;
<span class="token punctuation">[<span class="token keyword">self addSubviews<span class="token punctuation">]<span class="token punctuation">;
<span class="token punctuation">}
<span class="token macro property">#<span class="token directive keyword">pragma mark - 添加子控制器
<span class="token operator">- <span class="token punctuation">(<span class="token keyword">void<span class="token punctuation">)addChildViewControllers <span class="token punctuation">{
<span class="token keyword">for <span class="token punctuation">(<span class="token keyword">int i <span class="token operator">= <span class="token number">0<span class="token punctuation">; i <span class="token operator">< <span class="token keyword">self<span class="token punctuation">.controllerArr<span class="token punctuation">.count<span class="token punctuation">; i<span class="token operator">++<span class="token punctuation">) <span class="token punctuation">{
UIViewController <span class="token operator">* vc <span class="token operator">= <span class="token punctuation">(UIViewController <span class="token operator">*<span class="token punctuation">)<span class="token keyword">self<span class="token punctuation">.controllerArr<span class="token punctuation"><span class="token punctuation">;
<span class="token punctuation">[<span class="token keyword">self addChildViewController<span class="token punctuation">:vc<span class="token punctuation">]<span class="token punctuation">;
<span class="token punctuation">}
<span class="token punctuation">}
<span class="token macro property">#<span class="token directive keyword">pragma mark - add subviews
<span class="token operator">- <span class="token punctuation">(<span class="token keyword">void<span class="token punctuation">)addSubviews <span class="token punctuation">{
<span class="token punctuation">[<span class="token keyword">self<span class="token punctuation">.view addSubview<span class="token punctuation">:<span class="token keyword">self<span class="token punctuation">.navView<span class="token punctuation">]<span class="token punctuation">;
<span class="token punctuation">[<span class="token keyword">self<span class="token punctuation">.view addSubview<span class="token punctuation">:<span class="token keyword">self<span class="token punctuation">.collectionView<span class="token punctuation">]<span class="token punctuation">;
<span class="token punctuation">}
<span class="token macro property">#<span class="token directive keyword">pragma mark - navView delegate
<span class="token operator">- <span class="token punctuation">(<span class="token keyword">void<span class="token punctuation">)navView<span class="token punctuation">:<span class="token punctuation">(RHNavView <span class="token operator">*<span class="token punctuation">)navView didSelectedItemAtIndex<span class="token punctuation">:<span class="token punctuation">(NSInteger<span class="token punctuation">)index <span class="token punctuation">{
_isDrag <span class="token operator">= NO<span class="token punctuation">;
<span class="token punctuation"><span class="token punctuation">;
_selectedIndex <span class="token operator">= index<span class="token punctuation">;
<span class="token punctuation">}
<span class="token macro property">#<span class="token directive keyword">pragma mark - collectionView dataSource
<span class="token operator">- <span class="token punctuation">(NSInteger<span class="token punctuation">)collectionView<span class="token punctuation">:<span class="token punctuation">(UICollectionView <span class="token operator">*<span class="token punctuation">)collectionView numberOfItemsInSection<span class="token punctuation">:<span class="token punctuation">(NSInteger<span class="token punctuation">)section <span class="token punctuation">{
<span class="token keyword">return <span class="token keyword">self<span class="token punctuation">.controllerArr<span class="token punctuation">.count<span class="token punctuation">;
<span class="token punctuation">}
<span class="token operator">- <span class="token punctuation">(UICollectionViewCell <span class="token operator">*<span class="token punctuation">)collectionView<span class="token punctuation">:<span class="token punctuation">(UICollectionView <span class="token operator">*<span class="token punctuation">)collectionView cellForItemAtIndexPath<span class="token punctuation">:<span class="token punctuation">(NSIndexPath <span class="token operator">*<span class="token punctuation">)indexPath <span class="token punctuation">{
UICollectionViewCell <span class="token operator">* cell <span class="token operator">= <span class="token punctuation"><span class="token punctuation">;
<span class="token keyword">if <span class="token punctuation">(indexPath<span class="token punctuation">.row <span class="token operator">< <span class="token keyword">self<span class="token punctuation">.controllerArr<span class="token punctuation">.count<span class="token punctuation">) <span class="token punctuation">{
UIViewController <span class="token operator">* controller <span class="token operator">= <span class="token keyword">self<span class="token punctuation">.controllerArr<span class="token punctuation"><span class="token punctuation">;
controller<span class="token punctuation">.view<span class="token punctuation">.frame <span class="token operator">= cell<span class="token punctuation">.contentView<span class="token punctuation">.bounds<span class="token punctuation">;
<span class="token punctuation"><span class="token punctuation">;
<span class="token punctuation"><span class="token punctuation">;
<span class="token punctuation">}
<span class="token keyword">return cell<span class="token punctuation">;
<span class="token punctuation">}
<span class="token operator">- <span class="token punctuation">(CGSize<span class="token punctuation">)collectionView<span class="token punctuation">:<span class="token punctuation">(UICollectionView <span class="token operator">*<span class="token punctuation">)collectionView layout<span class="token punctuation">:<span class="token punctuation">(UICollectionViewLayout <span class="token operator">*<span class="token punctuation">)collectionViewLayout sizeForItemAtIndexPath<span class="token punctuation">:<span class="token punctuation">(NSIndexPath <span class="token operator">*<span class="token punctuation">)indexPath <span class="token punctuation">{
<span class="token keyword">return <span class="token function">CGSizeMake<span class="token punctuation">(kScreen_W<span class="token punctuation">, <span class="token keyword">self<span class="token punctuation">.view<span class="token punctuation">.bounds<span class="token punctuation">.size<span class="token punctuation">.height <span class="token operator">- _navViewH<span class="token punctuation">)<span class="token punctuation">;
<span class="token punctuation">}
<span class="token comment">//翻页中,是否手动翻页都会触发
<span class="token operator">- <span class="token punctuation">(<span class="token keyword">void<span class="token punctuation">)scrollViewDidScroll<span class="token punctuation">:<span class="token punctuation">(UIScrollView <span class="token operator">*<span class="token punctuation">)scrollView <span class="token punctuation">{
<span class="token keyword">if <span class="token punctuation">(_isDrag<span class="token punctuation">) <span class="token punctuation">{
<span class="token keyword">if <span class="token punctuation">(scrollView <span class="token operator">== _collectionView<span class="token punctuation">) <span class="token punctuation">{
NSInteger selectIndex <span class="token operator">= <span class="token punctuation">(_collectionView<span class="token punctuation">.contentOffset<span class="token punctuation">.x <span class="token operator">+ kScreen_W <span class="token operator">/ <span class="token number">2<span class="token punctuation">) <span class="token operator">/ kScreen_W<span class="token punctuation">;
_navView<span class="token punctuation">.selectedIndex <span class="token operator">= selectIndex<span class="token punctuation">;
_selectedIndex <span class="token operator">= selectIndex<span class="token punctuation">;
<span class="token punctuation">}
<span class="token punctuation">}
<span class="token punctuation">}
<span class="token comment">//开始翻页,只有手动开始翻页才会触发的方法
<span class="token operator">- <span class="token punctuation">(<span class="token keyword">void<span class="token punctuation">)scrollViewWillBeginDragging<span class="token punctuation">:<span class="token punctuation">(UIScrollView <span class="token operator">*<span class="token punctuation">)scrollView <span class="token punctuation">{
_isDrag <span class="token operator">= YES<span class="token punctuation">;
<span class="token punctuation">}
<span class="token macro property">#<span class="token directive keyword">pragma mark - setter and getter
<span class="token operator">- <span class="token punctuation">(UICollectionView <span class="token operator">*<span class="token punctuation">)collectionView <span class="token punctuation">{
<span class="token keyword">if <span class="token punctuation">(<span class="token operator">!_collectionView<span class="token punctuation">) <span class="token punctuation">{
UICollectionViewFlowLayout <span class="token operator">* flowLayout <span class="token operator">= <span class="token punctuation">[<span class="token punctuation"> init<span class="token punctuation">]<span class="token punctuation">;
flowLayout<span class="token punctuation">.scrollDirection <span class="token operator">= UICollectionViewScrollDirectionHorizontal<span class="token punctuation">;
<span class="token comment">//两列之间的距离
flowLayout<span class="token punctuation">.minimumInteritemSpacing <span class="token operator">= <span class="token number">0<span class="token punctuation">;
<span class="token comment">//两行之间的距离
flowLayout<span class="token punctuation">.minimumLineSpacing <span class="token operator">= <span class="token number">0<span class="token punctuation">;
UICollectionView <span class="token operator">* collection <span class="token operator">= <span class="token punctuation">[<span class="token punctuation"> initWithFrame<span class="token punctuation">:CGRectZero collectionViewLayout<span class="token punctuation">:flowLayout<span class="token punctuation">]<span class="token punctuation">;
collection<span class="token punctuation">.backgroundColor <span class="token operator">= <span class="token punctuation"><span class="token punctuation">;
collection<span class="token punctuation">.dataSource <span class="token operator">= <span class="token keyword">self<span class="token punctuation">;
collection<span class="token punctuation">.delegate <span class="token operator">= <span class="token keyword">self<span class="token punctuation">;
<span class="token comment">//设置翻页
collection<span class="token punctuation">.pagingEnabled <span class="token operator">= YES<span class="token punctuation">;
<span class="token comment">//反弹
collection<span class="token punctuation">.bounces <span class="token operator">= NO<span class="token punctuation">;
<span class="token comment">//水平滚动条
collection<span class="token punctuation">.showsHorizontalScrollIndicator <span class="token operator">= NO<span class="token punctuation">;
<span class="token punctuation">forCellWithReuseIdentifier<span class="token punctuation">:RHNAV_COLLECTION_CELL<span class="token punctuation">]<span class="token punctuation">;
_collectionView <span class="token operator">= collection<span class="token punctuation">;
<span class="token punctuation">}
<span class="token keyword">return _collectionView<span class="token punctuation">;
<span class="token punctuation">}
<span class="token operator">- <span class="token punctuation">(RHNavView <span class="token operator">*<span class="token punctuation">)navView <span class="token punctuation">{
<span class="token keyword">if <span class="token punctuation">(<span class="token operator">!_navView<span class="token punctuation">) <span class="token punctuation">{
RHNavView <span class="token operator">* navView <span class="token operator">= <span class="token punctuation">[<span class="token punctuation"> initWithFrame<span class="token punctuation">:CGRectZero itemModels<span class="token punctuation">:<span class="token keyword">self<span class="token punctuation">.modelArr<span class="token punctuation">]<span class="token punctuation">;
navView<span class="token punctuation">.delegate <span class="token operator">= <span class="token keyword">self<span class="token punctuation">;
_navView </span><span class="token operator">= navView</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token keyword">return _navView</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token operator">- </span><span class="token punctuation">(NSMutableArray </span><span class="token operator">*</span><span class="token punctuation">)controllerArr </span><span class="token punctuation">{
</span><span class="token keyword">if </span><span class="token punctuation">(</span><span class="token operator">!_controllerArr</span><span class="token punctuation">) </span><span class="token punctuation">{
_controllerArr </span><span class="token operator">= </span><span class="token punctuation">[</span><span class="token punctuation"> init</span><span class="token punctuation">]</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token keyword">return _controllerArr</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token operator">- </span><span class="token punctuation">(NSMutableArray </span><span class="token operator">*</span><span class="token punctuation">)modelArr </span><span class="token punctuation">{
</span><span class="token keyword">if </span><span class="token punctuation">(</span><span class="token operator">!_modelArr</span><span class="token punctuation">) </span><span class="token punctuation">{
_modelArr </span><span class="token operator">= </span><span class="token punctuation">[</span><span class="token punctuation"> init</span><span class="token punctuation">]</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token keyword">return _modelArr</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token operator">- </span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)setParentController</span><span class="token punctuation">:</span><span class="token punctuation">(UIViewController </span><span class="token operator">*</span><span class="token punctuation">)parentController </span><span class="token punctuation">{
parentController</span><span class="token punctuation">.automaticallyAdjustsScrollViewInsets </span><span class="token operator">= NO</span><span class="token punctuation">;
</span><span class="token punctuation"></span><span class="token punctuation">;
</span><span class="token punctuation"></span><span class="token punctuation">;
CGFloat originY </span><span class="token operator">= </span><span class="token number">0</span><span class="token punctuation">;
</span><span class="token keyword">if </span><span class="token punctuation">(parentController</span><span class="token punctuation">.navigationController</span><span class="token punctuation">) </span><span class="token punctuation">{
_navViewH </span><span class="token operator">= </span><span class="token number">44</span><span class="token punctuation">;
</span><span class="token keyword">if </span><span class="token punctuation">(parentController</span><span class="token punctuation">.navigationController</span><span class="token punctuation">.navigationBar</span><span class="token punctuation">.isTranslucent</span><span class="token punctuation">) </span><span class="token punctuation">{
originY </span><span class="token operator">= </span><span class="token number">64</span><span class="token punctuation">;
</span><span class="token punctuation">} </span><span class="token keyword">else </span><span class="token punctuation">{
originY </span><span class="token operator">= </span><span class="token number">0</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token punctuation">} </span><span class="token keyword">else </span><span class="token punctuation">{
_navViewH </span><span class="token operator">= </span><span class="token number">64</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token keyword">self</span><span class="token punctuation">.navView</span><span class="token punctuation">.frame </span><span class="token operator">= </span><span class="token function">CGRectMake</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">, originY</span><span class="token punctuation">, kScreen_W</span><span class="token punctuation">, _navViewH</span><span class="token punctuation">)</span><span class="token punctuation">;
</span><span class="token keyword">self</span><span class="token punctuation">.collectionView</span><span class="token punctuation">.frame </span><span class="token operator">= </span><span class="token function">CGRectMake</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">, _navViewH </span><span class="token operator">+ originY</span><span class="token punctuation">, kScreen_W</span><span class="token punctuation">, </span><span class="token keyword">self</span><span class="token punctuation">.view</span><span class="token punctuation">.bounds</span><span class="token punctuation">.size</span><span class="token punctuation">.height </span><span class="token operator">- _navViewH </span><span class="token operator">- originY</span><span class="token punctuation">)</span><span class="token punctuation">;
</span><span class="token punctuation">[</span><span class="token keyword">self</span><span class="token punctuation">.collectionView reloadData</span><span class="token punctuation">]</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token operator">- </span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)setTintColor</span><span class="token punctuation">:</span><span class="token punctuation">(UIColor </span><span class="token operator">*</span><span class="token punctuation">)tintColor </span><span class="token punctuation">{
_tintColor </span><span class="token operator">= tintColor</span><span class="token punctuation">;
</span><span class="token keyword">self</span><span class="token punctuation">.navView</span><span class="token punctuation">.backgroundColor </span><span class="token operator">= tintColor</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token operator">- </span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)setItemNormalColor</span><span class="token punctuation">:</span><span class="token punctuation">(UIColor </span><span class="token operator">*</span><span class="token punctuation">)itemNormalColor </span><span class="token punctuation">{
_itemNormalColor </span><span class="token operator">= itemNormalColor</span><span class="token punctuation">;
</span><span class="token keyword">for </span><span class="token punctuation">(RHNavItemModel </span><span class="token operator">* model </span><span class="token keyword">in _modelArr</span><span class="token punctuation">) </span><span class="token punctuation">{
model</span><span class="token punctuation">.normalColor </span><span class="token operator">= itemNormalColor</span><span class="token punctuation">;
</span><span class="token punctuation">}
_navView</span><span class="token punctuation">.itemModelArr </span><span class="token operator">= _modelArr</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token operator">- </span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)setItemSelectColor</span><span class="token punctuation">:</span><span class="token punctuation">(UIColor </span><span class="token operator">*</span><span class="token punctuation">)itemSelectColor </span><span class="token punctuation">{
_itemSelectColor </span><span class="token operator">= itemSelectColor</span><span class="token punctuation">;
</span><span class="token keyword">for </span><span class="token punctuation">(RHNavItemModel </span><span class="token operator">* model </span><span class="token keyword">in _modelArr</span><span class="token punctuation">) </span><span class="token punctuation">{
model</span><span class="token punctuation">.selectColor </span><span class="token operator">= itemSelectColor</span><span class="token punctuation">;
</span><span class="token punctuation">}
_navView</span><span class="token punctuation">.itemModelArr </span><span class="token operator">= _modelArr</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token operator">- </span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)setItemFont</span><span class="token punctuation">:</span><span class="token punctuation">(UIFont </span><span class="token operator">*</span><span class="token punctuation">)itemFont </span><span class="token punctuation">{
_itemFont </span><span class="token operator">= itemFont</span><span class="token punctuation">;
</span><span class="token keyword">for </span><span class="token punctuation">(RHNavItemModel </span><span class="token operator">* model </span><span class="token keyword">in _modelArr</span><span class="token punctuation">) </span><span class="token punctuation">{
model</span><span class="token punctuation">.titleFont </span><span class="token operator">= _itemFont</span><span class="token punctuation">;
</span><span class="token punctuation">}
_navView</span><span class="token punctuation">.itemModelArr </span><span class="token operator">= _modelArr</span><span class="token punctuation">;
</span><span class="token punctuation">}
</span><span class="token keyword">@end
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<p>OK,到此就封装结束了,接下来就是使用了,使用是非常的简单,只需要在需求的VC里边通过构造方法创建该控制器,并设置父VC为需求的VC即可。这里就只给大家展示一下在<code>ViewController</code>中的实现如下:</p>
<div class="_2Uzcx_"><button class="VJbwyy" type="button"></button>
<pre class="line-numberslanguage-objectivec"><code class="language-objectivec"><span class="token macro property">#<span class="token directive keyword">import "ViewController.h"
<span class="token macro property">#<span class="token directive keyword">import "RHNavController.h"
<span class="token macro property">#<span class="token directive keyword">import "FirstViewController.h"
<span class="token macro property">#<span class="token directive keyword">import "SecondViewController.h"
<span class="token macro property">#<span class="token directive keyword">import "ThirdViewController.h"
<span class="token macro property">#<span class="token directive keyword">import "FourthViewController.h"
<span class="token macro property">#<span class="token directive keyword">import "FifthViewController.h"
<span class="token macro property">#<span class="token directive keyword">import "SixthViewController.h"
<span class="token keyword">@interface ViewController <span class="token punctuation">(<span class="token punctuation">)
<span class="token keyword">@end
<span class="token keyword">@implementation ViewController
<span class="token operator">- <span class="token punctuation">(<span class="token keyword">void<span class="token punctuation">)viewDidLoad <span class="token punctuation">{
<span class="token punctuation">[<span class="token keyword">super viewDidLoad<span class="token punctuation">]<span class="token punctuation">;
<span class="token keyword">self<span class="token punctuation">.title <span class="token operator">= <span class="token string">@"首页"<span class="token punctuation">;
<span class="token punctuation">[<span class="token keyword">self setNavController<span class="token punctuation">]<span class="token punctuation">;
<span class="token punctuation">}
<span class="token operator">- <span class="token punctuation">(<span class="token keyword">void<span class="token punctuation">)setNavController <span class="token punctuation">{
FirstViewController <span class="token operator">* first <span class="token operator">= <span class="token punctuation">[<span class="token punctuation"> init<span class="token punctuation">]<span class="token punctuation">;
SecondViewController <span class="token operator">* second <span class="token operator">= <span class="token punctuation">[<span class="token punctuation"> init<span class="token punctuation">]<span class="token punctuation">;
ThirdViewController <span class="token operator">* third <span class="token operator">= <span class="token punctuation">[<span class="token punctuation"> init<span class="token punctuation">]<span class="token punctuation">;
FourthViewController <span class="token operator">* fourth <span class="token operator">= <span class="token punctuation">[<span class="token punctuation"> init<span class="token punctuation">]<span class="token punctuation">;
FifthViewController <span class="token operator">* fifth <span class="token operator">= <span class="token punctuation">[<span class="token punctuation"> init<span class="token punctuation">]<span class="token punctuation">;
SixthViewController <span class="token operator">* sixth <span class="token operator">= <span class="token punctuation">[<span class="token punctuation"> init<span class="token punctuation">]<span class="token punctuation">;
NSArray <span class="token operator">* controllerArr <span class="token operator">= <span class="token operator">@<span class="token punctuation"><span class="token punctuation">;
NSArray <span class="token operator">* titleArr <span class="token operator">= <span class="token operator">@<span class="token punctuation">[<span class="token string">@"first"<span class="token punctuation">, <span class="token string">@"second"<span class="token punctuation">, <span class="token string">@"third"<span class="token punctuation">, <span class="token string">@"fourth"<span class="token punctuation">, <span class="token string">@"fifth"<span class="token punctuation">, <span class="token string">@"sixth"<span class="token punctuation">]<span class="token punctuation">;
RHNavController <span class="token operator">* nav <span class="token operator">= <span class="token punctuation">[<span class="token punctuation"> initWithControllers<span class="token punctuation">:controllerArr itemTitles<span class="token punctuation">:titleArr<span class="token punctuation">]<span class="token punctuation">;
<span class="token comment">// nav.tintColor = ;
<span class="token comment">// nav.itemNormalColor = ;
<span class="token comment">// nav.itemSelectColor = ;
<span class="token comment">// nav.itemFont = ;
nav<span class="token punctuation">.parentController <span class="token operator">= <span class="token keyword">self<span class="token punctuation">;
<span class="token punctuation">}
<span class="token keyword">@end
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<p>总结该控件的好处就是:所有界面都是独立的,可以在相应的vc里边实现不同的布局。<br>
如果还有什么疑问的话可以去下载该控件的demo或者对我提问也可,我会在看到的第一时间回复。</p>
<p>作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:651612063 进群密码111,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!进群领取iOS面试题。</p>
<p><img src="https://img2020.cnblogs.com/blog/2038694/202005/2038694-20200525125638534-584279184.png"></p>
<p> </p>
<p> </p>
<p> </p>
</div>
<p><br><br><br></p><br><br>
来源:https://www.cnblogs.com/ajjx1366/p/12956293.html
頁:
[1]