iOS基础控件之 图片浏览器

知识准备:

UIbutton 和UIimageview的异同:

相同点:》 都能显示图片

不同点:》 UIButton默认情况就能监听点击事件,而UIImageView默认情况下不能

      》 UIButton可以在不同状态下显示不同的图片

        》 UIButton既能显示文字,又能显示图片

如何选择:》 UIButton:需要显示图片,点击图片后需要做一些特定的操作

》 UIImageView:仅仅需要显示图片,点击图片后不需要做任何事情

NSArray和NSDictionary的使用:

当图片内容非常多时,“根据index来设置内容”的代码就不具备扩展性,要经常改动

为了改变现状,可以考虑讲图片数据线保存到一个数组中,数组中有序地放着很多字典,一个字典代表一张图片数据,包含了图片名、图片描述 @property (strong, nonatomic) NSArray *images;

“懒加载”\”延迟加载”

由于只需要初始化一次图片数据,因此放在get/set方法中初始化/调用

将属性放在get方法中初始化的方式,称为“懒加载”\”延迟加载”

什么是Plist文件

》 直接将数据直接写在代码里面,不是一种合理的做法。如果数据经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低

》 因此,可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据。如果要变动数据,直接修改数据文件即可,不用修改代码

》 一般可以使用属性列表文件存储NSArray或者NSDictionary之类的数据,这种属性列表文件的扩展名是plist,因此也称为“Plist文件”

功能分析

》点击箭头切换序号、图片、描述

》如果是首张图片,左边箭头不能点击

》如果是尾张图片,右边箭头不能点击

步骤分析

》搭建UI界面

》监听按钮点击

》切换序号、图片、描述

程序实现

//
//  kViewController.m
//  图片浏览器
//
//  Created by Kengsir on 15-1-8.
//  Copyright (c) 2015年 ___FULLUSERNAME___. All rights reserved.
//
//
#import "kViewController.h"
#define  kicon @"icon"
#define  kdesc @"desc"

@interface kViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *iconView;
@property (weak, nonatomic) IBOutlet UILabel *noLabel;
@property (weak, nonatomic) IBOutlet UILabel *descLabel;
@property (weak, nonatomic) IBOutlet UIButton *leftbtn;
@property (weak, nonatomic) IBOutlet UIButton *rightbtn;

- (IBAction)right;
- (IBAction)left;

//一般对象用strong,控件用weak
@property (assign,nonatomic)int index;
@property (strong,nonatomic) NSArray *array;
@end

@implementation kViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self changeData];
}

//延迟加载数据,将属性放在get方法中初始化的方式,称为懒加载
-(NSArray *)array{
    if(_array ==nil){//从未初始化过
        //初始化数据
        NSMutableDictionary *image1 = [NSMutableDictionary dictionary];
        image1[kicon] = @"biaoqingdi";
        image1[kdesc] = @"表情帝";

        NSMutableDictionary *image2 = [NSMutableDictionary dictionary];
        image2[kicon] = @"wangba";
        image2[kdesc] = @"王八";

        NSMutableDictionary *image3 = [NSMutableDictionary dictionary];
        image3[kicon] = @"wangba";
        image3[kdesc] = @"王八";
        //快速创建数组,将字典放入数组
        self.array = @[image1,image2,image3];
    }
    return _array;
}

//程序的扩展性要好
-(void)changeData{

    //1. 改变数据
    self.noLabel.text = [NSString stringWithFormat:@"%d/%d",self.index + 1 , self.array.count];
    //2.根据数组index 取出 对应的字典数据
    NSDictionary *imagedict = self.array[self.index];
    NSLog(@"%@",imagedict);
    //3.设置图片
    //NSString *name = imagedict[kicon];
    self.iconView.image = [UIImage imageNamed:imagedict[kicon]];
    //4.设置描述
    self.descLabel.text = imagedict[kdesc];

    //改变按钮判断状态
//    if(self.index == 0){
//        self.leftbtn.enabled = NO;
//    }else {
//        self.leftbtn.enabled = YES;
//    }
//    if(self.index == 1){
//        self.rightbtn.enabled = NO;
//    }else {
//        self.rightbtn.enabled = YES;
//    }
    self.leftbtn.enabled = (self.index == 0)?NO:YES;

    self.rightbtn.enabled = (self.index != self.array.count - 1);
}

- (IBAction)right{
    self.index ++ ;
    [self changeData];

}
- (IBAction)left {
    self.index --;
    [self changeData];

}
@end

效果截图:

优化:使用plist存储数据

  

通过代码来解析Plist文件中的数据
获得Plist文件的全路径
NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [bundle pathForResource:@"imageData" ofType:@"plist"];

改写本来写死的初始化数据的get方法用来加载plist文件
_images = [NSArray arrayWithContentsOfFile:path];

- (NSArray *)images
{
    if (_images == nil) {
        NSBundle *bundle = [NSBundle mainBundle];
        NSString *path = [bundle pathForResource:@"imageData" ofType:@"plist"];
        _images = [NSArray arrayWithContentsOfFile:path];
    }
    return _images;
}
时间: 2024-08-01 23:24:24

iOS基础控件之 图片浏览器的相关文章

[iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)

A.概述 在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能 1.按钮点击后,显示为“已下载”,并且不可以再按 2.在屏幕中间弹出一个消息框,通知消息“xx已经被安装”,慢慢消失 3.消息框样式为圆角半透明 B.不使用代理模式,使用app空间组和主View之间的父子View关系 1.在主View中创建一个消息框 主View控制器:ViewController.m 1 // 创建下载成功消息框 2 CGFloat labelWid

iOS基础控件UINavigationController中的传值

iOS基础控件UINavigationController中的传值,代理传值,正向传值,反向传值 #import <UIKit/UIKit.h> //声明一个协议 @protocol SendValue<NSObject> //定义一个方法 - (void)sendBtnTitle:(NSString *)title; @end @interface FirstViewController : UIViewController // 定义代理 @property (nonatomi

ios基础控件之开关按钮(UISwitch)

UISwitch控件是iOS开发的基础控件,是非常简单的一个控件,因为它的方法比较少.UISwitch继承于UIControl基类,因此可以当成活动控件使用. 注意:开关状态通过它的on属性进行读取,该属性是一个BOOL属性 创建: UISwitch* mySwitch = [[ UISwitch alloc]initWithFrame:CGRectMake(0.150.0f,100.0f,0.0f,0.0f)]; 可能你会疑问为什么它的大小都设置为0?没错,它的大小你设置是无效的,系统会为你分

[iOS基础控件 - 5.2] 查看大图、缩放图片代码(UIScrollView制作)

原图: 900 x 1305   拖曳滚动: 缩放:       主要代码: 1 // 2 // ViewController.m 3 // ImageZoom 4 // 5 // Created by hellovoidworld on 14/11/28. 6 // Copyright (c) 2014年 hellovoidworld. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 @interface

iOS 基础控件(下)

上篇介绍了UIButton.UILabel.UIImageView和UITextField,这篇就简短一点介绍UIScrollView和UIAlertView. UIScrollView 顾名思义也知道这个是和滚动相关的控件,在Android开发时遇到过ScrollView,当内容的尺寸超出了屏幕范围之后,用ScrollView则可以通过滚动的方式使得超出屏幕的那部分内容通过滚动的方式显示出来,在Android里面有水平的ScrollView和垂直的ScrollView,在iOS里面就只有一个S

[iOS基础控件 - 6.9] 聊天界面Demo

A.需求 做出一个类似于QQ.微信的聊天界面 1.每个cell包含发送时间.发送人(头像).发送信息 2.使用对方头像放在左边,我方头像在右边 3.对方信息使用白色背景对话框,我方信息使用蓝色背景对话框 4.隐藏相同的发送时间 5.底部功能按钮:语音按钮.消息输入框.表情按钮.附加按钮 6.响应键盘事件,呼出键盘.隐藏键盘时对上述的视图作出上移操作 7.键盘的发送事件处理 B.实现点 1.底层视图搭建 上部分聊天信息框:UITableView 下部分功能区:UIButton 信息输入框使用无边框

[iOS基础控件 - 6.10.2] PickerView 自定义row内容 国家选择Demo

A.需求 1.自定义一个UIView和xib,包含国家名和国旗显示 2.学习row的重用 B.实现步骤 1.准备plist文件和国旗图片 2.创建模型 1 // 2 // Flag.h 3 // CountriesSelection 4 // 5 // Created by hellovoidworld on 14/12/16. 6 // Copyright (c) 2014年 hellovoidworld. All rights reserved. 7 // 8 9 #import <Foun

[iOS基础控件 - 7.0] UIWebView

A.基本使用 1.概念 iOS内置的浏览器控件 Safari浏览器就是通过UIWebView实现的 2.用途:制作简易浏览器 (1)基本请求 创建请求 加载请求 (2)代理监听webView加载,例如提示正在加载 (3)前进.后退 使用NavigationController,在底部加上导航栏(勾选showToolBar),加上回退和前进按钮 (4)给顶部导航栏加上地址栏 UISearchBar 代理监听“搜索”按钮,提取地址栏文本 1 // 2 // ViewController.m 3 //

iOS基础控件之UISegmentedControl

***UISegmentedControl控件是iOS中比较常用的控件,作为一个iOS手机设备屏幕,一下子放多个UIButton,显然感觉不到美观,作为一个不妥协追求卓越的乔帮主肯定不愿意,所以设计出该控件,以满足平时的需求.*** NSArray *segmentedArray=[[NSArray alloc]initWithObjects:@"一",@"二",@"三",@"四",nil]; 创建UISegmentedCon