本篇主要解決以下需求場景:
代碼結(jié)構(gòu)的設(shè)計:
1,外層UIView裹驰,用來整體封裝关摇。包含計時器屑埋、子視圖scrollView的代理方法等。
同時如果要求scrollView整體滾動展示區(qū)域設(shè)置背景色時讥蟆,由于在自定義分頁大小時勒虾,改小了scrollView的寬度。這時可以直接在外層View上操作瘸彤。
2修然,[UIView addSubview:scrollView]
3,在scrollView上根據(jù)數(shù)據(jù)源,循環(huán)創(chuàng)建UIImageView并add到scrollView上
實現(xiàn)自定義分頁大小的主要思路:
1愕宋,UIScrollView的contentSize屬性玻靡,決定整體滾動展示區(qū)域的大小
scrollView.contentSize = CGSizeMake(展示區(qū)域?qū)挾? 展示區(qū)域高度);
scrollView.pagingEnabled = YES;//啟動分頁效果
2,UIScrollView的frame寬度中贝,決定分頁page的大小囤捻,即手每滑一次,滾動的距離
scrollView.frame = 設(shè)置為實際想要分頁的寬度(小于整體展示區(qū)域?qū)挾龋?
3邻寿,設(shè)置scrollView的clipsToBounds屬性為NO:不裁剪子視圖超出父視圖的部分
屬性詳細介紹見:http://www.reibang.com/p/1f94bed28b93
scrollView.clipsToBounds = NO;
4蝎土,解決自定義分頁大小后,內(nèi)部子view 點擊事件/手勢 不響應(yīng)的問題绣否。
(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; 系統(tǒng)的Hit-Testing方法誊涯,觸摸屏幕時,探測由哪個對象最先響應(yīng)蒜撮,決定scrollView內(nèi)部子view的點擊事件or手勢的響應(yīng)
//重寫外層UIView的觸摸手勢響應(yīng)鏈方法
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if ([self pointInside:point withEvent:event]) {
//觸摸點在外層UIView的范圍中暴构,都優(yōu)先響應(yīng)子視圖scrollView
return scrollView;
}
return nil;
}
響應(yīng)鏈、Hit-Testing段磨,詳細介紹:http://www.reibang.com/p/77139b374313?open_source=weibo_search
【注意取逾!】如果scrollView中,每個UIImageView都有點擊跳轉(zhuǎn)事件苹支,則要轉(zhuǎn)換相對坐標系砾隅,加多一層判斷:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if ([self pointInside:point withEvent:event]) {
for (UIView *view in self.adScrollView.subviews) {
//轉(zhuǎn)換坐標系為imageView,進行對比
CGPoint pointInImageView = [self convertPoint:point toView:view];
if ([view pointInside:pointInImageView withEvent:event] && [view isKindOfClass:[UIImageView class]]) {
//優(yōu)先響應(yīng)imageView的點擊事件
return view;
}
}
//其次響應(yīng)scrollView
return self.scrollView;
}
return nil;
}
轉(zhuǎn)換坐標系convertPoint沐序、及判斷點在范圍內(nèi) 詳細介紹:http://www.cocoachina.com/ios/20161206/18297.html
以上琉用,希望其他人能少踩坑吧hhh