蘑菇街商品详情布局

效果图
bg.gif

1,整体上是一个大的tableview,但是主要是下面的部分,如果第二部分不能左右滑动的话,还是比较好实现的,在第二部分的区头加3个按钮,然后点击切换不同的数据就行了,但是第二个区如果是3个不同的tableview的话,就是外部tableview上面再加tableview,那么上层tableview 就会拦截滑动事件,导致下层的tableview 无法接受到事件了。

首先自定义一个tableview让它实现下面这个方法,返回yes的话,那么它上层的tableview的滑动事件它就能接收到了,
 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer   shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}

2,第二重点就是:如果仔细观察两个tableview的滑动事件的话,你就知道,外部的tableview滑动的时候,内嵌的tableview是不动的,内嵌的tableview滑动的时候,外部的tabbleview是不动的。因为内外两个tableview都能响应滑动事件,所以要让它们在不同情况下滑动,而两者的切换时靠的通知,判断条件就是自定义的3个切换按钮部分是否接触到导航条的位置。

外部tableview在创建的时候会注册一个通知:
- (void)viewDidLoad {
[super viewDidLoad];
self.automaticallyAdjustsScrollViewInsets = NO;
[self.view addSubview:self.tableView];
self.title = @"商品详情";
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(acceptNotify:) name:@"TheExternalScroll" object:nil];

  }
 接受到内部tableview 发来的通知,判断该不该滑动。 
-(void)acceptNotify:(NSNotification * )notify{
NSString * canScroll =  notify.userInfo[@"canScroll"];
if ([canScroll isEqualToString:@"1"]) {
// 内嵌scroll 通知 外部scroll可以滑动了
    _canScroll = YES;
   }
}
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
CGFloat tabOffsetY = [self.tableView rectForSection:1].origin.y;
NSLog(@"tabOffsetY = %lf",tabOffsetY);
CGFloat offsetY = scrollView.contentOffset.y;
_scrollToBottom = _scrollToTop;
if (offsetY>=tabOffsetY) {
// 刚好第二部分的顶部接触到导航条的地步了, 外部的table 固定偏移量,
    scrollView.contentOffset = CGPointMake(0, tabOffsetY);
    _scrollToTop = YES;
}else
{
    _scrollToTop = NO;
}
if (_scrollToTop != _scrollToBottom) {
    if (!_scrollToBottom && _scrollToTop) {
// 滑到顶部了,通知内嵌table ,可以滑动了,
        [[NSNotificationCenter defaultCenter] postNotificationName:@"TheInsideScroll" object:nil userInfo:@{@"canScroll":@"1"}];
//  自己不能滑动了
        _canScroll = NO;
    }
    if (_scrollToBottom && !_scrollToTop) {
        if (!_canScroll) {
            scrollView.contentOffset = CGPointMake(0, tabOffsetY);
        }
    }
}
}

3,因为内嵌3个tableview,所以让它们继承同一个tableview,在根tableview,处理滑动逻辑。

初始化的注册两个通知。
-(instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
    
    self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height) style:0];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    [self addSubview:self.tableView];
//        外部table 发来的通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(acceptNotihy:) name:@"TheInsideScroll" object:nil];
//        内嵌的table 离开顶部时的通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(acceptNotihy:) name:@"TheExternalScroll" object:nil];
}
return self;
}

-(void)acceptNotihy:(NSNotification *)notify
{
if ([notify.name isEqualToString:@"TheInsideScroll"]) {
//        外部table 发来的通知
    NSString * canScroll = notify.userInfo[@"canScroll"];
    if ([canScroll isEqualToString:@"1"]) {
        _canScroll = YES;
        self.tableView.showsHorizontalScrollIndicator = YES;
    }
}else if ([notify.name isEqualToString:@"TheExternalScroll"])
{
//        内嵌table 发来的通知
    self.tableView.contentOffset = CGPointZero;
    _canScroll = NO;
    self.tableView.showsHorizontalScrollIndicator = NO;        
}
}
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
if (!_canScroll) {
    [scrollView setContentOffset:CGPointZero];
}
CGFloat offsetY = scrollView.contentOffset.y;
if (offsetY<0) {
//        内嵌的table到顶了;通知外面的table滑动;
    [[NSNotificationCenter defaultCenter] postNotificationName:@"TheExternalScroll" object:nil userInfo:@{@"canScroll":@"1"}];
}
}

这种布局模式好多APP里面都会有,还有滑动时候导航条透明效果,其实微博的个人主页也可以这么实现。
Demo地址:https://github.com/zdq1179169386/-Demo
另外淘宝的分屏显示的,
Demo:https://github.com/zdq1179169386/taobaoProductDetail

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,614评论 4 59
  • 酷听听书《有一种节约是“浪费”》本书作者从所见所闻的小事娓娓道来,找出被你忽视的生活误区,告诉你如何科学节约,如何...
    酷听听书阅读 398评论 0 0
  • 找个放弃的理由 最近一个很恼人的问题困绕着吴洁的大脑:他真的爱我吗?他爱我什么呢?于是她在夜深人静时就想这个问题,...
    我是岸阅读 599评论 3 12
  • 2月28号晚上20:30。跟Spenser老师学写作(第一堂课)正式开课,历时约一小时,但其中讲述的内容却不是一小...
    野生顽主阅读 1,713评论 2 21