iOS下簡單實現(xiàn)滑動導(dǎo)航條

功能介紹

最近在做一款ios的app砰蠢,其中有一個頁面需要分成三個版塊,版塊之間可以通過左右滑動來進行切換,也可以通過點擊上方的按鈕來切換,好像在android中可以用過ViewPager + Fragment來實現(xiàn)罚屋。界面大概就是這個樣子,這里我以知乎客戶端的發(fā)現(xiàn)頁面為例:


其中整個頁面分為三個小的版塊蕊苗,分別"推薦"沿后,"熱門"以及"收藏"沿彭。點擊上方的文字后朽砰,下方的頁面會切換到對應(yīng)的版塊,同時文字下方的藍色導(dǎo)航條也會隨著界面的切換跟著滑動喉刘。另外瞧柔,當(dāng)我們不通過按鈕切換,用手勢在頁面上左右滑動時睦裳,導(dǎo)航條也會跟著一起滑動造锅。功能大概就是這個樣子。

原理

下面簡單分析下實現(xiàn)原理廉邑。首先在"發(fā)現(xiàn)"的下方應(yīng)該有UIView哥蔚,在UIView中放有3個UIButton。至于文字下方的導(dǎo)航條蛛蒙,可以用UILabel來做糙箍,寬度等于一個按鈕的寬度,并將背景色改為藍色牵祟。導(dǎo)航條下方的頁面可以通過手勢來左右滑動深夯,首先想到的應(yīng)該就是,這是一個UIScrollView诺苹,我們需要將scrollView的contentSize屬性設(shè)置成三個頁面寬度的大小咕晋,否則會無法滑動頁面。然后在scrollView放上三個版塊的頁面收奔,這個根據(jù)自身的業(yè)務(wù)情況而定掌呜,一般UITableView用得比較多。最后坪哄,怎樣才能讓頁面滑動的時候?qū)Ш綏l也跟著移動的质蕉?在Android中呢撞,一般的做法就是給scrollView中添加一個事件監(jiān)聽器,用來監(jiān)聽滑動事件饰剥,并在事件處理函數(shù)中執(zhí)行響應(yīng)的邏輯殊霞。在ios中沒有事件監(jiān)聽這個概念,我們可以為scrollView設(shè)置它的代理汰蓉,并在代理類中覆蓋掉該方法:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

設(shè)置了代理類后绷蹲,代理類其實就是幫我們注冊了相應(yīng)的回調(diào)函數(shù),每次scrollView只要有細微的滑動顾孽,該方法就會被調(diào)用祝钢。在方法中,需要做的就是獲取scrollView當(dāng)前的偏移量若厚,然后根據(jù)這個偏移量來設(shè)定導(dǎo)航條的位置拦英。

代碼實現(xiàn)

將scrollView與滾動條聲明未全局變量,因為在其他方法中也會用到测秸。

//存放三個按鈕的父頁面寬度
#define TOP_VIEW_HEIGHT 50
//界面上方導(dǎo)航線條的寬度
#define NAVIGATION_LINE_HEIGHT 2

@interface MyMesgViewController () <UIScrollViewDelegate>

@property (nonatomic, strong) UIScrollView *scrollView;
@property (nonatomic, strong) UILabel *navLabel;

@end

scrollView延遲初始化疤估,在初始化時記得為其設(shè)置代理對象。

- (UIScrollView *)scrollView {
    if (!_scrollView) {
        CGFloat scrollViewHeight = 64 + TOP_VIEW_HEIGHT + 8;
        _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, scrollViewHeight, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height - scrollViewHeight)];
        _scrollView.showsHorizontalScrollIndicator = NO;
        _scrollView.pagingEnabled = YES;
        CGSize size = _scrollView.frame.size;
        size.width *= 3;
        _scrollView.contentSize = size;
        _scrollView.backgroundColor = [UIColor whiteColor];
        _scrollView.delegate = self;
        [self.view addSubview:_scrollView];
    }
    return _scrollView;
}

navLabel延遲初始化

- (UILabel *)navLabel {
    if (!_navLabel) {
        _navLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, TOP_VIEW_HEIGHT - NAVIGATION_LINE_HEIGHT, [UIScreen mainScreen].bounds.size.width / 3, NAVIGATION_LINE_HEIGHT)];
        _navLabel.backgroundColor = [UIColor blueColor];
    }
    return _navLabel;
}

將三個按鈕添加到頁面中霎冯,并為按鈕添加點擊事件處理函數(shù)铃拇。

- (void)addMessageCategoryButton {
    UIView *topView = [[UIView alloc] initWithFrame:CGRectMake(0, 64, [UIScreen mainScreen].bounds.size.width, TOP_VIEW_HEIGHT)];
    topView.backgroundColor = [UIColor whiteColor];
    UIButton *approvedMsgButton = [self createMsgButton:@"審核消息" posX:0];
    UIButton *mosMsgButton = [self createMsgButton:@"M幣交易" posX:approvedMsgButton.frame.size.width];
    UIButton *systemMsgButton = [self createMsgButton:@"系統(tǒng)通知" posX:approvedMsgButton.frame.size.width * 2];
    
    
    [topView addSubview:approvedMsgButton];
    [topView addSubview:mosMsgButton];
    [topView addSubview:systemMsgButton];
    [topView addSubview:self.navLabel];
    
    [self.view addSubview:topView];
}

將創(chuàng)建按鈕的過程單獨抽象出來

- (UIButton *)createMsgButton:(NSString *)title posX:(CGFloat)posX {
    UIButton *msgButton = [[UIButton alloc] initWithFrame:CGRectMake(posX, 0, self.view.frame.size.width / 3, TOP_VIEW_HEIGHT - NAVIGATION_LINE_HEIGHT)];
    msgButton.backgroundColor = [UIColor whiteColor];
    
    NSAttributedString *attributeTitle = [[NSAttributedString alloc] initWithString:title attributes:@{ NSFontAttributeName : [UIFont systemFontOfSize:14] }];
    [msgButton setAttributedTitle:attributeTitle forState:UIControlStateNormal];
    msgButton.tag = (NSInteger) (posX / (self.view.frame.size.width / 3));
    [msgButton addTarget:self action:@selector(switchMessageDetailView:) forControlEvents:UIControlEventTouchUpInside];
    
    return msgButton;
}

按鈕點擊后調(diào)用的函數(shù),即切換頁面

- (void)switchMessageDetailView:(UIButton *)btn {
    [self.scrollView setContentOffset:CGPointMake(btn.tag * self.view.frame.size.width, 0) animated:YES];
}

最后沈撞,在回調(diào)函數(shù)中根據(jù)scrollView的偏移量調(diào)整導(dǎo)航條的位置慷荔。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGPoint offset = scrollView.contentOffset;
    CGFloat x = offset.x / 3;
    if (x > 0 && x < scrollView.frame.size.width) {
        CGRect frame = self.navLabel.frame;
        frame.origin.x = x;
        self.navLabel.frame = frame;
    }
}

這是最終的效果圖:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缠俺,隨后出現(xiàn)的幾起案子显晶,更是在濱河造成了極大的恐慌,老刑警劉巖壹士,帶你破解...
    沈念sama閱讀 223,207評論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磷雇,死亡現(xiàn)場離奇詭異,居然都是意外死亡墓卦,警方通過查閱死者的電腦和手機倦春,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評論 3 400
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來落剪,“玉大人睁本,你說我怎么就攤上這事≈也溃” “怎么了呢堰?”我有些...
    開封第一講書人閱讀 170,031評論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長凡泣。 經(jīng)常有香客問我枉疼,道長皮假,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,334評論 1 300
  • 正文 為了忘掉前任骂维,我火速辦了婚禮惹资,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘航闺。我一直安慰自己褪测,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,322評論 6 398
  • 文/花漫 我一把揭開白布潦刃。 她就那樣靜靜地躺著侮措,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乖杠。 梳的紋絲不亂的頭發(fā)上分扎,一...
    開封第一講書人閱讀 52,895評論 1 314
  • 那天,我揣著相機與錄音胧洒,去河邊找鬼畏吓。 笑死,一個胖子當(dāng)著我的面吹牛略荡,可吹牛的內(nèi)容都是我干的庵佣。 我是一名探鬼主播,決...
    沈念sama閱讀 41,300評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼汛兜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了通今?” 一聲冷哼從身側(cè)響起粥谬,我...
    開封第一講書人閱讀 40,264評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辫塌,沒想到半個月后漏策,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,784評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡臼氨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,870評論 3 343
  • 正文 我和宋清朗相戀三年掺喻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片储矩。...
    茶點故事閱讀 40,989評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡感耙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出持隧,到底是詐尸還是另有隱情即硼,我是刑警寧澤,帶...
    沈念sama閱讀 36,649評論 5 351
  • 正文 年R本政府宣布屡拨,位于F島的核電站只酥,受9級特大地震影響褥实,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜裂允,卻給世界環(huán)境...
    茶點故事閱讀 42,331評論 3 336
  • 文/蒙蒙 一损离、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绝编,春花似錦草冈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绷跑,卻和暖如春拳恋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背砸捏。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評論 1 275
  • 我被黑心中介騙來泰國打工谬运, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人垦藏。 一個月前我還...
    沈念sama閱讀 49,452評論 3 379
  • 正文 我出身青樓梆暖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掂骏。 傳聞我的和親對象是個殘疾皇子轰驳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,995評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件弟灼、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,131評論 4 61
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,352評論 25 707
  • 黑沝手握寒刃级解,刀尖頂在毫無血色的皮膚上摁出一道凹痕,逐漸施加壓力田绑,陷入皮肉的剎那間像極了切割披薩時唾液急速分泌的感...
    夜步逐熒光閱讀 414評論 0 1
  • 生成SSL證書 先按照以上操作生成自簽名證書勤哗。服務(wù)端和客戶端分別需要引用到的證書如下: 服務(wù)端 在go中啟動一個h...
    二三10111閱讀 8,598評論 1 1
  • 改變placeholder顏色 高德地圖(網(wǎng)頁端)
    一二三kkxx閱讀 244評論 0 0