设计一个带提示信息的导航栏控件HTNavGlideBar

一、需求说明

需要完成一个,具有左右滑动的导航栏,同时单击导航栏中的每个项目按钮具有与其相对应的提示功能。

二、通过具体的效果图来了解

HTNavGlideBar.gif

三、分析控件的组成

1、一个支持左右滑动的UIScrollView
2、多个可以点击的按钮
3、一个点击向右侧滑动的按钮
4、一个和选择项目对应的指示层
具体代码内容如下

UIScrollView    *_navgationTabBar;      // all items on this scroll view
NSMutableArray  *_items;
UIImageView     *_arrowButton;          // arrow button
HTNavHintLayer *_hintView;

四、对外的属性和行为

itemHints:每个项目对应提示内容
itemTitles:每个项目的标题

@property (nonatomic, strong)   NSArray     *itemHints;     // current selected item's index
@property (nonatomic, strong)   NSArray     *itemTitles;    // all items' title

一个Delegate,用户告诉调用方被选择项目的索引值

@protocol HTNavGlideBarDelegate <NSObject>

@optional
/**
  *  When NavGlideBar Item Is Pressed Call Back
  *
  *  @param index - pressed item's index
  */
 - (void)itemDidSelectedWithIndex:(NSInteger)index;

@end

五、内部行为

1、导航栏中的项目被点击:指示器位置和内容和按钮的选择状态,通知调用方

- (void)itemPressed:(UIButton *)button
{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationDelegate:self];
    
    NSInteger index = [_items indexOfObject:button];
    CGRect hintFrame = _hintView.frame;
    hintFrame.origin.x = button.frame.origin.x - _navgationTabBar.contentOffset.x +10 ;
    _hintView.frame = hintFrame;
    [_hintView setHint:_itemHints[index]];
    _hintViewFrame = _hintView.frame;
    _hintViewFrame.origin.x = button.frame.origin.x +10;
    [UIView commitAnimations];

     for (int i = 0; i<[_items count]; i++) {
     UIButton *btn = (UIButton *)_items[i];
     btn.selected = NO;
    }
    button.selected = YES;
    [_delegate itemDidSelectedWithIndex:index];
}

2、点击向右侧滑动按钮:变换UIScrollView的ContentOffset

- (void)functionButtonPressed
{
    NSInteger offset =_navgationTabBar.contentOffset.x+40;
    NSInteger width =_navgationTabBar.contentSize.width + 40 - BAR_WIDTH;
    if (offset>width) {
        offset =0;
    }
    [_navgationTabBar setContentOffset:CGPointMake(offset,0) animated:YES];
}

六、补充说明

完成以上的分析,我们就可以着手开发控件的细节了。

七、控件下载

去GitHub上下载和了解此控件的详细代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 内容抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新...
    皇小弟阅读 46,971评论 22 665
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,194评论 4 61
  • 上文讲到,五行:火、土、金、水、木,分别对应人体五脏的心、脾、肺、肾、肝。 而这章,则讲讲五行的相生相克规律,若运...
    陆亦有居阅读 3,499评论 0 0
  • 时间一天天的流逝,你收获了些什么? 还记得你的初衷吗?曾经扬言自己未来的生活一定过的很精彩,都说理想很丰满,但现实...
    溜溜人生阅读 3,660评论 0 0
  • 乔之对自家大学,是怀着一颗敬仰又虔诚的心的。原因是学校的大门太有特色了,朱门碧瓦的仿宫殿门,让乔之每次进校,都感觉...
    一颗好看的纽扣阅读 3,214评论 0 0