設(shè)計(jì)一個(gè)帶提示信息的導(dǎo)航欄控件HTNavGlideBar

一、需求說(shuō)明

需要完成一個(gè),具有左右滑動(dòng)的導(dǎo)航欄,同時(shí)單擊導(dǎo)航欄中的每個(gè)項(xiàng)目按鈕具有與其相對(duì)應(yīng)的提示功能。

二、通過(guò)具體的效果圖來(lái)了解

HTNavGlideBar.gif

三、分析控件的組成

1、一個(gè)支持左右滑動(dòng)的UIScrollView
2、多個(gè)可以點(diǎn)擊的按鈕
3、一個(gè)點(diǎn)擊向右側(cè)滑動(dòng)的按鈕
4、一個(gè)和選擇項(xiàng)目對(duì)應(yīng)的指示層
具體代碼內(nèi)容如下

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

四、對(duì)外的屬性和行為

itemHints:每個(gè)項(xiàng)目對(duì)應(yīng)提示內(nèi)容
itemTitles:每個(gè)項(xiàng)目的標(biāo)題

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

一個(gè)Delegate,用戶告訴調(diào)用方被選擇項(xiàng)目的索引值

@protocol HTNavGlideBarDelegate <NSObject>

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

@end

五、內(nèi)部行為

1、導(dǎo)航欄中的項(xiàng)目被點(diǎn)擊:指示器位置和內(nèi)容和按鈕的選擇狀態(tài),通知調(diào)用方

- (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、點(diǎn)擊向右側(cè)滑動(dòng)按鈕:變換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];
}

六、補(bǔ)充說(shuō)明

完成以上的分析,我們就可以著手開(kāi)發(fā)控件的細(xì)節(jié)了。

七、控件下載

去GitHub上下載和了解此控件的詳細(xì)代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 47,161評(píng)論 22 665
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,316評(píng)論 4 61
  • 上文講到,五行:火、土、金、水、木,分別對(duì)應(yīng)人體五臟的心、脾、肺、腎、肝。 而這章,則講講五行的相生相克規(guī)律,若運(yùn)...
    陸亦有居閱讀 578評(píng)論 0 0
  • 時(shí)間一天天的流逝,你收獲了些什么? 還記得你的初衷嗎?曾經(jīng)揚(yáng)言自己未來(lái)的生活一定過(guò)的很精彩,都說(shuō)理想很豐滿,但現(xiàn)實(shí)...
    溜溜人生閱讀 632評(píng)論 0 0
  • 喬之對(duì)自家大學(xué),是懷著一顆敬仰又虔誠(chéng)的心的。原因是學(xué)校的大門太有特色了,朱門碧瓦的仿宮殿門,讓喬之每次進(jìn)校,都感覺(jué)...
    一顆好看的紐扣閱讀 515評(píng)論 0 0

友情鏈接更多精彩內(nèi)容