UIScrollView的一些属性

本文详细介绍了如何在表格视图中实现滚动视图的自定义滚动效果,包括拉伸放大图片、内容偏移量的计算与控制、页面控制等功能。通过实例代码展示了滚动视图的多种使用场景,如循环滚动、拖拽结束后的处理等。文章旨在为开发者提供滚动视图的高级应用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0 headerView的拉伸效果  在tableview中

    _headView.frame=CGRectMake(0, 0, Screen_Width, Screen_Width*0.75);




-(void)scrollViewDidScroll:(UIScrollView *)scrollView

{

    float scrollViewY=  scrollView.contentOffset.y;

    if (scrollViewY<-Screen_Width*0.75) {

        _headView.frame=CGRectMake(0, 0, Screen_Width, -scrollViewY);

    }else{

        _headView.frame=CGRectMake(0, -scrollViewY- Screen_Width*0.75, Screen_Width, Screen_Width*0.75);

    }

    

}





1.srollViewDidScrollView

图片有拉伸放大效果

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    if (scrollView == self.scrollView) {

        CGPoint point = scrollView.contentOffset;

        //向下会是负的

        NSLog(@"*****%f",point.y);

        if (point.y < -15) {

            CGAffineTransform newTransform =

            CGAffineTransformScale(self.userBackImageView.transform1.007,1.007);

            [self.userBackImageView setTransform:newTransform];

            

        }else {

            

          [UIView animateWithDuration:0.5 animations:^{

               self.userBackImageView.frame = CGRectMake(00ScreenSize.width240);

          }];

        }

    }

}

 

 

2. scrollViewDidEndDragging

_tableView用scrollView的刷新方法

//结束拖拽

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

{

    //判断向上偏移量是否超过20,超过则刷新

    //偏移量contentoffSet+视图当前大小的高(也可以说是当前屏幕大小Height)>视图实际大小的高contentSize+20

    if (scrollView.contentOffset.y+scrollView.frame.size.height>scrollView.contentSize.height+20&&_isUpRefresh==YES) {

        [self pullUpRefresh];

    }

}

 

3.UIScrollView的小玩法

 

- (void)viewDidLoad {

    [super viewDidLoad];

    self.view.backgroundColor=[UIColor whiteColor];

    _scrollView=[[UIScrollView alloc]initWithFrame:CGRectMake(2520032448)];

    _scrollView.backgroundColor=[UIColor lightGrayColor];

    _scrollView.contentSize=CGSizeMake(32448*12);

    _scrollView.layer.masksToBounds=YES;

    _scrollView.layer.cornerRadius=24;

    [self.view addSubview:_scrollView];

    _backView=[[UIView alloc]initWithFrame:CGRectMake(0032448*12)];

    NSArray *contentArr=@[@"大家好,终于平安到达....",@"今天吃了一家牛排,肥瘦均匀",@"刚到机场准备前往市区...",@"准备肥家,大家旅行愉快!",@"附近中国大使馆在哪?",@"我在外面看夜景,好美哟!",@"没时间了,准备直接免税店",@"今天天气不错",@"还是习惯吃中餐",@"注意安全,保护好钱包",@"我早就从酒店出发啦",@"大家下一站准备去哪?"];

    //NSLog(@"%ld",contentArr.count);

    for (int i=0; i<10; i++) {

        UIView *view=[[UIView alloc]initWithFrame:CGRectMake(048*i, 32448)];

        view.backgroundColor=[UIColor clearColor];

        UIImageView *imageView=[[UIImageView alloc]initWithFrame:CGRectMake(573434)];

        imageView.backgroundColor=[UIColor colorWithRed:arc4random()%255/256.0 green:arc4random()%255/256.0 blue:arc4random()%255/256.0 alpha:1];

        imageView.layer.masksToBounds=YES;

        imageView.layer.cornerRadius=17;

        [view addSubview:imageView];

        

        

        UILabel *chatLabel=[[UILabel alloc]initWithFrame:CGRectMake(55025048)];

        chatLabel.text=contentArr[arc4random()%11+1];

        chatLabel.textColor=[UIColor redColor];

        chatLabel.font=[UIFont systemFontOfSize:13];

        [view addSubview:chatLabel];

        [_backView addSubview:view];

    }

    [_scrollView addSubview:_backView];

    

    

    

    _timer=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(UIViewMove) userInfo:nil repeats:YES];

    [_timer setFireDate:[NSDate distantPast]];

}

-(void)UIViewMove

{

    CGRect frame=_backView.frame;

    NSLog(@"%f",frame.origin.y);

    if (frame.origin.y==-48*10) {

        frame.origin.y=0;

        _backView.frame=frame;

    }

    else

    {

        frame.origin.y-=48;

        [UIView animateWithDuration:0.5 animations:^{

            _backView.frame=frame;

        }];

    }

}

4.基本概念

   

    //对滚动方向加锁 YES:滚动时 只允许一个方向能够滚动(水平或垂直方向 只允许一个)

    //NO 允许多个方向同时产生滚动效果

    _scrollView.directionalLockEnabled = YES;

 

//设置滚动区域

    //算出总行数

    NSInteger totalRow = arr.count/3 + (arr.count%3 ==0 ? 0:1);

    _scorllView.contentSize = CGSizeMake(_scorllView.frame.size.width, (space+150)*totalRow);

 

 

UIPageControl:继承自UIControl.事件驱动型控件

    _pCtl = [[UIPageControl alloc]initWithFrame:CGRectMake(10_sv.frame.origin.y + _sv.frame.size.height + 1030010)];

    //1.设置总页数

    _pCtl.numberOfPages = 4;

    //2.设置当前页码

    _pCtl.currentPage = 0;

 

//3.设置当前页码的颜色

    _pCtl.currentPageIndicatorTintColor = [UIColor redColor];

    //4.设置未选中的页码的颜色

    _pCtl.pageIndicatorTintColor = [UIColor yellowColor];

 [self.view addSubview:_pCtl];

 

 

//pageControl 触发的函数

- (void)pageClick:(UIPageControl *)pageControl {

    

    //获取当前的页码pageControl.currentPage;

    

    

    //这时要修改滚动视图的内容偏移量 滚动视图的内容就会滚动

    //[_scrollView setContentOffset:CGPointMake(_scrollView.frame.size.width*pageControl.currentPage, 0) animated:YES];

    //滚动到指定的可视子视图的范围

    [_scrollView scrollRectToVisible:CGRectMake(_scrollView.frame.size.width*pageControl.currentPage0_scrollView.frame.size.width_scrollView.frame.size.heightanimated:YES];

}

#pragma mark - UIScrollViewDelegate

//当滚动视图减速停止的时候 修改页码指示器的页码

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    //减速停止之后 获取滚动视图内容偏移量

    CGPoint offset = scrollView.contentOffset;

    //计算出当前页码:水平内容偏移量/滚动视图的宽度

    UIPageControl *page = (UIPageControl *)[self.view viewWithTag:101];

    page.currentPage = offset.x/scrollView.frame.size.width;

}

/*

 - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated;

 - (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated;

 //当用代码调用 上面两个方法并且开启动画效果 下面协议的方法才会调用

 */

 

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {

    NSLog(@"滚动视图 改变偏移量 滚动动画结束");

}

 

5.代理协议

//常用1

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {

    //返回滚动视图的第一张子视图 可以进行缩放

    return scrollView.subviews[0];

}

//只要滚动视图滚动 就会调用的方法

//常用2

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

   // NSLog(@"正在滚动:%@",NSStringFromSelector(_cmd));

//    //内容偏移量

//    NSLog(@"offset :%@",NSStringFromCGPoint(scrollView.contentOffset));

}

//常用3

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {

    NSLog(@"将要拖拽的时候调用:%@",NSStringFromSelector(_cmd));

}

//常用4

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {

    NSLog(@"将要结束拖拽(手指拖拽离开)调用:%@",NSStringFromSelector(_cmd));

}

//常用5

//已经结束 拖拽调用

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {

    NSLog(@"已经结束拖拽%@",NSStringFromSelector(_cmd));

}

//常用6

//手指离开屏幕 减速开始的时候调用

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {

    NSLog(@"减速开始:%@",NSStringFromSelector(_cmd));

}

//常用7

//减速 到停止(静止) 的时候调用 ()

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    NSLog(@"减速停止:%@",NSStringFromSelector(_cmd));

}

 

/*

 //是否可以滚动到滚动视图顶部(点击状态栏的时候)

 _scrollView.scrollsToTop = YES; YES 的时候下面的方法才会有效

 */

- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView {

    NSLog(@"滚动到滚动视图的顶部");

}

/*

 _scrollView.scrollsToTop = YES;下面的方法才有效

 */

//代理来控制 点击状态栏是否可以 滚动到顶部

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView {

    return YES;//NO不可以 YES 可以

}

//将要开始缩放的时候调用

- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view {

    NSLog(@"%@",NSStringFromSelector(_cmd));

}

 

//缩放结束的

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {

    NSLog(@"%@",NSStringFromSelector(_cmd));

}

 

//缩放的时候调用 变形

- (void)scrollViewDidZoom:(UIScrollView *)scrollView {

    NSLog(@"缩放%@",NSStringFromSelector(_cmd));

}

 

5.循环滚动

- (void)creatScrollView {

    _scrollView = [[UIScrollView allocinitWithFrame:self.view.bounds];

    

    //粘贴图片 实现循环滚动

    // 1 2 3 4 5  第五张 再向后切换  应该切换第一张

    //这时 我们需要准备7张图片

    //并排 显示  5  1  2 3 4 5 1

    for (int i = 0; i < 7; i++) {

        NSString *path = nil;

        if (i == 0) {//

            path = [[NSBundle mainBundlepathForResource:@"5" ofType:@"jpg"];

        }else if (i == 6){

            path = [[NSBundle mainBundlepathForResource:@"1" ofType:@"jpg"];

        }else {

            path = [[NSBundle mainBundlepathForResource:[NSString stringWithFormat:@"%d",i] ofType:@"jpg"];

        }

        UIImage *image = [UIImage imageWithContentsOfFile:path];

        UIImageView *imageview = [[UIImageView allocinitWithFrame:CGRectMake(_scrollView.frame.size.width*i, 0_scrollView.frame.size.width_scrollView.frame.size.height)];

        imageview.image = image;

        //粘贴到滚动视图

        [_scrollView addSubview:imageview];

        [imageview release];

    }

    //设置内容 滚动范围

    _scrollView.contentSize = CGSizeMake(_scrollView.frame.size.width*7_scrollView.frame.size.height);

    _scrollView.showsHorizontalScrollIndicator = NO;

    _scrollView.showsVerticalScrollIndicator = NO;

    _scrollView.bounces = NO;

    //设置内容偏移量 偏移到实际的第一张

    _scrollView.contentOffset = CGPointMake(_scrollView.frame.size.width0);

    //按页滚动

    _scrollView.pagingEnabled = YES;

    //设置代理

    _scrollView.delegate = self;

    [self.view addSubview:_scrollView];

}

//当减速停止的时候 来进行判断是否偏移量移动到了 第0张或者第6张

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    // 5  1  2 3 4 5 1

    //获取当前的偏移量

    CGPoint offset = scrollView.contentOffset;

    if (offset.x == 0) {//判断水平方向的偏移量 是否是第0张

        //修改偏移量 使移动到 实际的第5张

        scrollView.contentOffset = CGPointMake(5*scrollView.frame.size.width0);

    }else if(offset.x == 6*scrollView.frame.size.width) {//或者 第6张

        //修改偏移量 移动到实际的第1张

        //不带动画的修改

        scrollView.contentOffset =CGPointMake(1*scrollView.frame.size.width0);

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值