-
效果
QQ20210104-175404.gif
-
核心思路
首先UIScrollView嵌套核心就是一个scrollView滑动 另一个停止。其ScrollView必须是允许多手势的
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
-
描述
一个底图 一个子图 比作A和B A和B都是继承UIScrollView
image.png
1)首先实现滑动B联动A一起向上滑动
2)滑动一定位置A不能滑动B可以滑动
3)滑动B到顶部继续向下滑动则继续带动A滑动
A允许多手势
继承BaseScrollView,BaseScrollView允许多手势
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
滑动B联动A
属性 初始化是NO 子视图不能滑动来实现滑动
@property(nonatomic,assign)BOOL canScroll;
- (void)initializationScrollProperty
{
self.canScroll = NO;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (self.canScroll == NO) {
[scrollView setContentOffset:CGPointZero];
}
}
设置临界点
滑动B联动A(滑动A)到一定位置允许B滑动,临界点(大于等于临界点不能滑动NO,小于临界点可以滑动)
属性
@property(nonatomic,assign)BOOL canScroll;
初始化
- (void)initializationScrollProperty
{
self.canScroll = YES;
}
核心代码:监听A滑动某个位置通知B可以滑动了
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
//设置临界点
CGFloat maxContentOffsetY = 180;
if (self.canScroll) {
if (ceil(scrollView.contentOffset.y) >= ceil(maxContentOffsetY)) {
self.canScroll = NO;
NSLog(@"不可以滑动 发送通知到顶通知");
[[NSNotificationCenter defaultCenter]postNotificationName:@"arriveTop" object:nil];
} else {
self.canScroll = YES;
NSLog(@"可以滑动");
}
} else {
[scrollView setContentOffset:CGPointMake(0, maxContentOffsetY)];
}
}
核心代码:B监听A到了某位置发送的通知
#pragma mark - 滑动模块
- (void)initializationScrollProperty
{
self.canScroll = NO;
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(arriveTop:) name:@"arriveTop" object:nil];
}
- (void)arriveTop:(NSNotification *)notification
{
NSLog(@"接受到到顶通知");
self.canScroll = YES;
}
滑动B 偏移量是负 离开顶部 这个时候B继续联动A滑动 可以向上向下
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (self.canScroll == NO) {
[scrollView setContentOffset:CGPointZero];
} else {
if (scrollView.contentOffset.y < 0) {
self.canScroll = NO;
NSLog(@"离开顶部...发通知");
[[NSNotificationCenter defaultCenter]postNotificationName:@"leaveTop" object:nil];
}
}
}
核心代码:A监听B离开顶部
#pragma mark - 滑动模块
- (void)initializationScrollProperty
{
self.canScroll = YES;
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(leaveTop:) name:@"leaveTop" object:nil];
}
- (void)leaveTop:(NSNotification *)notification
{
NSLog(@"接收到离开顶部通知");
self.canScroll = YES;
}
完整代码
- 子控制器
<UIScrollViewDelegate>
@property(nonatomic,strong)UIScrollView *mainView;
@property(nonatomic,assign)BOOL canScroll;
#pragma mark - 滑动模块
- (void)initializationScrollProperty
{
self.canScroll = NO;
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(arriveTop:) name:@"arriveTop" object:nil];
}
- (void)arriveTop:(NSNotification *)notification
{
self.canScroll = YES;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (self.canScroll == NO) {
[scrollView setContentOffset:CGPointZero];
self.mainView.showsVerticalScrollIndicator = NO;
} else {
if (scrollView.contentOffset.y < 0) {
self.canScroll = NO;
[[NSNotificationCenter defaultCenter]postNotificationName:@"leaveTop" object:nil];
}
self.mainView.showsVerticalScrollIndicator = YES;
}
}
#pragma mark - lazy懒加载
- (UIScrollView *)mainView
{
if (!_mainView) {
UIScrollView *view = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, self.width, self.height)];
[self addSubview:view];
view.delegate = self;
view.showsVerticalScrollIndicator = NO;
_mainView = view;
}
return _mainView;
}
- 主控制器
<UIScrollViewDelegate>
@property(nonatomic,strong)BaseScrollView *mainView;
@property(nonatomic,assign)BOOL canScroll;
#pragma mark - 滑动模块
- (void)initializationScrollProperty
{
self.canScroll = YES;
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(leaveTop:) name:@"leaveTop" object:nil];
}
- (void)leaveTop:(NSNotification *)notification
{
self.canScroll = YES;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
//设置临界点
CGFloat maxContentOffsetY = self.sellerView.height;
if (self.canScroll) {
if (ceil(scrollView.contentOffset.y) >= ceil(maxContentOffsetY)) {
self.canScroll = NO;
[[NSNotificationCenter defaultCenter]postNotificationName:@"arriveTop" object:nil];
} else {
self.canScroll = YES;
}
self.mainView.showsVerticalScrollIndicator = YES;
} else {
[scrollView setContentOffset:CGPointMake(0, maxContentOffsetY)];
self.mainView.showsVerticalScrollIndicator = NO;
}
}
#pragma mark - lazy懒加载
- (UIView *)bgView
{
if (!_bgView) {
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, kTopHeight, WIDTH, HEIGHT - kTopHeight)];
[self.view addSubview:view];
view.backgroundColor = [UIColor ColorGradientType:ColorGradientTypeVertical andWithSize:view.size andWithColors:@[(__bridge id)rgba(51, 63, 110, 1).CGColor,(__bridge id)rgba(28, 34, 64, 1).CGColor]];
UIImageView *iv = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, view.width, 399*ADAPTER_WIDTH)];
[view addSubview:iv];
iv.image = [UIImage getPNGimageInBundleWithName:@"Tender_main_2"];
_bgView = view;
}
return _bgView;
}
网友评论