在前面, 我们使用一系列的UI控件, 做过一系列的例子练习, 之后我们也将会继续, 而现在我们来做一个美女图片浏览器, 这次我们使用的是storyboard来进行开发, 下面让我们一起来看看:
PS:程序中的图片来自百度, 版权属于百度.
首先我们要搭建storyboard的界面:
这里需要注意一下, 计数器控件要把Wrap勾上:
界面搭建好了之后, 我们需要关联控件的方法以及属性:
关联好之后, 我们来看看代码, 首先我们要设定两个成员变量, 一个是用来存储图片的可变数组, 一个是用来给滑动条使用的索引值:
@interface ViewController ()
{
// 滑动条需要索引值
NSUInteger _photoIndex;
}
// 存放图片的数组
@property (nonatomic, strong) NSMutableArray *imagesData;
@end
现在我们重点来看看实现的代码了, 我们先来看看夜间模式的开关:
- (IBAction)nightSwitch:(UISwitch *)sender
{
// 设定动画
[UIView animateWithDuration:0.5f animations:^{
if (sender.on) { // 判断开关是否开启, 如果开启就把背景色改成灰色
NSLog(@"夜间模式开启");
[self.view setBackgroundColor:[UIColor grayColor]];
} else { // 如果开关关闭, 就把背景色改成白色
NSLog(@"夜间模式关闭");
[self.view setBackgroundColor:[UIColor whiteColor]];
}
}];
}
PS: 在UISwitch控件里, 有一个属性是专门用来判断开关是on还是off.
@property(nonatomic,getter=isOn) BOOL on;
写完夜间模式的代码后, 记得运行测试一下, 没有Bug之后再去进行下一步, 设置图片数组:
<span style="font-size:12px;">- (void)imageArray
{
// 初始化数组对象
_imagesData = [NSMutableArray array];
for (int i = 0; i < 10; i++)
{
NSString *fileName = [NSString stringWithFormat:@"%d.jpg", i];
UIImage *image = [UIImage imageNamed:fileName];
[_imagesData addObject:image];
}
[_imageView setImage:_imagesData[0]];
_photoIndex = 0;
}
</span>
然后再调用该方法:
- (void)viewDidLoad {
[super viewDidLoad];
[self imageArray];
}
PS:最后一句代码是默认程序一开始就是第0张图片
现在我们来看看计数器的方法:
- (IBAction)stepperChanged:(UIStepper *)sender
{
NSUInteger index = sender.value;
[_imageView setImage:_imagesData[index]];
[_imageSlider setValue:index];
NSLog(@"计数器数值:%f", [sender value]);
}
PS: 这里需要做一个强制转换, 因为valuew是double类型, 而我们设置的数组是unsigned long类型, 所以必须得转.
滑动条的方法:
- (IBAction)sliderChanged:(UISlider *)sender
{
NSLog(@"滑块的数值:%f", [sender value]);
NSUInteger index = sender.value;
if (index != _photoIndex) {
[_imageView setImage:_imagesData[index]];
_photoIndex = index;
NSLog(@"美女换了");
[_imageStepper setValue:_photoIndex];
}
}
PS: 这里的value同样要转换, 否则就没法存入.
进行到这里, 我们已经完成了百分之80%的开发了, 只剩下一个问题没有解决, 那就是图片和图片的标题没有同步, 下面我们需要去解决这个问题:
首先我们要去创建一个plist文件:
然后我们编辑一下plist文件:
在这里我们将要学习一个新的东西, 就是NSBundle, 这个是一个包函数, 在我们iOS程序开发中, 我们所有的应用程序都必须打包后才能上传, 我们打的包必须得有一个文件路径, 现在我们所需要的就是运用这个NSBundle把plist文件导入到我们的应用程序包里, 下面让我们来看看:
- (void)imagePlist
{
// 1.获取主包
NSBundle *bundle = [NSBundle mainBundle];
// 2.获取plist文件的文件名
NSString *path = [bundle pathForResource:@"images" ofType:@"plist"];
// 3.把plist文件读取到数组中
_imagesData = [NSMutableArray arrayWithContentsOfFile:path];
// 4.取出数组中的第一个字典
NSDictionary *dic = _imagesData[6];
// 4.1取出图像名
NSString *imageFile = dic[@"icon"];
UIImage *image = [UIImage imageNamed:imageFile];
[_imageView setImage:image];
// 4.2设置图片的描述
NSString *title = dic[@"title"];
[_imageTitle setText:title];
}
我们来测试一下:
现在我们思考一下, 我们有三个地方需要使用刚刚那一堆代码, 在这样子的情况下, 我们最好把那些方法抽出来, 再另外的重写一个方法来调用, 这样子的方式我们称为代码重构:
- (void)resetPhotoInfoWithIndex:(NSUInteger)index
{
// 1.取出数组中的第一个字典
NSDictionary *dic = _imagesData[index];
// 1.1取出图像名
NSString *imageFile = dic[@"icon"];
UIImage *image = [UIImage imageNamed:imageFile];
[_imageView setImage:image];
// 1.2设置图片的描述
NSString *title = dic[@"title"];
[_imageTitle setText:title];
}
现在我们把所有的代码更新一下:
- (void)imagePlist
{
// 1.获取主包
NSBundle *bundle = [NSBundle mainBundle];
// 2.获取plist文件的文件名
NSString *path = [bundle pathForResource:@"images" ofType:@"plist"];
// 3.把plist文件读取到数组中
_imagesData = [NSMutableArray arrayWithContentsOfFile:path];
[self resetPhotoInfoWithIndex:0];
}
- (IBAction)stepperChanged:(UIStepper *)sender
{
NSUInteger index = sender.value;
[_imageSlider setValue:index];
NSLog(@"计数器数值:%f", [sender value]);
[self resetPhotoInfoWithIndex:index];
}
- (IBAction)sliderChanged:(UISlider *)sender
{
NSLog(@"滑块的数值:%f", [sender value]);
NSUInteger index = sender.value;
if (index != _photoIndex) {
_photoIndex = index;
[self resetPhotoInfoWithIndex:index];
NSLog(@"美女换了");
[_imageStepper setValue:_photoIndex];
}
}
这里需要说明一下重构代码的注意事项:
1. 相同的【代码段】不要重复出现两次;
2. 不要为了重构而重构!!!
3. 如果代码运行正常,同时没有新的修改需求,不要可以去重构!
4. 如果重构的代码,重构完成之后,第一件事情就是测试!以防重构对代码结构造成破坏!
好了, 这次我们就讲到这里, 下次我们继续~~~