总体布局
uitableview + uiview(设备视图),借用tableview滚动特性实现平滑滚动
tableview使用[_tableView setContentInset:UIEdgeInsetsMake(deviceHeight, 0, 0, 0)]; //tableview内容偏移,使设备显示
- 将设备视图显示,在滚动时设备视图置于tableview之下,因此滚动时能实现遮盖功能
- 设备视图在未滚动时,置于tableview之上,以便视图上各按键能正常响应。
//在scrollviewdidScroll协议中
if (self.homeNormalRunView.alpha < 0.95) {
[self bringSubviewToFront:self.tableView];
}else{//使设备图至于顶部,点击能响应
[self bringSubviewToFront:self.homeNormalRunView];
}
- 设置tableview属性pageenable=yes,实现翻页
当设备视图上面有按钮需要响应时,由于tableview在设备视图上层,造成无法响应按钮,上面方法能解决按钮响应问题。但是也会造成新问题,在设备视图层上滑时,不再响应翻页效果。实际需求是两者都需要兼顾。
既然有小缺陷,那我们就改,想到的方案有两个
- 一个是在设备视图上增加滑动手势,通过手势事件来响应上滑翻页效果
- 利用事件响应链处理,将事件传递到按钮,滑动继续借用tableview自带功能
利用响应链处理需求在实际开发中使用比较少,因此选择了响应链机制解决问题,顺便再次熟悉下响应链。
将原滚动时调用bringSubviewToFront
删除,增加- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
方法。 最终修改代码如下
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if (_homeNormalRunView.hidden || _homeNormalRunView.alpha < 0.1 || !_homeNormalRunView.userInteractionEnabled) { //设备层视图隐藏,不做处理
return [super hitTest:point withEvent:event];
}
NSInteger count = self.homeNormalRunView.subviews.count;
for ( int i = 0; i < count; i++)
{
UIView* subView = self.homeNormalRunView.subviews[i];
if ([subView isKindOfClass:[UIButton class]]) { //找出所有button按钮,如点击满足button响应,事件传递到button
if (subView.hidden || subView.alpha < 0.1 || !subView.userInteractionEnabled) {
continue;
}
//进行坐标转化
CGPoint coverPoint = [self convertPoint:point toView:_homeNormalRunView];
BOOL inside = CGRectContainsPoint(subView.frame, coverPoint);
if (inside) {
return subView;
}
}
}
return [super hitTest:point withEvent:event];
}
_homeNormalRunView
为设备视图,找出视图中所有的按钮,进行按键响应。由于上滑后,无需事件传递,因此在方法顶部有return操作,避免滑动后继续点击被干扰
网友评论