使用串行线程实现图片瀑布流加载

2024-06-07 21:18

本文主要是介绍使用串行线程实现图片瀑布流加载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

.h文件

typedef NS_ENUM(NSInteger, LowerList) {Left = 1,Right = 2
};@interface VC_AddStoryModel : UIViewController
{UIScrollView *scroll;LowerList lower;CGFloat viewsWidth;UIView *leftView;CGFloat leftHeight;UIView *rightView;CGFloat rightHeight;BOOL firstPicture;
}

.h文件

- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.self.view.backgroundColor = [UIColor whiteColor];{viewsWidth = ScreenWidth / 2;firstPicture = YES;scroll = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 64, ScreenWidth, ScreenHeight - 64)];scroll.contentSize = CGSizeMake(ScreenWidth, ScreenHeight);scroll.backgroundColor = [UIColor whiteColor];[self.view addSubview:scroll];leftView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, viewsWidth, 0)];rightView = [[UIView alloc]initWithFrame:CGRectMake(SCREENWIDTH / 2, 0, viewsWidth, 0)];[scroll addSubview:leftView];[scroll addSubview:rightView];scroll.backgroundColor = [UIColor yellowColor];}[self layoutImage];}
- (void)layoutImage {NSArray* urls = @[@"http://img0.bdstatic.com/img/image/shouye/leimu/mingxing.jpg",@"http://img1.bdstatic.com/img/image/8662934349b033b5bb5c55e5d9834d3d539b700bcce.jpg",@"http://img.baidu.com/img/image/3bf33a87e950352a5947ae485143fbf2b2.jpg",@"http://imgstatic.baidu.com/img/image/7af40ad162d9f2d3cdc19be8abec8a136227cce1.jpg",@"http://imgstatic.baidu.com/img/image/weimeiyijing0207.jpg",@"http://e.hiphotos.baidu.com/image/w%3D400/sign=2e56c8010ed79123e0e095749d355917/ae51f3deb48f8c5470385d2638292df5e1fe7fd4.jpg",@"http://c.hiphotos.baidu.com/image/w%3D400/sign=e37cc47c6509c93d07f20ff7af3cf8bb/7a899e510fb30f2468cc6271ca95d143ad4b0369.jpg",@"http://b.hiphotos.baidu.com/image/w%3D400/sign=ac0b8e2b92ef76c6d0d2fa2bad17fdf6/a71ea8d3fd1f4134dedc5974271f95cad0c85ed4.jpg",@"http://imgstatic.baidu.com/img/image/huacaozhiwu0207.jpg",@"http://d.hiphotos.baidu.com/image/w%3D400/sign=7d27c75af4246b607b0eb374dbf81a35/5882b2b7d0a20cf4f28367d674094b36acaf99ac.jpg",];dispatch_queue_t queue = dispatch_queue_create("get image", DISPATCH_QUEUE_SERIAL);for (int i = 0; i < 100; i++) {__block  UIImage *image;@synchronized(scroll) {dispatch_async(queue, ^{NSString *imageUrl = urls[i % 10];NSURL *url = [NSURL URLWithString:imageUrl];NSData *data = [NSData dataWithContentsOfURL:url];image = [UIImage imageWithData:data];});dispatch_async(queue, ^{dispatch_async(dispatch_get_main_queue(), ^{[self makePictuerVisible:image];});});}}
}- (void)makePictuerVisible:(UIImage *)image {lower = [self checkList];CGFloat width = viewsWidth;CGFloat height = width * image.size.height / image.size.width;UIImageView *picture = nil;switch (lower) {case Left:{picture = [[UIImageView alloc]initWithFrame:CGRectMake(0, leftView.frame.size.height, width, height)];leftView.frame = CGRectMake(leftView.frame.origin.x, leftView.frame.origin.y, viewsWidth, leftView.frame.size.height + height);[leftView addSubview:picture];}break;case Right:picture = [[UIImageView alloc]initWithFrame:CGRectMake(0, rightView.frame.size.height, width, height)];rightView.frame = CGRectMake(rightView.frame.origin.x, rightView.frame.origin.y, viewsWidth, rightView.frame.size.height + height);[rightView addSubview:picture];break;default:break;}picture.image = image;if (Left == [self checkList]) {[scroll setContentSize:CGSizeMake(ScreenWidth, rightView.frame.size.height + 1)];} else {[scroll setContentSize:CGSizeMake(ScreenWidth, leftView.frame.size.height + 1)];}NSLog(@"%f   %f",scroll.contentSize.height, scroll.contentSize.width);
}
- (LowerList)checkList {LowerList temp;if (firstPicture) {temp = Left;firstPicture = NO;} else {leftHeight = leftView.frame.size.height;rightHeight = rightView.frame.size.height;if (leftHeight > rightHeight) {temp = Right;} else {temp = Left;}}return temp;
}
- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}

实现的效果是顺序把图片添加进界面

这篇关于使用串行线程实现图片瀑布流加载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040320

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者