#import "ViewController.h"

 @interface ViewController ()

 @property (retain, nonatomic) NSArray *pic;
@property (assign, nonatomic) NSInteger index;
@property (weak, nonatomic) IBOutlet UILabel *lblIndex;
@property (weak, nonatomic) IBOutlet UILabel *lblTitle;
@property (weak, nonatomic) IBOutlet UIImageView *picture;
- (IBAction)nextPicture:(id)sender;
@property (weak, nonatomic) IBOutlet UIButton *btnnext; - (IBAction)lastPicture:(id)sender;
@property (weak, nonatomic) IBOutlet UIButton *btnLast; @end
@implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
//让第一个图片显示出来,所以先调用一次
[self nextPicture:nil];
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
} // 重写pic属性get方法---懒加载数据
- (NSArray *)pic
{ /*
写代码加载picture.plist文件中的数据到_pic;
1.获取picture.plist文件的路径
ps:[NSBundle mainBundle]获取这个app安装到手机上时的根目录
然后在根目录下搜索picture.plist文件路径
*/
if (_pic == nil) {
NSString *string = [[NSBundle mainBundle] pathForResource:@"picture" ofType:@".plist"];
NSArray *array = [NSArray arrayWithContentsOfFile:string];
//NSLog(@"%@",array); _pic = array; }
return _pic;
} - (IBAction)nextPicture:(id)sender {
//1.让索引自加
_index++;
//2.从数组中获取当前这张图片的数据
NSDictionary *dict = self.pic[self.index-];
//3.把获取到得数据设置给界面上的控件
self.lblIndex.text = [NSString stringWithFormat:@"%ld/%ld",self.index,self.pic.count];
//4.通过image属性来设置图片框里面的图片
self.picture.image =[UIImage imageNamed: dict[@"picture"]]; self.lblTitle.text = dict[@"title"];
//设置“下一张”按钮是否可以点击
self.btnnext.enabled =( _index != self.pic.count);
//设置“上一张”按钮是否可以点击
self.btnLast.enabled =( _index- != ); } - (IBAction)lastPicture:(id)sender {
_index--;
NSDictionary *dict = self.pic[self.index-];
self.lblIndex.text = [NSString stringWithFormat:@"%ld/%ld",self.index,self.pic.count];
self.picture.image =[UIImage imageNamed: dict[@"picture"]];
self.lblTitle.text = dict[@"title"]; self.btnLast.enabled =( _index- != );
self.btnnext.enabled =( _index != self.pic.count);
}
@end

开发思路:

1.完成基本功能

2.考虑性能

(1)(初始化操作,可以直接调用change进行)

(2)因为要控制序号和图片两个变量,所以考虑使用字典代替掉switch

(3)每次点击,字典都需要创建一次,效率地下,可以考虑创建的这部分拿到初始化方法中去,这样就只需要创建一次就ok了。

(4)考虑缺点(对代码的顺序要求极其严格)

(5)懒加载(需要的时候才加载,那么什么时候是需要的时候,及调用get方法的时候)

(6)每次都来一下?效率低下—》只有第一次调用get方法时为空,此时实例化并建立数组,其他时候直接返回成员变量(仅仅执行一次)

注意点:

1.方法的调用堆栈(顺序)。

2.使用plist:让数据的操作更加灵活,把数据弄到外面去,解除耦合性,让耦合性不要太强。实际上是一个xml,是苹果定义的一种特殊格式的xml。

3.bundle-包(只读)

二、Tomcat简单实现(吃小鸟)

 - (IBAction)eatBird:(id)sender {

     [self startAnimating: picName:@"cat_eat"];
} - (void)startAnimating:(int)count picName:(NSString *)picName
{
// 如果当前图片框正在执行动画,那么直接return,什么也不做
if (self.imageViewCat.isAnimating) {
return;
}
// 1.加载图片到数组中
NSMutableArray *array = [NSMutableArray array];
for (int i=; i<count; i++) {
// 拼接图片名称
NSString *imagName = [NSString stringWithFormat:@"%@%04d.jpg",picName,i];
/*
根据图片名称加载图片
通过imageNamed:这种方式加载图片,加载好的图片会一直保存写在内存中,不会释放。
优点:下次如果再使用同样的图片时就不需要重新加载了,因为内存也已有
缺点:如果加载大量的图片,那么这些图片会一直保存在内存中,导致应用程序占用内存过大(这叫缓存)
//UIImage *imageCat = [UIImage imageNamed:imagName];
*/ // 解决:换一种加载图片的方式,不需要使用缓存
// 获取图片完整的路径
NSString *path = [[NSBundle mainBundle] pathForResource:imagName
ofType:nil];
// 这里的参数不能传递图片名称了,这里需要传递图片的完整路径
UIImage *imageCat = [UIImage imageWithContentsOfFile:path]; // 把图片加载到数组中
[array addObject:imageCat];
}
// 2.设置图片的UIImageView(图片框)的animationimage属性
self.imageViewCat.animationImages = array;
// 3.设置动画持续时间
self.imageViewCat.animationDuration = self.imageViewCat.animationImages.count * 0.1; // 4.设置动画是否重播
self.imageViewCat.animationRepeatCount = ;
// 5.开启动画
[self.imageViewCat startAnimating]; /*
清空图片集合
这样写的问题是,当动画启动以后,动画还没有执行,就已经让图片集合清空了,也就是说
self.imageViewCat.animationImages里面已经没有图片了,所以动画就不执行了。
self.imageViewCat.animationImages = nil;
想法:需要延迟一段时间执行,当动画执行完毕后再清空这些图片
*/ //设置图片框在调用setAnimationImages:nil方法的时候延迟执行
[self.imageViewCat performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:self.imageViewCat.animationImages.count*0.1];
}

iOS-UI篇—简单的浏览器查看程序和Tomcat简单实现的更多相关文章

  1. iOS开发UI篇—简单的浏览器查看程序

    iOS开发UI篇—简单的浏览器查看程序 一.程序实现要求 1.要求 2. 界面分析 (1) 需要读取或修改属性的控件需要设置属性 序号标签 图片 图片描述 左边按钮 右边按钮 (2) 需要监听响应事件 ...

  2. iOS开发UI篇——简单的浏览器查看程序

    一.程序实现要求 1.要求 2. 界面分析 (1) 需要读取或修改属性的控件需要设置属性 序号标签 图片 图片描述 左边按钮 右边按钮 (2) 需要监听响应事件的对象,需要添加监听方法 左边按钮 右边 ...

  3. iOS开发UI篇—Date Picker和UITool Bar控件简单介绍

    iOS开发UI篇—Date Picker和UITool Bar控件简单介绍 一.Date Picker控件 1.简单介绍: Date Picker显示时间的控件 有默认宽高,不用设置数据源和代理 如何 ...

  4. iOS开发UI篇—使用picker View控件完成一个简单的选餐应用

    iOS开发UI篇—使用picker View控件完成一个简单的选餐应用 一.实现效果 说明:点击随机按钮,能够自动选取,下方数据自动刷新. 二.实现思路 1.picker view的有默认高度为162 ...

  5. ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局

    本文转自 :http://www.cnblogs.com/wendingding/p/3761730.html ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布 ...

  6. IOS UI篇—UILabel的文字顶部对齐

    UILabel的文字顶部对齐 NOV 20TH, 2011 默认UILabel是垂直居中对齐的,如果你的UILabel高度有多行,当内容少的时候,会自动垂直居中. 如下图所示(图片来自stackove ...

  7. 查看程序占用tomcat内存情况

    近期,公司线上tomcat常常无缘无辜宕机.总结了一下定位问题的方法,仅供參考: 报错信息: Maximum number of threads (200) created for connector ...

  8. iOS开展UI一片—简单的浏览器观看节目

    iOS开发UI篇-简单的浏览器查看程序 一.程序实现要求 1.要求 2. 界面分析 (1) 须要读取或改动属性的控件须要设置属性 序号标签 图片 图片描写叙述 左边button 右边button (2 ...

  9. iOS开发UI篇—UIScrollView控件介绍

    iOS开发UI篇—UIScrollView控件介绍 一.知识点简单介绍 1.UIScrollView控件是什么? (1)移动设备的屏幕⼤大⼩小是极其有限的,因此直接展⽰示在⽤用户眼前的内容也相当有限 ...

随机推荐

  1. ”MySQL查询优化“学习总结

    查询优化有几种方法,下面分别介绍. 切分查询 一条大的语句(涉及很多行)一次会锁住很多数据(不利于高并发). 占满整个事务日志,耗尽系统资源.阻塞很多小的但很重要的查询. 分解关联查询 关联查询分解方 ...

  2. 04: 打开tornado源码剖析处理过程

    目录:Tornado其他篇 01: tornado基础篇 02: tornado进阶篇 03: 自定义异步非阻塞tornado框架 04: 打开tornado源码剖析处理过程 目录: 1.1 torn ...

  3. RAM,ROM,NAND Flash,NOR Flash(A)

    他们四者相互独立 RAM掉电易失数据: RAM又分两种,一种是静态RAM,SRAM:一种是动态RAM,DRAM.前者的存储速度要比后者快得多,我们现在使用的内存一般都是动态RAM. DDR是Doubl ...

  4. bzoj 2118 墨墨的等式 - 图论最短路建模

    墨墨突然对等式很感兴趣,他正在研究a1x1+a2y2+…+anxn=B存在非负整数解的条件,他要求你编写一个程序,给定N.{an}.以及B的取值范围,求出有多少B可以使等式存在非负整数解. Input ...

  5. 日志统计|2018年蓝桥杯B组题解析第八题-fishers

    标题:日志统计 小明维护着一个程序员论坛.现在他收集了一份"点赞"日志,日志共有N行.其中每一行的格式是: ts id 表示在ts时刻编号id的帖子收到一个"赞" ...

  6. 怎么在VS监视DataSet类型的数据

    旧版本 先监视DataSet,打开dataset,dataset下面有一个tablesTables打开有一个非公共成员,然后下面有一个List,List中存储了每一张表的信息 下图所示的List下面的 ...

  7. UVa 1605 联合国大楼

    https://vjudge.net/problem/UVA-1605 题意:有n个国家,要求设计一栋楼并为这n个国家划分房间,要求国家的房间必须连通,且每两个国家之间必须有一间房间是相邻的. 思路: ...

  8. LR学习资料

    http://ajita.iteye.com/blog/1728243/ 选择哪种方式录制,有以下参考原则: 1 基于浏览器的应用程序推荐使用HTML-based Script 2 不是基于浏览器的应 ...

  9. jquery扩展的两个方法与区别 $.extend $.fn.extend

    jQuery.extend:Query本身的扩展方法 jQuery.fn.extent(Object) jquery 所选对象扩展方法 jQuery.extend 我们先把jQuery看成了一个类,这 ...

  10. linux 多进程fork

    对于父进程,fork函数返回了子程序的进程号,而对于子程序,fork函数则返回零,这样,对于程序,只要判定fork函数的返回值,就知道自己是处于父进程还是子进程中.