此篇是用來記錄工程開發(fā)過程中遇到的一系列問題的颅停,在以后遇到類似問題還會更新的喲~
第一種
類似微信朋友圈功能,如下圖:
需求分析:整體布局為tableView,每個cell上有0~9張圖片师枣,圖片九宮格布局,點擊圖片放大萧落,點擊除圖片的部分響應cell的點擊事件践美。一般的做法是把放圖片的部分單獨封出來(用collocationView、view都可以)找岖,我用了封View的方法來放這些圖片(上圖中綠色的部分)陨倡。氮素,會有一個問題许布,就是我們要討論的問題兴革,比如圖中顯示的情況,圖片一行排不滿有空缺的地方時蜜唾,點擊是沒有反應的杂曲,原因是因為封出來的這個View攔截了點擊事件(View以外的地方是正常的)。所以我們要做的是讓事件可以穿透這部分空白的區(qū)域袁余,去響應cell的點擊事件擎勘。
解決方法:
1、給collocationView或者View添加手勢颖榜,很笨的方法但是可以解決棚饵,廢話不多說強勢上代碼:
UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tgrTouch)];
tgr.delegate = self;
[self.collectView addGestureRecognizer:tgr];
- (void)tgrTouch{
//跳轉(zhuǎn)操作
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
// 輸出點擊的view的類名煤裙,則不截獲Touch事件
NSLog(@"%@", NSStringFromClass([touch.view class]));
if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
// 備注,我的collectionCell上是UIImageView
if ([NSStringFromClass([touch.view class]) isEqualToString:@"UIImageView"]) {
return NO;
}
}
return YES;
}
2噪漾、第二種就是重寫點擊事件的響應鏈硼砰,就是hitTest方法。讓事件跳過UICollectionView/View傳遞到tableview的cell欣硼。
使用UICollectionView時题翰,在tableviewCell里添加hitTest方法,代碼如下:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *view = [super hitTest:point withEvent:event];
if ([view isKindOfClass:[UICollectionView class]]) {
return self;
}
return [super hitTest:point withEvent:event];
//return self.super;
}
使用View時分别,在View里添加hitTest方法遍愿,代碼如下:
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
UIView *view = [super hitTest:point withEvent:event];
if (view == self) {
return self.superview;
}else
return view;
}
至此,完美解決耘斩,其主要的思想就是:不想讓某一View響應次事件的時候沼填,通過響應時間連給到View的superView,當然括授,View的subView接受事件時不算View接受坞笙。
第二種
先上圖(原諒我的布局low~ 謝謝~~)
需求分析:整體布局為tableView,每個cell上有N張圖片荚虚,圖片橫向流水線布局薛夜,多圖時可以滑動以顯示后面圖片,點擊響應cell的事件版述。比上面的那種情況多了個可以滑動梯澜,可以用tableView、scrollView來實現(xiàn)渴析。又氮素晚伙,tableView/scrollView又攔截了點擊事件,tableView可以用上面的問題解決俭茧,scrollView貌似就GG了咆疗,scrollView要不響應點擊事件,又要響應滑動事件母债,這個就要涉及到UITouch事件了午磁,區(qū)分一下是點擊還是滑動。OK毡们,用tableView的同學們可以試試上面的方法迅皇,下面重點說用scrollView的方法。
解決方法:
scrollView自身要響應滑動事件衙熔,又要不響應點擊事件喧半。所以得區(qū)分Touch手勢,重寫scrollView自己的UITouch事件青责。上代碼上代碼上代碼:
1挺据、自定義個scrollView,繼承 UIScrollView
// .h文件
#import <UIKit/UIKit.h>
@interface RRTableViewCellScrollView : UIScrollView
@end
// .m文件
#import "RRTableViewCellScrollView.h"
#import "RRTableViewCell.h"
@implementation RRTableViewCellScrollView
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
RRTableViewCell * cell = (RRTableViewCell *)self.superview;
[cell touchesBegan:touches withEvent:event];
}
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
RRTableViewCell * cell = (RRTableViewCell *)self.superview;
[cell touchesEnded:touches withEvent:event];
}
@end
2脖隶、然后tableViewCell里使用這個RRTableViewCellScrollView對象扁耐,正常使用即可,完美解決~
情況結束产阱,以后有類似問題繼續(xù)分享婉称,歡迎同學們來討論O(∩_∩)O~