iOS 用objective-C實(shí)現(xiàn)簡(jiǎn)單的滾動(dòng)標(biāo)題欄(二)

接著上篇文章我們繼續(xù)寫(xiě)PageTitleView和PageContentView用代理進(jìn)行通訊,這是項(xiàng)目的github地址 ScrollViewDemo
當(dāng)我們點(diǎn)擊PageTittleView上的titleLabel是 雖然位置顏色都發(fā)生了改變,但是pageContentView并沒(méi)有發(fā)生改變,所以我采取了用代理協(xié)議


//PageTitleView.h
@protocol PageTitleViewDelegate <NSObject>

-(void) pageTitletView:(id)contentView selectedIndex:(NSInteger)targetIndex;
@end
@property(assign,nonatomic)id<PageTitleViewDelegate>delegate;

@end


然后我們點(diǎn)擊之后就可以通過(guò)這個(gè)代理向PageContentView“取得聯(lián)系”

//PageTitleView.m
-(void)titleLabelClickedWithGes:(UITapGestureRecognizer*)ges{
    
    if (ges.view) {
        /*
        ...
        中間省略了很多無(wú)關(guān)代碼
        ...
        */
        
        
        [self.delegate pageTitletView:self selectedIndex:self.currentIndex];
        //代理方法
    }else{
        return;
    }
}

還有設(shè)置一些兩者"聯(lián)系"的所需線路:暴露的方法

//PageContentView.h
@interface PageContentView : UIView
/*
省略無(wú)關(guān)屬性及方法
*/
-(void)setCurrentIndex:(NSInteger)index;//向外暴露的方法,用于點(diǎn)擊titleLabel后所調(diào)用設(shè)置當(dāng)前PageContentView的子視圖
@end

當(dāng)點(diǎn)擊title的時(shí)候 pageContentView的視圖必須發(fā)生改變,PageContentView的CollectionViews的偏離位置發(fā)生改變

-(void)setCurrentIndex:(NSInteger)index{
    CGFloat offsetX = index*self.collectionView.frame.size.width;
    [self.collectionView setContentOffset:CGPointMake(offsetX, 0)];
}

然后就是在主控制器實(shí)現(xiàn)該代理

-(void)pageTitletView:(id)contentView selectedIndex:(NSInteger)targetIndex{
    [self.pageContentView setCurrentIndex:targetIndex];
}

接著當(dāng)我們滑動(dòng)pageContentView時(shí)PageTitleView的titleLabel也會(huì)發(fā)生相對(duì)的改變 所以與上面類(lèi)似 我們還要在PageContentView聲明代理協(xié)議

@protocol PageContentViewDelegate <NSObject>

-(void) pageContentView:(id)contentView progress:(CGFloat)progress sourceIndex:(NSInteger)sourceIndex targetIndex:(NSInteger)targetIndex;

@end

@interface PageContentView : UIView
@property(assign,nonatomic)id<PageContentViewDelegate>delegate;
/*
省略部分分無(wú)關(guān)的屬性和方法
*/
@end

這次是滑動(dòng)發(fā)生了改變,所以要記錄一開(kāi)始的位置的橫坐標(biāo)

@interface PageContentView ()<UICollectionViewDataSource,UICollectionViewDelegate>

@property(nonatomic,assign)CGFloat startOffset;

@end

還要實(shí)現(xiàn)Collection的scrollViewDidScroll:(UIScrollView *)scrollView和scrollViewWillBeginDragging:(UIScrollView *)scrollView的代理方法。

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    //獲取數(shù)據(jù)
  
    CGFloat progress = 0;
    NSInteger sourceIndex = 0;
    NSInteger targetIndex = 0;
    
    
    //判斷左右滑
    CGFloat currentOffsetX = scrollView.contentOffset.x;
    CGFloat scrollViewW = scrollView.bounds.size.width;
    if (currentOffsetX>self.startOffset) {
        //左滑
        progress = currentOffsetX/scrollViewW-floor(currentOffsetX/scrollViewW);
        sourceIndex = (NSInteger)(currentOffsetX/scrollViewW);
        targetIndex = sourceIndex+1;
        if (targetIndex>=self.childVcs.count) {
            targetIndex = self.childVcs.count-1;
        }
        if (currentOffsetX-self.startOffset==scrollViewW) {
            progress = 1;
            targetIndex = sourceIndex;
        }
    }else{
        
        
        //右滑
   
        progress = 1-(currentOffsetX/scrollViewW-floor(currentOffsetX/scrollViewW));
        targetIndex = (NSInteger)(currentOffsetX/scrollViewW);
        sourceIndex = targetIndex+1;
        if (sourceIndex>=self.childVcs.count) {
            sourceIndex=self.childVcs.count-1;
        }
    }
    [self.delegate pageContentView:self progress:progress sourceIndex:sourceIndex targetIndex:targetIndex];
    
    
}
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
      self.startOffset  = scrollView.contentOffset.x;
    
}

當(dāng)然判斷向左滑還是右滑,是進(jìn)行了一番計(jì)算得到的算,需要大家好好理解

當(dāng)然在PageTitleView也需要提供“聯(lián)系”接口

@interface PageTitleView : UIView

@property(assign,nonatomic)id<PageTitleViewDelegate>delegate;



/*
省略了部分的無(wú)關(guān)的方法
*/

-(void)setTitleWithProgress:(CGFloat)progress sourceIndex:(NSInteger)index targetIndex:(NSInteger)index;
@end

當(dāng)滑動(dòng)時(shí)titleLabel的顏色是漸變的


-(void)titleLabelClickedWithGes:(UITapGestureRecognizer*)ges{
    
    if (ges.view) {
        UILabel *currentLabel = (UILabel*)ges.view;
        UILabel*oldLabel = self.titleLabels[self.currentIndex];
        self.currentIndex = currentLabel.tag;
        currentLabel.textColor = [UIColor orangeColor];
        oldLabel.textColor = [UIColor darkGrayColor];
        CGFloat scrollLineX = currentLabel.tag*self.scrollLine.frame.size.width;
        [UIView animateWithDuration:0.15 animations:^{
            self.scrollLine.frame = CGRectMake(scrollLineX, self.frame.size.height-kScrollLineH, currentLabel.frame.size.width, 2.0);
        }];
        [self.delegate pageTitletView:self selectedIndex:self.currentIndex];
    }else{
        return;
    }
}

最后在視圖控制器中實(shí)現(xiàn)代理


-(void)pageContentView:(id)contentView progress:(CGFloat)progress sourceIndex:(NSInteger)sourceIndex targetIndex:(NSInteger)targetIndex{
    
    [self.pageTitleView setTitleWithProgress:progress sourceIndex:sourceIndex targetIndex:targetIndex];
}

這篇關(guān)于用Objective-C實(shí)現(xiàn)滾動(dòng)標(biāo)題的文章結(jié)束了,大家若還有什么問(wèn)題。歡迎在評(píng)論區(qū)留言

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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