美丽说蘑菇街首页效果(UITableView和UIScrollerView联动)

作为一名菜鸟iOS开发程序员,第一次写文章,有点小激动!进入正题,最近项目中有个需求,类似美丽说蘑菇街首页效果,在网上找了一些资料后自己研究了下终于搞定了!


先看效果:

                                                             


接下来详细的介绍下:

先说下布局层次结构:

                                                         

图层结构大概就是这样的,这个简单,再说下思路:

1、要实现的效果是:当头部的蓝色View全部显示时,下面的TableView可以下拉,最底层的红色ScrollerView不能向下滑动,当向上滑动时,由于黄色菜单View未到达顶部,TableView此时不能滑动,底部的ScrollerView向上滑动,当黄色菜单View到达顶部时,底部的ScrollerView不能再继续向上滑动,此时TableView向上滑动

2、难点:如何让TableView和ScrollerView滑动和不滑动  怎么控制?很多人说用 ScrollerView.scrollEnabled = NO;

当你上下滑动时手指并没有抬起,经过试验这个方法无效。还有就是,当你滑动TableView时,下面的ScrollerView如何响应滑动手势?


直接上代码吧:

#import <UIKit/UIKit.h>@interface ZXWScrollerView : UIScrollView@end

#import "ZXWScrollerView.h"@implementation ZXWScrollerView- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {return YES;
}@end

自定义一个ScrollView类(最底层的ScrollerView继承该类),重写上面的方法  这个代码的意思是:当ScrollerView上的View有手势响应时,继续向下传递,这样当你滑动TableView时,下方的ScrollerView就会接收到该手势


继续看代码

首先创建下方的TableView的ViewControllerView

#import <UIKit/UIKit.h>@protocol oneDelegate <NSObject>-(void)oneDelegateDidScrollerToBottom:(UIScrollView*)scrView;@end@interface OneViewController : UIViewController
@property (nonatomic,weak) id <oneDelegate>delegate;
@property (nonatomic,strong)UITableView *tableView;
@property (nonatomic, assign) BOOL canScroll;
@end

#import "OneViewController.h"
static NSString *const kGoTopNotificationName = @"goTop";//进入置顶命令
static NSString *const kLeaveTopNotificationName = @"leaveTop";//离开置顶命令
@interface OneViewController ()<UITableViewDelegate,UITableViewDataSource>
{NSMutableArray *mutarr;
}@end@implementation OneViewController- (void)viewDidLoad {[super viewDidLoad];_tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height-50-64)];[self.view addSubview:_tableView];_tableView.delegate = self;_tableView.dataSource = self;mutarr = [[NSMutableArray alloc]init];for (int i = 0 ; i<30; i++) {[mutarr addObject:[NSString stringWithFormat:@"哈哈哈哈哈哈%d",i]];}[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(acceptMsg:) name:kGoTopNotificationName object:nil];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(acceptMsg:) name:kLeaveTopNotificationName object:nil];//其中一个TAB离开顶部的时候,如果其他几个偏移量不为0的时候,要把他们都置为0
}-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{return mutarr.count;
}-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];if (cell==nil) {cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];}cell.textLabel.text = mutarr[indexPath.row];return cell;
}-(void)acceptMsg : (NSNotification *)notification{//NSLog(@"%@",notification);NSString *notificationName = notification.name;if ([notificationName isEqualToString:kGoTopNotificationName]) {NSDictionary *userInfo = notification.userInfo;NSString *canScroll = userInfo[@"canScroll"];if ([canScroll isEqualToString:@"1"]) {self.canScroll = YES;self.tableView.showsVerticalScrollIndicator = YES;}}else if([notificationName isEqualToString:kLeaveTopNotificationName]){self.tableView.contentOffset = CGPointZero;self.canScroll = NO;self.tableView.showsVerticalScrollIndicator = NO;}
}- (void)scrollViewDidScroll:(UIScrollView *)scrollView{if (!self.canScroll) {[scrollView setContentOffset:CGPointZero];}CGFloat offsetY = scrollView.contentOffset.y;if (offsetY<0) {[[NSNotificationCenter defaultCenter] postNotificationName:kLeaveTopNotificationName object:nil userInfo:nil];[self.delegate oneDelegateDidScrollerToBottom:scrollView];}
}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}/*
#pragma mark - Navigation// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {// Get the new view controller using [segue destinationViewController].// Pass the selected object to the new view controller.
}
*/@end


接着就是重点了  ViewController

#import <UIKit/UIKit.h>@interface ViewController : UIViewController@end

//
//  ViewController.m
//  111111
//
//  Created by ZXW on 2016/11/18.
//  Copyright © 2016年 ZXW. All rights reserved.
//#import "ViewController.h"
#import "ZXWScrollerView.h"
#import "OneViewController.h"
static NSString *const kGoTopNotificationName = @"goTop";//进入置顶命令
static NSString *const kLeaveTopNotificationName = @"leaveTop";//离开置顶命令
@interface ViewController ()<oneDelegate,UIScrollViewDelegate>
@property (nonatomic,strong) ZXWScrollerView *BtmScrollerView;
@property (nonatomic,strong) UIView          *headView;
@property (nonatomic,strong) UIScrollView    *MidScrollerView;
@property (nonatomic,strong) OneViewController *vc1;
@property (nonatomic,strong) OneViewController *vc2;
@property (nonatomic,strong) OneViewController *vc3;@property (nonatomic,assign)BOOL BtmCanScrollerLast;
@property (nonatomic,assign)BOOL BtmCanScrollercurrent;
@property (nonatomic, assign) BOOL canScroll;
@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];
//    self.automaticallyAdjustsScrollViewInsets = YES;self.edgesForExtendedLayout = NO;_BtmScrollerView = [[ZXWScrollerView alloc]initWithFrame:self.view.frame];[self.view addSubview:_BtmScrollerView];_BtmScrollerView.backgroundColor = [UIColor redColor];_BtmScrollerView.delegate = self;_BtmScrollerView.showsVerticalScrollIndicator = NO;_BtmScrollerView.contentSize = CGSizeMake(self.view.frame.size.width, self.view.frame.size.height+150+64) ;_headView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 150)];[_BtmScrollerView addSubview:_headView];UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 100, self.view.frame.size.width, 50)];view.backgroundColor = [UIColor orangeColor];[_headView addSubview:view];_headView.backgroundColor = [UIColor blueColor];_MidScrollerView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 150, self.view.frame.size.width, self.view.frame.size.height)];_MidScrollerView.backgroundColor = [UIColor whiteColor];[_BtmScrollerView addSubview:_MidScrollerView];_MidScrollerView.pagingEnabled = YES;_MidScrollerView.contentSize = CGSizeMake(self.view.frame.size.width*3, self.view.frame.size.height);_vc1 = [[OneViewController alloc]init];_vc1.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height-50);[_MidScrollerView addSubview:_vc1.view];_vc1.delegate = self;_vc1.view.backgroundColor = [UIColor colorWithRed:(arc4random()%256)/255.0 green:(arc4random()%256)/255.0 blue:(arc4random()%256)/255.0 alpha:1];[self addChildViewController:_vc1];_vc2 = [[OneViewController alloc]init];_vc2.view.frame = CGRectMake(self.view.frame.size.width, 0, self.view.frame.size.width, self.view.frame.size.height-50);_vc2.delegate = self;[_MidScrollerView addSubview:_vc2.view];_vc2.view.backgroundColor = [UIColor colorWithRed:(arc4random()%256)/255.0 green:(arc4random()%256)/255.0 blue:(arc4random()%256)/255.0 alpha:1];[self addChildViewController:_vc2];_vc3 = [[OneViewController alloc]init];_vc3.view.frame = CGRectMake(2*self.view.frame.size.width, 0, self.view.frame.size.width, self.view.frame.size.height-50);_vc3.delegate = self;[_MidScrollerView addSubview:_vc3.view];_vc3.view.backgroundColor = [UIColor colorWithRed:(arc4random()%256)/255.0 green:(arc4random()%256)/255.0 blue:(arc4random()%256)/255.0 alpha:1];[self addChildViewController:_vc3];_canScroll = YES;
}-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{//当前的偏移量CGFloat height = scrollView.contentOffset.y;
//    NSLog(@"%f", scrollView.contentOffset.y);if (height<100) {_BtmCanScrollercurrent = YES;}if (height>=100) {scrollView.contentOffset = CGPointMake(0, 100);_BtmCanScrollercurrent = NO;}if (_BtmCanScrollercurrent  != _BtmCanScrollerLast) {if (!_BtmCanScrollerLast && _BtmCanScrollercurrent) {NSLog(@"离开顶部");//要离开定不时只有当tableview偏移量小于或等于0时才可以滑动   否则设置为1if (!_canScroll) {scrollView.contentOffset = CGPointMake(0, 100);}}if (!_BtmCanScrollercurrent && _BtmCanScrollerLast) {NSLog(@"到达顶部");[[NSNotificationCenter defaultCenter] postNotificationName:kGoTopNotificationName object:nil userInfo:@{@"canScroll":@"1"}];_canScroll = NO;}}_BtmCanScrollerLast = _BtmCanScrollercurrent;
}-(void)oneDelegateDidScrollerToBottom:(UIScrollView *)scrView
{_canScroll = YES;
}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}@end


还是解释下吧  ScrollerView滑动时会调用-(void)scrollViewDidScroll:(UIScrollView *)scrollView这个方法  如果你不想ScrollerView滑动,那么就把偏移量设置为0,

[scrollView setContentOffset:CGPointZero];

至于什么时候滑动,什么时候不滑动,代码里面写的很清楚了,这里面的逻辑当然还可以优化的,有兴趣的朋友可以研究下,如果有不正确的地方请大家指正!



第一次写博客,纯手打!累~~~~,不喜勿喷!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/352213.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】Nginx 优化与防盗链

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Nginx 优化与防盗链 一、隐藏版本号方法一&#xff1a;修改配置文件方式方法二&#xff1a;修改源码文件&#xff0c;重新编译安装 二、修改用户与组三、缓存时间四、日志切割…

操作系统的最强入门科普(Unix/Linux篇)

今天这篇文章&#xff0c;我们来聊聊操作系统&#xff08;Operating System&#xff09;。 说到操作系统&#xff0c;大家都不会陌生。我们天天都在接触操作系统——用台式机或笔记本电脑&#xff0c;使用的是windows和macOS系统&#xff1b;用手机、平板电脑&#xff0c;则是a…

PDF文件无法编辑怎么办

PDF文件无法编辑是因为设置了编辑限制&#xff0c;只要在设置密码的地方输入密码把密码取消就可以自由编辑文件了。如果不知道密码或者忘记了密码&#xff0c;只能使用第三方的解密软件把密码解除掉&#xff0c;现在有很多PDF的辅助软件&#xff0c;可以在网上搜到很多&#xf…

SpringBoot实现服务器PDF文件的下载和预览功能

&#x1f345;程序员小王的博客&#xff1a;程序员小王的博客 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 如有编辑错误联系作者&#xff0c;如果有比较好的文章欢迎分享给我&#xff0c;我会取其精华去其糟粕 &#x1f345;java自学的学习…

PDF文件不能编辑,有什么办法能够解决?

PDF文件打开之后发现不能编辑&#xff0c;很有可能是因为PDF文件设置了限制编辑。一般来说&#xff0c;想要解决问题&#xff0c;我们只需要将PDF编辑限制解除就可以了 但是大家有时候可能是不知道PDF密码的&#xff0c;那么在不知道PDF密码的情况下&#xff0c;如何解决不能编…

java利用itext编辑pdf

最近项目需要,在调研如何在pdf中增加标识字样,用来区分版本.最后确定用itext来实现 . itext的官网是:http://www.itextpdf.com/ 代码如下: Java代码 /** * authory kingviker * time : 2012-12-12 */ import java.io.FileOutputStream; import java.io.IOExcepti…

java设置pdf不可编辑_禁止编辑,但允许在Java iText / PDF中进行页面提取

我正在使用iText生成PDF文件 . 我想禁止编辑PDF&#xff0c;但允许读者提取页面 . 这是我设置加密的代码&#xff1a; writer.setEncryption(null, null, 0xffffffff, PdfWriter.STANDARD_ENCRYPTION_128); 第三个参数指定权限 . 我正在使用0xffffffff而不是单独的iText标志ALL…

HTML5 PDF 编辑,pdf.js的使用与改造

一、前期准备 1.1 需求描述 1.想让各个浏览器能显示服务器存放的PDF文件(主要是手机的浏览器) 2.想让项目结构如下:lib目录存放pdf.js等依赖文件,src存放要显示的pdf文件 想要的项目结构 3.这样我就可以将这个项目放到我网站的任何目录下,比如放到PDF或者别的文件夹下 PDF目…

如何免费编辑PDF文档?

我们都知道PDF文档不像Word文档一样可以直接编辑修改&#xff0c;想要编辑PDF文档&#xff0c;我们就需要借助专业的PDF编辑器。今天小编就给大家推荐一款可以免费编辑PDF文档的工具“金闪PDF编辑器”。 金闪PDF编辑器是一款功能齐全的强大的PDF工具&#xff0c;目前有移动端安…

PDF文件编辑并去除水印

我相信很多博友肯定被这个问题烦恼过&#xff0c;并且当初我自己也因为这个事情熬的掉了好几根头发&#xff0c;这件事就是PDF文件编辑过后会留下很严重的水印&#xff0c;并且无法除去&#xff0c;想去除就得花钱购买会员&#xff0c;想白嫖都没有办法&#xff0c;接下来我就为…

怎么编辑PDF文件?分享三种好用的编辑方法

怎么编辑PDF文件中的内容呢&#xff1f;大家在日常使用PDF文件的过程中肯定遇到过需要编辑文件的需求&#xff0c;因为我们不能保证每个文件中的内容都不会出错&#xff0c;问题是PDF文件不容易改动&#xff0c;我们怎么做才能够编辑PDF文件呢&#xff1f;不用着急&#xff0c;…

如何编辑PDF文件?编辑PDF的方法有哪些?

PDF文件是一种广泛使用的文档格式&#xff0c;通常用于共享和阅读文档&#xff0c;如电子书、报告、合同等。但是&#xff0c;有时候您可能需要编辑PDF文件。编辑PDF文件可能听起来很困难&#xff0c;但是有许多方法可以轻松地编辑PDF文件。本文将探讨几种最常见的编辑PDF文件的…

PDF编辑:Adobe Acrobat X Pro 官方原版下载+中文汉化补丁

Adobe在10月份发布了新一代Acrobat X软件家族&#xff0c;其中包括PDF创建编辑软件Acrobat X Pro,因为Acrobat X Pro是Acrobat Pro 9.0的后续版本&#xff0c;故也有人称其为Acrobat Pro 10.0。虽然Aodbe Acrobat X Pro正式版发布许久了&#xff0c;但Acrobat X Pro 简体中文版…

Windows系统下的PDF编辑工具软件-PDF编辑器下载

PDF编辑器是一款Windows系统下的PDF编辑工具软件&#xff0c;它支持修改编辑PDF文件并向PDF添加文字、擦除内容、插入图片、绘制直线、加椭圆框、加矩形框和旋转PDF等功能。PDF编辑器可以让您在PDF文件的任何位置添加文字、删除内容、加图片或进行其他编辑&#xff0c;简单的如…

JVM学习笔记二

1. JVM内存参数 要求 熟悉常见的 JVM 参数&#xff0c;尤其和大小相关的 堆内存&#xff0c;按大小设置 解释&#xff1a; -Xms 最小堆内存&#xff08;包括新生代和老年代&#xff09; -Xmx 最大堆内存&#xff08;包括新生代和老年代&#xff09; 通常建议将 -Xms 与 -…

【6.05 代随_48day】 打家劫舍、打家劫舍 II、打家劫舍 III

打家劫舍、打家劫舍 II、打家劫舍 III 打家劫舍1.方法图解步骤代码 打家劫舍 II1.方法代码 打家劫舍 III图解步骤代码 打家劫舍 力扣连接&#xff1a;198. 打家劫舍&#xff08;中等&#xff09; 1.方法 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i]&am…

go 并发/并行/协程/sync锁读写锁

下面来介绍几个概念&#xff1a; 进程/线程&#xff1a; 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。线程是进程的一个执行实体&#xff0c;是 CPU 调度和分派的基本单位&#xff0c;它是比进程更小的能独立运行的基本单位。一…

易点易动打通财务系统,打破数据孤岛,实现固定资产的账实一致

固定资产管理涉及资产的采购、验收、账务处理、折旧管理等全流程,同时也牵涉到财务系统和资产系统两大信息孤岛。这两个系统之间数据不互通,导致资产的账实信息无法同步,无法真正实现资产管理的账实一致。 固定资产系统作为固定资产管理的业务系统,负责资产的采购申请、验收入…

【ECCV2022】DaViT: Dual Attention Vision Transformers

DaViT: Dual Attention Vision Transformers, ECCV2022 解读&#xff1a;【ECCV2022】DaViT: Dual Attention Vision Transformers - 高峰OUC - 博客园 (cnblogs.com) DaViT&#xff1a;双注意力Vision Transformer - 知乎 (zhihu.com) DaViT: Dual Attention Vision Trans…

计算机右上角无法搜索,win10系统,文件夹右上角的搜索栏点击无反应,无法输入怎么办?...

具体方法如下&#xff1a; 1、在win10系统上按winR键打开运行原版win10系统下载&#xff0c;输入regedit&#xff0c;如下图所示&#xff1a; 2、打开注册表之后原版win10系统下载&#xff0c;点击HKEY_LOCAL_MACHINE&#xff0c;如下图所示&#xff1a; 3、然后依次点击“HKEY…