接著上篇文章我們繼續(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ū)留言