Sian 发表于 2014-3-26 22:44:33

ios实战开发之图片展示

本帖最后由 Sian 于 2014-3-27 04:02 编辑

1、直接效果展示:

http://player.youku.com/player.php/sid/XNjkwNTcyMjE2/v.swf

2、基本需求分析:

1、该练习是模拟类似"笑多了会怀孕"这样的图片浏览软件而设计,图片素材来自“笑多了会怀孕”,在此声明并表示感谢;
2、主要为实现几个功能:UISlider控件的使用、UIImageView的使用、plist文件的使用、子View的使用以及图片大小修改等;

3、基本过程描述

1、通过storyboard将面板基本组件布置好,并设置好相关参数,效果如下图所示:



2、一共涉及到两个UIView,两个UISlider,四个UILabel,一个UIImageView,一个UIButton,还有一个UISwitch

3、包含关系为:
UIView{
                UIView{
                              UILabel
                              UISwitch
                              UILabel
                              UISlder
                              }
                UIButton
                UILabel
                UIImageView
                UILabel
                UISlider
                }

4、将storyboard上相关属性与方法都连好线,保证属性及方法前面都是实心点,并且控件上没有多余的连接线:



4、实现相关功能

主要代码及说明

SAViewController.h
//
//SAViewController.h
//ImageShow
//
//Created by yusian on 14-3-27.
//Copyright (c) 2014年 yusian. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface SAViewController : UIViewController

// ImageViewr控件,中间最大的区域,用来显示图片内容
@property (weak, nonatomic) IBOutlet UIImageView *image;

// UILabel控件--显示当前图片张数,以n/m形式展示,如1/16,显示在图片顶端
@property (weak, nonatomic) IBOutlet UILabel *number;

// UILabel控件,图片下方用作图片内容说明
@property (weak, nonatomic) IBOutlet UILabel *imageDesc;

// UIView控件,这是一个子视图,当点击“设置”按钮时弹出的设置面板
@property (weak, nonatomic) IBOutlet UIView *setBoard;

// UISlider控件,滑动条控件,从最左端滑到最右端,可以将图片分别从第一张切换到最后一张
- (IBAction)imageSwitch:(UISlider *)sender;

// UIButton控件,设置按钮,点击该按钮可以弹出设置面板或隐藏设置面板
- (IBAction)setting:(UIButton *)sender;

// UISwitch控件,设置面板中的其中一个功能:“夜间模式”,这是一个开关,打开后将背景调暗,模拟夜间浏览模式,保护眼睛
- (IBAction)nightMode:(UISwitch *)sender;

// UISlider控件,设置面板中的另一个功能,这个滑动条控件用来控件图片展示大小,让图片从30% - 100%进行缩放
- (IBAction)imageSizeChange:(UISlider *)sender;

@end

SAViewController.m
//
//SAViewController.m
//ImageShow
//
//Created by yusian on 14-3-27.
//Copyright (c) 2014年 yusian. All rights reserved.
//

#import "SAViewController.h"

@interface SAViewController ()
{
    // 创建一个全局数组变量用来存放图片描述文字
    NSArray *_imageDescValues;
}

@end

@implementation SAViewController

// 动画方法,实现各种切换的渐变效果,传入两个参数,一个为实际业务代码block,一个为动画时长
- (void)actionAnimationBlock:(void (^)())block animationDourationTime:(double)time
{
    // 动画开始
    ;
   
    // 动画时长,此句可省略,有默认值,为实现不同切换场景有各自的时长加上这句
    ;
   
    // 业务代码块
    block();
   
    // 动画提交
    ;
}

// 初始加载值
- (void)viewDidLoad
{
    // 调用父类初始加载值,加载系统正常运行必需数据
    ;
      
    // 创建一个bundle,并调用bundel的pathForResource方法为在任何环境中都能正确返回plist文件的绝对路径
    NSBundle *bundle = ;
    NSString *path = ;
   
    // 使用数组方法从文件中加载所有图片的文件说明到数组中
    _imageDescValues = [ initWithContentsOfFile:path];
   
    // 利用数组长度正确初始化图片张数并在UILable中显示
    self.number.text = ;
   
    // 取得数组中第一个成员赋值给第一张图片的文字描述,初始化界面内容
    self.imageDesc.text = _imageDescValues;
   
}

// 图片切换滑动条控件动作实现
- (IBAction)imageSwitch:(UISlider *)sender {
   
    /*******方法说明******
   
   1、图片序号Label(1/16 - 16/16)、图片文件名(001.png - 016.png)、图片描述(_imageDescValues-)、sender.value的取值(1-16)都存在一定关系;
   2、涉及到两种数据类型(double与int),所以先通过强制转换将类型统一,这里将double转成int型;
   3、数据关系:图片序号 = 文件名序号 = 数组序号+1;
   4、由于滑动控件是事件触发者,所以以sender.value为基准,定义一个用来统一数据的临时变量int tempNo;
   5、sender.value = 1(1.0000~1.9999) 则图片序号为 1/16, 图片名称为 001.png, 图片描述为数组取值;
   
   *******************/
   
    int tempNo = (int)sender.value;
   
    self.number.text= ;
   
    self.image.image = ];
   
    self.imageDesc.text = _imageDescValues;
   
}

// 设置按钮UIButton控件触发事件
- (IBAction)setting:(UIButton *)sender {
   
    // 调用动画效果
    [self actionAnimationBlock:^{
      
      // 业务代码
      // 当用户点击设置按钮时设置面板View位置值发生变化,先取出设置面板的center值,数据类型为CGPoint;
      CGPoint tempPoint = self.setBoard.center;
      
      // 1、第一次点击设置按钮,设置面板从之间的屏幕下方外界移动到屏幕能见区域范围内,即上升100像素
      if (self.view.frame.size.height == self.setBoard.frame.origin.y) {
            
            tempPoint.y -= 100;
            
            /*************ios6.0版本屏幕尺寸问题****************
            
             } else if (480 == self.setBoard.frame.origin.y) {
            
             tempPoint.y -= 120;
            
             } else if (360 == self.setBoard.frame.origin.y){
            
             tempPoint.y += 120;
            
             ***********************End***********************/
      
      // 否则(即已显示在屏幕可见区域)下降100个像素移出屏幕显示区域
      } else {
            
            tempPoint.y += 100;
            
      }
      
      // 修改完毕后再赋值给设置面板的center,实现值修改,不能单独修改center中的单个值,只能整体修改:
      self.setBoard.center = tempPoint;
   
    // 动画时长0.3秒,传值给actionAnimationBlock: animationDourationTime:
    } animationDourationTime:0.3];
   
}

// 夜间模式开关
- (IBAction)nightMode:(UISwitch *)sender {
   
    // 动画代码,为了使夜间模式能平滑切换
    [self actionAnimationBlock:^{
      
      // 开关有个on属性,BOOL类型,开与表示两个状态,通过这两个状态来区分夜间模式与正常模式
      if (sender.on) {
            
            // 开关打开切换到夜间模式,即两个UIView的背景色设置为灰色;
            self.view.backgroundColor = ;
            
            self.setBoard.backgroundColor = ;
            
      } else {
            
            // 开关另外一个状态,将背景色还原
            self.view.backgroundColor = ;
            
            // 由于设置面板之间的颜色是storyboard调的色,非系统结构体内的颜色,所以要还原这里通过RGB值还原,原RGB值可通过打印self.setBoard.backgroundColor结果获得;
            self.setBoard.backgroundColor = ;
            
      }
   
    // 日夜模式渐变时长1秒,效果较好;
    } animationDourationTime:1];
      
}

// 设置面板中的UISlider控件:图片大小改变
- (IBAction)imageSizeChange:(UISlider *)sender {
   
    /*********修改image.frame实现************
   
   CGRect rectSize = self.image.frame;
   
   rectSize.size.width = 320 * sender.value;
   
   rectSize.size.height = 312 * sender.value;
   
   rectSize.origin.x = 0 + ((1 - sender.value) * 312) / 2;
   
   rectSize.origin.y = 61 + ((1 - sender.value) * 320) / 2;
   
   self.image.frame = rectSize;
   
   ***************************************/
   
    // 直接使用transform属性一句代码搞定
    self.image.transform = CGAffineTransformMakeScale(sender.value, sender.value);
   
}

@end

相关链接:ios实战开发之按钮控件

源代码下载:**** Hidden Message *****

特别感谢李明杰老师的无私奉献!
页: [1]
查看完整版本: ios实战开发之图片展示