Just a little smile ^ ^

yoyo_zeng

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  112 随笔 :: 3 文章 :: 0 评论 :: 10万 阅读
复制代码
CGSize imageSize = [UIImage imageNamed:@"s2_1.png"].size;
    for (int i=0; i<10; ++i) {
        UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"s2_%d.png", i+1]];
        UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
        imageView.frame = CGRectMake(imageSize.width * i,self.m_scrollView.bounds.size.height/2-imageSize.height/2, imageSize.width, imageSize.height);
        [self.m_scrollView addSubview:imageView];
    }
    
    self.m_scrollView.contentSize = CGSizeMake(imageSize.width*10, self.m_scrollView.bounds.size.height);
    self.m_scrollView.scrollEnabled = YES;
    self.m_scrollView.pagingEnabled = NO;  //是否整页滑动
    self.m_scrollView.bounces = YES; //碰到边框时是否反弹
    self.m_scrollView.showsHorizontalScrollIndicator = NO; //显示滚动条
复制代码

从你的手指touch屏幕开始,scrollView开始一个timer,如果:

1.  150ms内如果你的手指没有任何动作,消息就会传给subView。

2.  150ms内手指有明显的滑动(一个swipe动作),scrollView就会滚动,消息不会传给subView,这里就是产生问题二的原因。

3. 150ms内手指没有滑动,scrollView将消息传给subView,但是之后手指开始滑动,scrollView传送touchesCancelled消息给subView,然后开始滚动。

观察下tableView的情况,你先按住一个cell,cell开始高亮,手不要放开,开始滑动,tableView开始滚动,高亮取消。

 

delaysContentTouches的作用:

这个标志默认是YES,使用上面的150ms的timer,如果设置为NO,touch事件立即传递给subView,不会有150ms的等待

 

cancelsTouches的作用:

这个标准默认为YES,如果设置为NO,这消息一旦传递给subView,这scroll事件不会再发生。

 

 

内存:

初始化如果load所有图片,则内存过大,

所有通过复用,当imageview 滑动出screen,则移动位置到最后或者最后一个位置,同时调整载入图像

复制代码
 //如果最左边view出了左边框,将view放到最右边
    UIImageView *view = [imageStore objectAtIndex:0];
    
    if (view.frame.origin.x + view.frame.size.width < offset) {
        [imageStore removeObject:view];
        UIImageView *lastView = [imageStore lastObject];
        view.frame = CGRectMake(lastView.frame.origin.x+lastView.frame.size.width, view.frame.origin.y, view.frame.size.width, view.frame.size.height);
        [imageStore addObject:view];
        
    }
    
    //如果最右边view出了左边框,将view放到最右边,imageStore中为包含所有image view array
    view = [imageStore lastObject];
    if (view.frame.origin.x > offset+self.frame.size.width) {
        [imageStore removeObject:view];
        UIImageView *firstView = [imageStore objectAtIndex:0];
        view.frame = CGRectMake(firstView.frame.origin.x-firstView.frame.size.width, view.frame.origin.y, view.frame.size.width, view.frame.size.height);
        [imageStore insertObject:view atIndex:0];
    }
    
    for (int i = 0; i < imageStore.count; i++) {
        UIImageView *view = [imageStore objectAtIndex:i];

        //设置图片
        int currentView = view.frame.origin.x/_itemSize.width+1;
        currentView = currentView%_imageAry.count;
        
        //_imageAry为图片array
        [view setImage:[_imageAry objectAtIndex:currentView]];
        
    }
复制代码

 

 

posted on   yoyo_zeng  阅读(358)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
点击右上角即可分享
微信分享提示