爱博体育app手机版UI之02图片浏览器02UI基础第二天。

Snip20160125_4.png

注释

  • #### Xcode 8.1,集成了喵神的诠释插件,快捷键为

alt+command+/

爱博体育app手机版 1

Snip20161206_1.png

](http://upload-images.jianshu.io/upload\_images/1037528-0197b17adb0bfe73.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
是地方的数字设为0表示未克行数
前言:
落得同蹩脚我们介绍了图片浏览器的前头几乎独次,这次咱们用一个聊程序结束:汤姆猫
由于我们本从来不讲到,语音,所以这个汤姆猫是一个哑巴汤姆猫,
所要的资源在这里面:
链接:
http://pan.baidu.com/s/1RFeVk
密码: a86h

01-加法计算器

汤姆猫

预览

爱博体育app手机版 2

Snip20161206_11.png

1.在mainstoryboard着拖入三独textLabel,因为只要拓展输入操作用text,➕用Label,搭建

爱博体育app手机版 3

Snip20161206_7.png

2.写代码

落控件内容

爱博体育app手机版 4

Snip20161206_8.png

  • 1.以到字符串内容
  • 2.将字符串变成数值
  • 3.相加
  • 4.来得结果

爱博体育app手机版 5

Snip20161206_10.png

比如长度判断是否也空

爱博体育app手机版 6

Snip20161207_15.png

    // 判断
    if (sum1String.length == 0) {
        /*
        // 创建对象
         //Alert,提示框(过期了),创建方法为 initWithTitle
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"输入有误" message:@"请输入第一个数" delegate:nil cancelButtonTitle:@"我知道了" otherButtonTitles:nil, nil];

        // 显示
        [alertView show];
        */
        [self showInfo:@"请输入第一个数"];
        //return,不会再往下走了
        return;
    }

抽成了措施

爱博体育app手机版 7

Snip20161207_17.png

瞩目:对于艺术过期的告诫,消除警告的一样种方式是降版本

爱博体育app手机版 8

Snip20161207_12.png

.m中代码

//
//  ViewController.m
//  01-加法计算器
//
//  Created by XFJZ on 16/12/07.
//  Copyright © 2016年 XFJZ. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UITextField *num1TextField;
@property (weak, nonatomic) IBOutlet UITextField *num2TextField;
@property (weak, nonatomic) IBOutlet UILabel *resultLabel;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)sum {
    // 1. 拿到两个字符串
    NSString *sum1String = self.num1TextField.text;
    NSString *sum2String = self.num2TextField.text;

    // 判断
    if (sum1String.length == 0) {
        /*
        // 创建对象
         //Alert,提示框(过期了),创建方法为 initWithTitle
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"输入有误" message:@"请输入第一个数" delegate:nil cancelButtonTitle:@"我知道了" otherButtonTitles:nil, nil];

        // 显示
        [alertView show];
        */
        [self showInfo:@"请输入第一个数"];
        //return,不会再往下走了
        return;
    }

    if (sum2String.length == 0) {
        /*
        // 创建对象
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"输入有误" message:@"请输入第二个数" delegate:nil cancelButtonTitle:@"我知道了" otherButtonTitles:nil, nil];

        // 显示
        [alertView show];
        */
        [self showInfo:@"请输入第二个数"];
        return;
    }

    // 2. 把字符串转成数值
    NSInteger sum1 = [sum1String integerValue];
    NSInteger sum2 = [sum2String integerValue];

    // 3. 相加
    NSInteger result = sum1 + sum2;

    // 4. 显示结果,整数转成字符串
    self.resultLabel.text = [NSString stringWithFormat:@"%zd", result];
}

- (void)showInfo: (NSString *)info{
    // 创建对象
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"输入有误" message:info delegate:nil cancelButtonTitle:@"我知道了" otherButtonTitles:nil, nil];

    // 显示
    [alertView show];
}

@end

1、效果亮

Snip20160120_3.png

02- 控件概述

爱博体育app手机版 9

Snip20161207_6.png

爱博体育app手机版 10

Snip20161207_5.png

爱博体育app手机版 11

Snip20161207_7.png

爱博体育app手机版 12

Snip20161207_8.png

爱博体育app手机版 13

Snip20161207_9.png

爱博体育app手机版 14

Snip20161207_10.png

爱博体育app手机版 15

Snip20161207_11.png

爱博体育app手机版 16

Snip20161207_15.png

爱博体育app手机版 17

Snip20161207_16.png

爱博体育app手机版 18

Snip20161207_17.png

爱博体育app手机版 19

Snip20161207_18.png

爱博体育app手机版 20

Snip20161207_19.png

爱博体育app手机版 21

Snip20161207_20.png

爱博体育app手机版 22

Snip20161207_21.png

爱博体育app手机版 23

Snip20161207_22.png

爱博体育app手机版 24

Snip20161207_23.png

爱博体育app手机版 25

Snip20161207_24.png

爱博体育app手机版 26

Snip20161207_25.png

爱博体育app手机版 27

Snip20161207_26.png

爱博体育app手机版 28

Snip20161207_27.png

爱博体育app手机版 29

Snip20161207_28.png

2、准备

所谓动画,对于本底我们来说就是平摆张图不断地切换,才会及动画的功效。
补充:
有时候我们的图片格式不是.png所以我们的images_xcassts是无能为力存放我们的图片资源的,这个时节咱们虽将我们的图资源放到Supporting里面
然而之后咱们的图样资源能够在images_xcassts尽量放在这里面

1.UILabel

概览

爱博体育app手机版 30

Snip20161209_4.png

爱博体育app手机版 31

Snip20161209_5.png

爱博体育app手机版 32

Snip20161209_6.png

在storyboard中属性

爱博体育app手机版 33

特性描述.png

每当代码中行使

爱博体育app手机版 34

Snip20161209_3.png

//
//  ViewController.m
//  02-UILabel的使用
//
//  Created by XFJZ on 16/12/08.
//  Copyright © 2016年 XFJZ. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // 1.1 创建UILabel对象
    UILabel *label = [[UILabel alloc] init];

    // 1.2 设置frame
    label.frame = CGRectMake(100, 100, 202, 175);

    // 1.3 设置背景颜色
    label.backgroundColor = [UIColor redColor];

    // 1.4 设置文字
    label.text = @"da shen 11期最牛逼!!!!da shen da shen da shen da shen da shen ";

    // 1.5 居中
    label.textAlignment = NSTextAlignmentCenter;

    // 1.6 设置字体大小
    label.font = [UIFont systemFontOfSize:20.f];
    // 加粗
    label.font = [UIFont boldSystemFontOfSize:25.f];
    // 斜体
    label.font = [UIFont italicSystemFontOfSize:20.f];

    // 1.7 设置文字的颜色
    label.textColor = [UIColor whiteColor];

    // 1.8 设置阴影(默认是有值)
    label.shadowColor = [UIColor blackColor];
    label.shadowOffset = CGSizeMake(-2, 1);

    // 1.9 设置行数(0:自动换行)
    label.numberOfLines = 1;

    // 1.10 显示模式
    label.lineBreakMode =  NSLineBreakByTruncatingHead;

    /*
     NSLineBreakByWordWrapping = 0,  // 单词包裹,换行的时候会以一个单词换行
     NSLineBreakByCharWrapping,     // 字符包裹换行,换行的时候会以一个字符换行
     NSLineBreakByClipping,     // 裁剪超出的内容
     NSLineBreakByTruncatingHead,   // 一行中头部省略(注意:numberOfLines要为1): "...wxyz"
     NSLineBreakByTruncatingTail,   // 一行中尾部省略: "abcd..."
     NSLineBreakByTruncatingMiddle  // 一行中中间部省略:  "ab...yz"
     */


    // 2.0 添加到控制器的view中
    [self.view addSubview:label];
}

@end

3、开始:

2.UIImage

概览

爱博体育app手机版 35

Snip20161209_8.png

爱博体育app手机版 36

Snip20161209_9.png

爱博体育app手机版 37

Snip20161209_10.png

在storyboard中属性

爱博体育app手机版 38

Snip20161209_14.png

*在代码中动用
加:一个对象在无在内存中扣起没有发强指针指于外

imageNamed方法

[UIImage imageNamed:@”传入图片名字”]

爱博体育app手机版 39

Snip20161209_15.png

爱博体育app手机版 40

Snip20161209_19.png

//
//  ViewController.m
//  03-UIImageView的使用
//
//  Created by XFJZ on 16/12/08.
//  Copyright © 2016年 XFJZ. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // 1.创建UIImageView对象
    UIImageView *imageView = [[UIImageView alloc] init];

    // 2. 设置尺寸
//    imageView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    imageView.frame = self.view.bounds;

    // 3. 设置背景颜色
    imageView.backgroundColor = [UIColor redColor];

    // 4. 设置背景图片 PNG不需要后缀
    imageView.image = [UIImage imageNamed:@"1"];

    // 5.设置图片的内容模式
    imageView.contentMode = UIViewContentModeScaleAspectFill;

    // 6.加毛玻璃

    // 6.1 创建UIToolBar对象
    UIToolbar *toolBar = [[UIToolbar alloc] init];
    // 6.2 设置toolBar的frame
    toolBar.frame = imageView.bounds;
    // 6.3 设置毛玻璃的样式
    toolBar.barStyle = UIBarStyleBlack;
    toolBar.alpha = 0.98;
    // 6.4 加到imageView中
    [imageView addSubview:toolBar];

    // 加到控制器的view中
    [self.view addSubview:imageView];

}


- (void)test{
    // 1.1 创建UIImageView对象
    UIImageView *imageView = [[UIImageView alloc] init];

    // 1.2 设置frame
    imageView.frame = CGRectMake(100, 100, 250, 200);

    // 1.3 设置背景
    //    imageView.backgroundColor = [UIColor greenColor];

    // 1.4 设置图片 (png不需要后缀)
    imageView.image = [UIImage imageNamed:@"1"];


    /**

     UIViewContentModeRedraw, // 重新绘制 (核心绘图) drawRact

     //带有Scale,标明图片有可能被拉伸或压缩
     UIViewContentModeScaleToFill, // 完全的压缩或拉伸

     // Aspect 比例,缩放是带有比例的
     UIViewContentModeScaleAspectFit, // 宽高比不变 Fit 适应
     UIViewContentModeScaleAspectFill, // 宽高比不变 Fill 填充

     //不带有Scale,标明图片不可能被拉伸或压缩
     UIViewContentModeCenter,
     UIViewContentModeTop,
     UIViewContentModeBottom,
     UIViewContentModeLeft,
     UIViewContentModeRight,
     UIViewContentModeTopLeft,
     UIViewContentModeTopRight,
     UIViewContentModeBottomLeft,
     UIViewContentModeBottomRight,
     */
    // 1.5 设置图片的内容模式
    imageView.contentMode = UIViewContentModeScaleAspectFill;

    // 2.0 加到控制器的view中
    [self.view addSubview:imageView];

    // 裁剪多余的部分
    imageView.clipsToBounds = YES;
}

@end
  • 装毛玻璃效果

效果:

爱博体育app手机版 41

Snip20161209_20.png

代码在上头,在image上重新加一个UIToolbar,导航控制器上面那层毛玻璃

爱博体育app手机版 42

1716808-0ae4f7a6068d4a98.png

  • UIImageView的 frame!!!设置

爱博体育app手机版 43

Snip20161209_2.png

爱博体育app手机版 44

Snip20161209_9.png

爱博体育app手机版 45

Snip20161209_4.png

代码:

//
//  ViewController.m
//  04-UIImageView的frame设置
//
//  Created by XFJZ on 16/12/08.
//  Copyright © 2016年 XFJZ. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    /*


    // 设置frame的方式
    // 方式一
      UIImageView *imageView = [[UIImageView alloc] init];
      imageView.image = [UIImage imageNamed:@"1"];

//    imageView.frame = CGRectMake(100, 100, 267, 400);
//    imageView.frame = (CGRect){{100, 100},{267, 400}};
    */

    // 方式二
    /*
    UIImageView *imageView = [[UIImageView alloc] init];
    // 创建一个UIImage对象
    UIImage *image = [UIImage imageNamed:@"1"];
    // 设置frame
    imageView.frame = CGRectMake(100, 10, image.size.width, image.size.height);
    // 设置图片,由于上边是创建了一个UIImage对象,所以得赋值回去
    imageView.image = image;
     */

    // 方式三
    /*
    // 先创建一个UIImage对象,再initWithFrame方法创建
    UIImage *image = [UIImage imageNamed:@"1"];
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 10, image.size.width, image.size.height)];
     // 再赋值回去
    imageView.image = image;
     */

    // 方式四

    // 创建一个UIimageview对象
    // 注意: initWithImage 默认就有尺寸--->图片的尺寸
    // 默认就有图片的尺寸,缺点不能改变位置,方法如下
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"1"]];

    // 改变位置
//    imageView.center = CGPointMake(200, 150);
    imageView.center = CGPointMake(self.view.frame.size.width * 0.5, self.view.frame.size.height * 0.5);

    [self.view addSubview:imageView];
}

@end
  • UIImageView的序列帧动画

爱博体育app手机版 46

Snip20161209_11.png

//
//  ViewController.m
//  05-UIImageView的帧动画
//
//  Created by XFJZ on 16/12/08.
//  Copyright © 2016年 XFJZ. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
/**
 *  属性
 */

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

//    self.imageView.image = [UIImage imageNamed:@"a1"];

}

#pragma mark - 开始动画
- (IBAction)startAnimation {
    // 1.1 加载所有的图片
    // titles:(NSArray<NSString *> *)titles   NSArray数组啊 NSString字符串 数组里面是字符串
    // 尖括号里的是指类型限定,第一个titles数组存放的都是NSString类型,OC里的集合类型,字典,数组,集合,三个默认是存放id类型即所有OC对象。尖括号这种限定语法在Xcode7后加入的,优化了很多语法提示。
    NSMutableArray<UIImage *> *imageArr = [NSMutableArray array];
    for (int i=0; i<20; i++) {
        // 获取图片的名称
        NSString *imageName = [NSString stringWithFormat:@"%d", i+1];
        // 创建UIImage对象
        UIImage *image = [UIImage imageNamed:imageName];
        // 加入数组
        [imageArr addObject:image];
    }
    // 设置动画图片
    self.imageView.animationImages = imageArr;

    // 设置动画的播放次数
    self.imageView.animationRepeatCount = 0;

    // 设置播放时长
    // 1秒30帧, 一张图片的时间 = 1/30 = 0.03333 20 * 0.0333
    self.imageView.animationDuration = 1.0;

    // 开始动画
    [self.imageView startAnimating];
}

#pragma mark - 结束动画
- (IBAction)overAnimation {
    [self.imageView stopAnimating];
}
@end



//animationImages属性

/*
 animationImages是数组类型,该数组必须包含的UIImage对象。您可以使用相同的图像对象多次在阵中。
 例如:将一系列帧添加到一个数组里面,然后设置animation一系列属性,如动画时间,动画重复次数,还是看代码吧,直观
 NSArray *magesArray = [NSArray arrayWithObjects:
 [UIImage imageNamed:@"image1.png"],
 [UIImage imageNamed:@"image2.png"],
 [UIImage imageNamed:@"image3.png"],
 [UIImage imageNamed:@"image4.png"],
 [UIImage imageNamed:@"image5.png"],nil];

 UIImageView *animationImageView = [UIImageView alloc]init];
 [animationImageView initWithFrame:CGRectMake(0, 0, 131, 125)];
 animationImageView.animationImages = imagesArray;//将序列帧数组赋给UIImageView的animationImages属性
 animationImageView.animationDuration = 0.25;//设置动画时间
 animationImageView.animationRepeatCount = 0;//设置动画次数 0 表示无限
 [animationImageView startAnimating];//开始播放动画
 但是,如果图片少的话也许这种方式是最快速最容易达到目的的,但是图片很多的话,根据目前我做的实验,图片很多的话 这种方式程序必须会蹦,随后我会提到我们现在的实现方式,而且动画不能够实现暂停,只有停止,项目中要求序列帧播放的时候当手轻触(touch)播放暂停,松开后继续播放 ,横扫(swipe)播放加速,这一系列的需求表明了用animationImages这种方式实现已经不太现实.因为UIImageView的animation不会边用边释放(当然这点仅是我自己的拙见),那就导致了如果图片很多,animation直接崩掉根本 用不了,我们实现的原理就是用NSTimer去实现apple的UIImageView animation的效果,其实apple应该也是用NSTimer去实现吧(猜的),用NSTimer每隔一个时间戳去设置一次image,代码如下
 NSTimer *myAnimatedTimer = [NSTimer scheduledTimerWithTimeInterval:0.04 target:self selector:@selector(setNextImage) userInfo:nil repeats:YES];
 -(void) setNextImage
 {
 myAnimatedView.image = [UIImage imageNamed:[NSStringstringWithFormat:@"image%i.png",nextImage]];
 }

 */
  • 资源存放
    图形的设置两栽艺术 1.称字 和 2.路径

爱博体育app手机版 47

Snip20161209_19.png

//
//  ViewController.m
//  06-资源存放问题
//
//  Created by XFJZ on 16/12/08.
//  Copyright © 2016年 XFJZ. All rights reserved.
//

#import "ViewController.h"

/**
   加载图片的方式:
   1. imageNamed:
   2. imageWithContentsOfFile:

   1. 加载Assets.xcassets这里面的图片:
    1> 打包后变成Assets.car
    2> 拿不到路径
    3> 只能通过imageNamed:来加载图片
    4> 不能通过imageWithContentsOfFile:来加载图片

   2. 放到项目中的图片:
    1> 可以拿到路径
    2> 能通过imageNamed:来加载图片
    3> 也能通过imageWithContentsOfFile:来加载图片

 */

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   // 图片的设置方式

    // 方式一
//    self.imageView.image = [UIImage imageNamed:@"1"];

    // 方式二
    // 路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"png"];

    // 先写这个,需要添加路径,再上一步
    self.imageView.image = [UIImage imageWithContentsOfFile:path];
}

@end

存放区别及注意

爱博体育app手机版 48

Snip20161209_15.png

爱博体育app手机版 49

Snip20161209_16.png

爱博体育app手机版 50

Snip20161209_17.png

爱博体育app手机版 51

Snip20161209_18.png

办法1 任是Assets还是Supporting都能加载出来
方2 只好加载Supporting里面的

1、storyboard设置

拳皇动画加载图片

效果

爱博体育app手机版 52

拳皇逐帧动画.gif

然每次点击了才拿到图片,解决就无异于问题,放到一个联合之全局的地方,目前推广- (void)viewDidLoad {......},为了外能够取得所以,弄成大引用性,方便得。

爱博体育app手机版 53

Snip20161210_4.png

爱博体育app手机版 54

Snip20161210_6.png

代码

//
//  ViewController.m
//  07-拳皇动画(加载图片)
//
//  Created by XFJZ on 16/12/08.
//  Copyright © 2016年 XFJZ. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

/** 站立 */
@property (nonatomic, strong) NSArray *standImages;
/** 小招 */
@property (nonatomic, strong) NSArray *smallImages;
/** 大招 */
@property (nonatomic, strong) NSArray *bigImages;

@end

@implementation ViewController

// 初始化一些数据
- (void)viewDidLoad {
    [super viewDidLoad];

    // 1.加载所有的站立图片
    /*
     //<UIImage *>这里是个泛型,切记这个
    NSMutableArray<UIImage *> *standImages = [NSMutableArray array];
    for (int i=0; i<10; i++) {
        // 获取所有图片的名称
        NSString *imageName = [NSString stringWithFormat:@"stand_%d", i+1];
        // 创建UIImage
        UIImage *image = [UIImage imageNamed:imageName];
        // 装入数组
        [standImages addObject:image];
    }
     */
    self.standImages = [self loadAllImagesWithimagePrefix:@"stand" count:10];

    // 2.加载所有的小招图片
    /*

    NSMutableArray<UIImage *> *smallImages = [NSMutableArray array];
    for (int i=0; i<39; i++) {
        // 获取所有图片的名称
        NSString *imageName = [NSString stringWithFormat:@"xiaozhao3_%d", i+1];
        // 创建UIImage
        UIImage *image = [UIImage imageNamed:imageName];
        // 装入数组
        [smallImages addObject:image];
    }
     */
    self.smallImages = [self loadAllImagesWithimagePrefix:@"xiaozhao3" count:39];

    // 3.加载所有的大招图片
    /*
    NSMutableArray<UIImage *> *bigImages = [NSMutableArray array];
    for (int i=0; i<87; i++) {
        // 获取所有图片的名称
        NSString *imageName = [NSString stringWithFormat:@"dazhao_%d", i+1];
        // 创建UIImage
        UIImage *image = [UIImage imageNamed:imageName];
        // 装入数组
        [bigImages addObject:image];
    }
     */
    self.bigImages = [self loadAllImagesWithimagePrefix:@"dazhao" count:87];
}

/**
 *  加载所有的图片
 *
 *  @param imagePrefix 名称前缀
 *  @param count       图片的总个数
 */
- (NSArray *)loadAllImagesWithimagePrefix:(NSString *)imagePrefix count:(int)count{
    NSMutableArray<UIImage *> *images = [NSMutableArray array];
    for (int i=0; i<count; i++) {
        // 获取所有图片的名称
        NSString *imageName = [NSString stringWithFormat:@"%@_%d",imagePrefix, i+1];
        // 创建UIImage
        UIImage *image = [UIImage imageNamed:imageName];
        // 装入数组
        [images addObject:image];
    }
    return images;
}

/**
 *  站立
 */
- (IBAction)stand {
    /*
  // 1.加载所有的图片
    NSMutableArray<UIImage *> *standImages = [NSMutableArray array];
    for (int i=0; i<10; i++) {
        // 获取所有图片的名称
        NSString *imageName = [NSString stringWithFormat:@"stand_%d", i+1];
        // 创建UIImage
        UIImage *image = [UIImage imageNamed:imageName];
        // 装入数组
        [standImages addObject:image];
    }
    */
    // 2.设置动画图片
    self.imageView.animationImages = self.standImages;

    // 3.设置播放次数
    self.imageView.animationRepeatCount = 0;

    // 4.设置播放的时长
    self.imageView.animationDuration = 0.6;

    // 5.播放
    [self.imageView startAnimating];

}

/**
 *  小招
 */
- (IBAction)smallZhao {
    /*
    // 1.加载所有的图片
    NSMutableArray<UIImage *> *smallImages = [NSMutableArray array];
    for (int i=0; i<39; i++) {
        // 获取所有图片的名称
        NSString *imageName = [NSString stringWithFormat:@"xiaozhao3_%d", i+1];
        // 创建UIImage
        UIImage *image = [UIImage imageNamed:imageName];
        // 装入数组
        [smallImages addObject:image];
    }
    */
    // 2.设置动画图片
    self.imageView.animationImages = self.smallImages;

    // 3.设置动画次数
    self.imageView.animationRepeatCount = 2;

    // 4.设置播放时长
    self.imageView.animationDuration = 1.5;

    // 5.播放
    [self.imageView startAnimating];
}

/**
 *  大招
 */
- (IBAction)bigZhao {
    /*
    // 1.加载所有的图片
    NSMutableArray<UIImage *> *bigImages = [NSMutableArray array];
    for (int i=0; i<87; i++) {
        // 获取所有图片的名称
        NSString *imageName = [NSString stringWithFormat:@"dazhao_%d", i+1];
        // 创建UIImage
        UIImage *image = [UIImage imageNamed:imageName];
        // 装入数组
        [bigImages addObject:image];
    }
    */
    // 2.设置动画图片
    self.imageView.animationImages = self.bigImages;

    // 3.设置动画次数
    self.imageView.animationRepeatCount = 1;

    // 4.设置播放时长
    self.imageView.animationDuration = 2.5;

    // 5.播放
    [self.imageView startAnimating];
}

@end
1、添加一个UIImage,然后用图纸放到上面

高低招播放完后站立

直白当大小招后面➕站立方法- (IBAction)stand {......}见面挂掉大小招所以不能够一直加

爱博体育app手机版 55

Snip20161210_8.png

/**
 *  小招
 */
- (IBAction)smallZhao {
    // 2.设置动画图片
    self.imageView.animationImages = self.smallImages;

    // 3.设置动画次数
    self.imageView.animationRepeatCount = 1;

    // 4.设置播放时长
    self.imageView.animationDuration = 1.5;

    // 5.播放
    [self.imageView startAnimating];

    // 6.站立(延迟)小招放完之后执行
    // Selector 方法
    // Object 参数
    // afterDelay 时间
//    NSSelectorFromString(<#NSString * _Nonnull aSelectorName#>) 效果一样
    [self performSelector:@selector(stand) withObject:nil afterDelay:self.imageView.animationDuration];

}
2、放置任何的几个按钮控件

注意

  • 咱都记汤姆猫一旦点击它的满头、尾巴、脚,都见面发出相应的动画片,这个上,我们的缓解方案是,在图纸上模拟上几乎独按钮控件,然后又连线
  • 假使发现控件会被图片挡住,解决方式是:

Snip20160120_4.png

拳皇代码代码内存优化

鉴于每个招都得勾1.设置动画图片;2.设置动画次数;3.时长;4.播放;5.再站立
所以抽成一个方法,先将用转移的用新定义之参数代替了!!!
设当最终一个间站立则未改变动,小招大招都急需推广了以后站立,即有用站立,有的未需,所以抽出来的方中得判断,然后抽出来的参数为布尔类型,站立的时光调用NO则非调用,大小招调用YES则调用!!!!

补充

来参数方法格式是何等?
带动一个参数
道声明
— (返回值类型)方法名:(参数类型)参数称为;

艺术实现
— (返回值类型)方法名:(参数类型)参数号称{

}

拉动多个参数
主意声明
— (返回值类型)方法名1:(参数类型)参数叫做1 方法名2:(参数类型)参数名2;
— (返回值类型)方法名1:(参数类型)参数称1 and方法名2:(参数类型)参数名
— (返回值类型)方法名1:(参数类型)参数称作1 :(参数类型)参数名2;
主意实现
— (返回值类型)方法名1:(参数类型)参数名叫1 方法名2:(参数类型)参数名2{
}

强指针对应的老三单存储图片的数组

爱博体育app手机版 56

内存优化.png

  • #### imagenamed和imageWithContentOfFile的区别

爱博体育app手机版 57

Snip20161210_9.png

//
//  ViewController.m
//  07-拳皇动画(加载图片)
//
//  Created by XFJZ on 16/12/10.
//  Copyright © 2016年 XFJZ. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

/** 站立 */
@property (nonatomic, strong) NSArray *standImages;
/** 小招 */
@property (nonatomic, strong) NSArray *smallImages;
/** 大招 */
@property (nonatomic, strong) NSArray *bigImages;

@end

@implementation ViewController

/**
    图片的两种加载方式:
    1> imageNamed:
      a. 就算指向它的指针被销毁,该资源也不会被从内存中干掉
      b. 放到Assets.xcassets的图片,默认就有缓存
      c. 图片经常被使用
    //!!!!!!!!!!!!!!!!!!!!!!!!!!
    2> imageWithContentsOfFile:
      a. 指向它的指针被销毁,该资源会被从内存中干掉
      b. 放到项目中的图片就不由缓存
      c. 不经常用,大批量的图片

 */

// 初始化一些数据
- (void)viewDidLoad {
    [super viewDidLoad];

    // 1.加载所有的站立图片
    self.standImages = [self loadAllImagesWithimagePrefix:@"stand" count:10];

    // 2.加载所有的小招图片
    self.smallImages = [self loadAllImagesWithimagePrefix:@"xiaozhao3" count:39];

    // 3.加载所有的大招图片
    self.bigImages = [self loadAllImagesWithimagePrefix:@"dazhao" count:87];

    // 4.站立
    [self stand];
}

/**
 *  加载所有的图片
 *
 *  @param imagePrefix 名称前缀
 *  @param count       图片的总个数
 */
- (NSArray *)loadAllImagesWithimagePrefix:(NSString *)imagePrefix count:(int)count{
    NSMutableArray<UIImage *> *images = [NSMutableArray array];
    for (int i=0; i<count; i++) {
        // 获取所有图片的名称
        NSString *imageName = [NSString stringWithFormat:@"%@_%d",imagePrefix, i+1];
        // 创建UIImage
//        UIImage *image = [UIImage imageNamed:imageName];
        NSString *imagePath = [[NSBundle mainBundle] pathForResource:imageName ofType:@"png"];
        UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
        // 装入数组
        [images addObject:image];
    }
    return images;
}

/**
 *  站立
 */
- (IBAction)stand {
    /*
    // 2.设置动画图片
    self.imageView.animationImages = self.standImages;

    // 3.设置播放次数
    self.imageView.animationRepeatCount = 0;

    // 4.设置播放的时长
    self.imageView.animationDuration = 0.6;

    // 5.播放
    [self.imageView startAnimating];
    */
    [self palyZhaoWithImages:self.standImages count:0 duration:0.6 isStand:YES];
}

/**
 *  小招
 */
- (IBAction)smallZhao {
    /*
    // 2.设置动画图片
    self.imageView.animationImages = self.smallImages;

    // 3.设置动画次数
    self.imageView.animationRepeatCount = 1;

    // 4.设置播放时长
    self.imageView.animationDuration = 1.5;

    // 5.播放
    [self.imageView startAnimating];

    // 6.站立(延迟)
    [self performSelector:@selector(stand) withObject:nil afterDelay:self.imageView.animationDuration];
     */
    [self palyZhaoWithImages:self.smallImages count:1 duration:1.5 isStand:NO];
}

/**
 *  大招
 */
- (IBAction)bigZhao {
    /*
    // 2.设置动画图片
    self.imageView.animationImages = self.bigImages;

    // 3.设置动画次数
    self.imageView.animationRepeatCount = 1;

    // 4.设置播放时长
    self.imageView.animationDuration = 2.5;

    // 5.播放
    [self.imageView startAnimating];

    // 6.站立
    [self performSelector:@selector(stand) withObject:nil afterDelay:self.imageView.animationDuration];
    */
    [self palyZhaoWithImages:self.bigImages count:1 duration:2.5 isStand:NO];
}

/**
 *  游戏结束
 */
- (IBAction)gameOver {
    self.standImages = nil;
    self.smallImages = nil;
    self.bigImages = nil;

    self.imageView.animationImages = nil;
}


/**
 *  放招
 *
 *  @param images   图片数组
 *  @param count    播放次数
 *  @param duration 播放时间
 *  @param isStand  是否站立
 */
    //参数的类型,看传给它的前边
- (void)palyZhaoWithImages:(NSArray *)images count: (NSInteger)count duration:(NSTimeInterval)duration isStand:(BOOL)isStand{
    // 1.设置动画图片
    self.imageView.animationImages = images;

    // 2.设置动画次数
    self.imageView.animationRepeatCount = count;

    // 3.设置播放时长
    self.imageView.animationDuration = duration;

    // 4.播放
    [self.imageView startAnimating];

    // 5.站立
    if (!isStand) {
     [self performSelector:@selector(stand) withObject:nil afterDelay:self.imageView.animationDuration];
    }
}

@end
3、连线

注意:控件的连线,有的是成为性、有的是成为艺术
当我们的斯都拿凡方,但是,需要将后面的这个背景作为一个特性。

注意:param是“参数”的意思

4、写方法(加载动画的点子)

Snip20160125_4.png

该方式中书写的饶是拿我们的图形加载出来的代码

iOS中播放音效

效果

爱博体育app手机版 58

Snip20161210_10.png

storyboard布局

爱博体育app手机版 59

Snip20161210_13.png

出于要将“上一曲”“下一曲”鲜独按钮放到一个方式里,点击即有限单按钮都见面调用这个艺术,为了区别所以当控件里加了tag,“暂停”和“播放”一样。

爱博体育app手机版 60

Snip20161212_1.png

爱博体育app手机版 61

Snip20161212_4.png

代码

//
//  ViewController.m
//  10-iOS中播放音效
//
//  Created by XFJZ on 16/12/06.
//  Copyright © 2016年 XFJZ. All rights reserved.
//

#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>

@interface ViewController ()
/**
 *  背景图片
 */
@property (weak, nonatomic) IBOutlet UIImageView *bgImageView;

/** 播放器 */
@property (nonatomic, strong) AVPlayer *player;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // 1.加毛玻璃
    UIToolbar *toolbar = [[UIToolbar alloc] init];

    // 2. 设置frame
    toolbar.frame = self.bgImageView.bounds;

    // 3. 设置样式和透明度
    toolbar.barStyle = UIBarStyleDefault;
    toolbar.alpha = 0.98;

    // 4.加到背景图片上
    [self.bgImageView addSubview:toolbar];

    // 5.创建播放器
    /*
    NSString *path = [[NSBundle mainBundle] pathForResource:@"mySong1.mp3" ofType:nil];
    NSURL *url = [NSURL fileURLWithPath:path];
     */
    // 资源的URL地址
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"mySong1.mp3" withExtension:nil];
    // 创建播放器曲目
    AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithURL:url];
    // 创建播放器,创建好了要播放,要拿到它,在下边的方法里播放,没添加到任何控件里,没引用,所以得强指针声明
    self.player = [[AVPlayer alloc] initWithPlayerItem:playerItem];

}

/**
 *  播放/暂停
 *
 *  @param button 按钮
 */
- (IBAction)playOrPause:(UIButton *)button {
    switch (button.tag) {
        case 3:
            [self.player play]; // 播放
            break;
        case 4:
            [self.player pause]; // 暂停
            break;
        default:
            break;
    }
}

/**
 *  切换歌曲
 *
 *  @param button 按钮
 */
- (IBAction)changeMusic:(UIButton *)button {
    // 歌曲的名称
    // 通过判断定义歌曲的名称,再把上一首,和下一首的名称传给,下边替换进来的曲目也就是replaceCurrentItemWithPlayerItem方法
    NSString *musicName = nil;
    switch (button.tag) {
        case 1:// 上一首
            musicName = @"mySong2.mp3";
            break;
        case 2:// 下一首
            musicName = @"mySong3.mp3";
            break;
        default:
            break;
    }

    NSURL *url = [[NSBundle mainBundle] URLForResource:musicName withExtension:nil];
    AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithURL:url];
    //方法为替换,把当前的曲目替换为你传进来的曲目,所以又得传一个曲目进来
    [self.player replaceCurrentItemWithPlayerItem:playerItem];

    // 最后再播放
    [self.player play];
}



@end
1、加载图片

1、首先创建一个而变数组
2、利用for语句子就是加载图片
3、将图片及数组
接下来将我们存放图片的数组加载到我们的tom.animationImages

现实的代码格式是如此的:

Snip20160305_1.png

拳皇中合拢音效

爱博体育app手机版 62

Snip20161212_7.png

爱博体育app手机版 63

Snip20161212_5.png

//
//  ViewController.m
//  07-拳皇动画(加载图片)
//
//  Created by XFJZ on 16/12/09.
//  Copyright © 2016年 XFJZ. All rights reserved.
//

#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

/** 站立 */
@property (nonatomic, strong) NSArray *standImages;
/** 小招 */
@property (nonatomic, strong) NSArray *smallImages;
/** 大招 */
@property (nonatomic, strong) NSArray *bigImages;

/** 播放器 */
@property (nonatomic, strong) AVPlayer *player;
@end

@implementation ViewController

/**
    图片的两种加载方式:
    1> imageNamed:
      a. 就算指向它的指针被销毁,该资源也不会被从内存中干掉
      b. 放到Assets.xcassets的图片,默认就有缓存
      c. 使用场景:图片经常被使用

    2> imageWithContentsOfFile:
      a. 指向它的指针被销毁,该资源会被从内存中干掉
      b. 放到项目中的图片就没有缓存
      c. 使用场景:不经常用,大批量的图片

 */

// 初始化一些数据
- (void)viewDidLoad {
    [super viewDidLoad];
    /*
   self.imageView.backgroundColor = [UIColor colorWithRed:(255/255.0) green:(3/255.0) blue:(4/255.0) alpha:0.6];
    return;
     */
    // 1.加载所有的站立图片
    self.standImages = [self loadAllImagesWithimagePrefix:@"stand" count:10];

    // 2.加载所有的小招图片
    self.smallImages = [self loadAllImagesWithimagePrefix:@"xiaozhao3" count:39];

    // 3.加载所有的大招图片
    self.bigImages = [self loadAllImagesWithimagePrefix:@"dazhao" count:87];

    // 4.站立
    [self stand];

    // 5.创建播放器,创建好,在哪里播放在哪里调用播放器的“play”方法
    self.player = [[AVPlayer alloc] init];
}

/**
 *  加载所有的图片
 *
 *  @param imagePrefix 名称前缀
 *  @param count       图片的总个数
 */
- (NSArray *)loadAllImagesWithimagePrefix:(NSString *)imagePrefix count:(int)count{
    NSMutableArray<UIImage *> *images = [NSMutableArray array];
    for (int i=0; i<count; i++) {
        // 获取所有图片的名称
        NSString *imageName = [NSString stringWithFormat:@"%@_%d",imagePrefix, i+1];
        // 创建UIImage
//        UIImage *image = [UIImage imageNamed:imageName];
        NSString *imagePath = [[NSBundle mainBundle] pathForResource:imageName ofType:@"png"];
        UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
        // 装入数组
        [images addObject:image];
    }
    return images;
}

/**
 *  站立
 */
- (IBAction)stand {
    /*
    // 2.设置动画图片
    self.imageView.animationImages = self.standImages;

    // 3.设置播放次数
    self.imageView.animationRepeatCount = 0;

    // 4.设置播放的时长
    self.imageView.animationDuration = 0.6;

    // 5.播放
    [self.imageView startAnimating];
    */
    [self palyZhaoWithImages:self.standImages count:0 duration:0.6 isStand:YES musicName:nil];
}

/**
 *  小招
 */
- (IBAction)smallZhao {
    /*
    // 2.设置动画图片
    self.imageView.animationImages = self.smallImages;

    // 3.设置动画次数
    self.imageView.animationRepeatCount = 1;

    // 4.设置播放时长
    self.imageView.animationDuration = 1.5;

    // 5.播放
    [self.imageView startAnimating];

    // 6.站立(延迟)
    [self performSelector:@selector(stand) withObject:nil afterDelay:self.imageView.animationDuration];
     */
    [self palyZhaoWithImages:self.smallImages count:1 duration:1.5 isStand:NO musicName:@"xiaozhao3.mp3"];
}

/**
 *  大招
 */
- (IBAction)bigZhao {
    /*
    // 2.设置动画图片
    self.imageView.animationImages = self.bigImages;

    // 3.设置动画次数
    self.imageView.animationRepeatCount = 1;

    // 4.设置播放时长
    self.imageView.animationDuration = 2.5;

    // 5.播放
    [self.imageView startAnimating];

    // 6.站立
    [self performSelector:@selector(stand) withObject:nil afterDelay:self.imageView.animationDuration];
    */
    [self palyZhaoWithImages:self.bigImages count:1 duration:2.5 isStand:NO musicName:@"dazhao.mp3"];
}

/**
 *  游戏结束
 */
- (IBAction)gameOver {
    self.standImages = nil;
    self.smallImages = nil;
    self.bigImages = nil;

    self.imageView.animationImages = nil;
}


/**
 *  放招
 *
 *  @param images   图片数组
 *  @param count    播放次数
 *  @param duration 播放时间
 *  @param isStand  是否站立
 */
- (void)palyZhaoWithImages:(NSArray *)images count: (NSInteger)count duration:(NSTimeInterval)duration isStand:(BOOL)isStand musicName:(NSString *)musicName{
    // 1.设置动画图片
    self.imageView.animationImages = images;

    // 2.设置动画次数
    self.imageView.animationRepeatCount = count;

    // 3.设置播放时长
    self.imageView.animationDuration = duration;

    // 4.播放
    [self.imageView startAnimating];

    // 5.站立,前文中放完大招小招都传入布尔类型NO,由于 是!NO都会进入这个方法
    if (!isStand) {
       // 6.播放 ,上边参数中直接传入musicName是几就行了
        // 不切换名字用不到
        NSURL *url = [[NSBundle mainBundle] URLForResource:musicName withExtension:nil];
        AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithURL:url];
        [self.player replaceCurrentItemWithPlayerItem:playerItem];
        [self.player play];

        // 7.调节速率
        self.player.rate = 2.0;
       // 延迟执行方法
     [self performSelector:@selector(stand) withObject:nil afterDelay:self.imageView.animationDuration];
    }
}

@end
2. 装我们的广播的次数\时间\

Snip20160305_2.png

注意:

当我们于点击一个按钮的时候, 我们的呼应的图形会加载到我们的数组中,
但是,一旦我们继承点击任何的按钮时,
我们的别样相应的图纸为会加载到我们的数组中,
这样见面招致,我们的欠应用所占据的无绳电话机内存较大, 甚至会见使下直接倒,
所以我们得安装,释放我们内存的操作. 每次要图片播放了,
就径直出狱我们的内存.

Snip20160305_3.png

如上之老三个代码都是在我们以及一个措施吃描绘的

假若一旦我们的图样能够播放???
高达一个办法中 , 我们都要求传入两独参数, 一个就是是图片名,
另一个尽管是图的个数
之所以, 我们唯有需要以咱们各级一个按钮连线后变更的措施中调用该办法, 便可.

Snip20160305_4.png

水彩之回味

爱博体育app手机版 64

Snip20161212_11.png

爱博体育app手机版 65

Snip20161212_4.png

爱博体育app手机版 66

Snip20161212_5.png

爱博体育app手机版 67

Snip20161212_6.png

爱博体育app手机版 68

Snip20161212_7.png

爱博体育app手机版 69

Snip20161212_8.png

爱博体育app手机版 70

Snip20161212_9.png

爱博体育app手机版 71

Snip20161212_12.png

作者说:

如上就是是, 我们的图纸浏览器的全部内容. 我们的UI基础包括以下几只内容:

Snip20160305_5.png

倘, 我现在只是更新至第二只有, 所以, 后面我会尽快更新的, 以前,我说了,
当我们的Swift写了以后, 我们就算用Swift来写代码, 但是,
由于自己的水平有限, 暂时还非可知熟练的用Swift,
所以,我打算先将01~06片段底情用OC写, 之后的始末,用Swift写, 诸位见谅哈.

多少知识点

contentMode属性

  • 饱含scale单词的:图片有或会见牵涉伸

    • UIViewContentModeScaleToFill
      • 将图纸拉伸到填充整个imageView
      • 图展示的尺寸和imageView的尺码是一样的
    • 含有aspect单词之:保持图片原来的富有高比
      • UIViewContentModeScaleAspectFit
        • 保险刚好能看到图片的漫天
      • UIViewContentModeScaleAspectFill
        • 爱屋及乌伸到图片的宽或高度与imageView一样
  • 没scale单词的:图片绝对不见面受拉伸,保持图片的原本尺寸

    • UIViewContentModeCenter
    • UIViewContentModeTop
    • UIViewContentModeBottom
    • UIViewContentModeLeft
    • UIViewContentModeRight
    • UIViewContentModeTopLeft
    • UIViewContentModeTopRight
    • UIViewContentModeBottomLeft
    • UIViewContentModeBottomRight

小语法点

  • 莫能够一直改动:OC对象的组织体属性的分子
  • 脚的写法是张冠李戴的

imageView.frame.size = imageView.image.size;
  • 正确写法

CGRect tempFrame = imageView.frame;
tempFrame.size = imageView.image.size;
imageView.frame = tempFrame;

initWithImage:方法

  • 行使这法子创建出来的imageView的尺码以及传唱的图片尺寸一样

修改frame的3种方式

  • 直白运用CGRectMake函数

imageView.frame = CGRectMake(100, 100, 200, 200);
  • 用临时结构体变量

CGRect tempFrame = imageView.frame;
tempFrame.origin.x = 100;
tempFrame.origin.y = 100;
tempFrame.size.width = 200;
tempFrame.size.height = 200;
imageView.frame = tempFrame;
  • 以大括哀号{}形式

imageView.frame = (CGRect){{100, 100}, {200, 200}};
  • 抽取重复代码

    • 拿同代码放到一个初的不二法门被
    • 毫不的东西就是成为方法的参数
  • 图片的加载方式

    • 有缓存

    UIImage *image = [UIImage imageNamed:@"图片名"];
    
      - 使用场合:图片比较小、使用频率较高
      - 建议把需要缓存的图片直接放到Images.xcassets
    
    • 无缓存

    NSString *file = [[NSBundle mainBundle] pathForResource:@"图片名" ofType:@"图片的扩展名"];
    UIImage *image = [UIImage imageWithContentsOfFile:@"图片文件的全路径"];
    
      - 使用场合:图片比较大、使用频率较小
      - 不需要缓存的图片不能放在Images.xcassets
    
    • 在Images.xcassets里面的图样,只能通过图形名失去加载图片
  • 延迟做片作业

[abc performSelector:@selector(stand:) withObject:@"123" afterDelay:10];
// 10s后自动调用abc的stand:方法,并且传递@"123"参数
  • 音频文件的简短播放

// 创建一个音频文件的URL(URL就是文件路径对象)
NSURL *url = [[NSBundle mainBundle] URLForResource:@"音频文件名" withExtension:@"音频文件的扩展名"];
// 创建播放器
self.player = [AVPlayer playerWithURL:url];
// 播放
[self.player play];

总结

爱博体育app手机版 72

第二天.png

相关文章