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]]; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?