界面結構是這樣的
界面結構
實現效果是兼容底部sceollView左右滑動和內部cell側滑操作
通過scrollView的手勢代理來兼容table的手勢
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
if (([otherGestureRecognizer.view isKindOfClass:NSClassFromString(@"UITableViewWrapperView")]) && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
CGPoint p = [otherGestureRecognizer locationInView:otherGestureRecognizer.view ];
if (self.otherGestureRecognizerSimultaneously && p.x >= SCREEN_WIDTH-SCREEN_WIDTH/375*50) {
return YES;
}
}
return NO;
}
附帶pop手勢兼容
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
if ([otherGestureRecognizer.view isKindOfClass:NSClassFromString(@"UILayoutContainerView")]) {
if (otherGestureRecognizer.state == UIGestureRecognizerStateBegan && self.contentOffset.x == 0) {
return YES;
}
}
return NO;
}
這是iOS11之前的做法,iOS11 的UITableView的調整感覺還滿多的,自少目前遇到的情況是這樣,對于cell的側滑兼容需要做一點小改動
cell手勢判斷條件調整
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
//UITableViewCell 自定義手勢可能要在此處自行定義
static Class kUIPanGestureRecognizer, kUITableView;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
kUIPanGestureRecognizer = [UIPanGestureRecognizer class];
if (@available(iOS 11.0, *)) {
kUITableView = NSClassFromString(@"UITableView");
} else {
kUITableView = NSClassFromString(@"UITableViewWrapperView");
}
});
//self.otherGestureRecognizerSimultaneously 啟用其它手勢
if (self.otherGestureRecognizerSimultaneously && [otherGestureRecognizer isKindOfClass:kUIPanGestureRecognizer] && [otherGestureRecognizer.view isKindOfClass:kUITableView]) {
CGPoint p = [otherGestureRecognizer locationInView:otherGestureRecognizer.view];
CGFloat w = CGRectGetWidth(otherGestureRecognizer.view.bounds);
if (p.x >= w - 50) {
return YES;
}
// if (p.x <= 50) {
// return YES;
// }
}
return NO;
}
這樣cell的側滑操作就能夠正常兼容iOS11了。
以上代碼只是粗略處理滑動沖突,需要精確可根據p的位置對對應cell(【bool CGRectContainsPoint(CGRect rect, CGPoint point)】)進行側滑事件判斷處理。