iOS UI基础控件之UIImageView

一、UIImageView和UIImage

UIImageView是iOS中用于显示图片的类,UIImage是用于存储图片数据的类;iOS中几乎所有看到的图片数据都存储在UIImage中,同时所要的图片都是用UIImageView来显示;UIImageView和UIImage关系如下图:

二. 创建UIImageView的两种方式

1.自己设置图片位置和尺寸

“`

UIImageView *iv = [[UIImageView alloc] init]; //创建的图片, 没有默认的宽高

iv.backgroundColor = [UIColor redColor];

UIImage *image = [UIImage imageNamed:@”meinv.jpg”];

iv.image = image;

//自己设置图片位置和尺寸
iv.frame =  CGRectMake(100, 100, image.size.width, image.size.height);
[self.view addSubview:iv];

“`

2、使用默认图片尺寸和位置

    //默认宽高,为图片宽高,位置为0,0
    UIImageView *iv = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"meinv.jpg"]]; 

    //推荐设置iv的frame,以便于设置图片的摆放位置
    //iv = CGRectMake(100, 100, image.size.width, image.size.height);

    iv.backgroundColor = [UIColor redColor];
    [self.view addSubview:iv];
    NSLog(@"%@",NSStringFromCGRect(iv.frame));

三. ContentMode属性


typedef NS_ENUM(NSInteger, UIViewContentMode) {
    UIViewContentModeScaleToFill,
    UIViewContentModeScaleAspectFit,      // contents scaled to fit with fixed aspect. remainder is transparent
    UIViewContentModeScaleAspectFill,     // contents scaled to fill with fixed aspect. some portion of content may be clipped.
    UIViewContentModeRedraw,              // redraw on bounds change (calls -setNeedsDisplay)
    UIViewContentModeCenter,              // contents remain same size. positioned adjusted.
    UIViewContentModeTop,
    UIViewContentModeBottom,
    UIViewContentModeLeft,
    UIViewContentModeRight,
    UIViewContentModeTopLeft,
    UIViewContentModeTopRight,
    UIViewContentModeBottomLeft,
    UIViewContentModeBottomRight,
};

规律:
     但凡取值中包含Scale单词的, 都会对图片进行拉伸(缩放)
     但凡取值中没有出现Scale单词的, 都不会对图片进行拉伸
     UIViewContentModeScaleToFill,
     > 会按照UIImageView的宽高比来拉伸图片
     > 直到让整个图片都填充UIImageView为止
     > 因为是按照UIImageView的宽高比来拉伸, 所以图片会变形

规律:
     但凡取值中包含Aspect单词的, 都会按照图片的宽高比来拉伸
     > 因为是按照图片的宽高比来拉伸, 所以图片不会变形
     UIViewContentModeScaleAspectFit,
     > 会按照图片的宽高比来拉伸
     > 要求整张图片都必须在UIImageView的范围内
     > 并且宽度和高度其中一个必须和UIImageView一样
     > 居中显示

     UIViewContentModeScaleAspectFill,
     > 会按照图片的宽高比来拉伸
     > 要求整张图片必须填充UIImageView
     > 并且图片的宽度或者高度其中一个必须和UIImageView一样

四. 剪裁超出部分属性

    观察下面运行效果,理解clipsToBounds属性
    // 1.创建一个UIImageView
    UIImageView *iv = [[UIImageView alloc] init];
    // 2.设置相关属性
    iv.backgroundColor = [UIColor redColor];
    iv.image = [UIImage imageNamed:@"meinv.jpg"];
    iv.contentMode = UIViewContentModeLeft;
    // 3.设置frame
    iv.frame = CGRectMake(100, 100, 200, 200);

    // 剪切超出的部分
    iv.clipsToBounds = YES;
    [self.view addSubview:iv];

五. UIImageView动画

- (IBAction)run:(UIButton *)sender
{
    NSMutableArray *arrM = [NSMutableArray array];
    // 1.创建多张图片
    for (int i = 1; i <= 6; i++) {
        NSString *imageNmae = [NSString stringWithFormat:@"run_%i", i];
        UIImage *image = [UIImage imageNamed:imageNmae];
        // 2.将所有的图片放到数组中
        [arrM addObject:image];
    }
    // 3.将保存了所有图片的数组赋值给UIImageView
    self.containerView.animationImages = arrM;

    // 设置重复次数,0,代表无线
    self.containerView.animationRepeatCount = 1; 

    //设置一次动画所需时间
    self.containerView.animationDuration = 1;

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

- (IBAction)stop:(id)sender {

     //判断是否正在动画
    if([self.containerView isAnimating])
    {
        //停止动画
        [self.containerView stopAnimating];
    }
}

六. UIImageView性能优化问题

问题描述: 如果直接用 UIImage *image = [UIImage imageNamed:imageNmae];加载图片,图片会自动到内存中缓存起来. 这时,当加载多张图片后,假如执行动画,就会导致,内存暴增,而且当动画执行完毕之后,也不会释放。

解决方案:
//使用initWithContentOfFile:方法直接从mainBundle,app根目录中加载图片,
//这样如果遇到上述问题,在执行完动画之后,图片会自动释放..

NSString *imageNmae = [NSString stringWithFormat:@"%@_%i", prefix, i];
imageNmae = [[NSBundle mainBundle] pathForResource:imageNmae ofType:@"png"];
UIImage *image = [[UIImage alloc] initWithContentOfFile:imageName];

代替UIImage *image = [UIImage imageNamed:imageNmae];

七. 图片拉伸

为什么要让图片拉伸?

如果我们要设置背景图片,如按钮,当我们直接实用图片时(有时美工也会给我们一张可拉伸小图片),可能图片会被系统拉伸变形,变得很丑,严重影响美观!

图片拉伸就是为了解决如上问题而存在的,让图片在拉伸时,保证图片不变形

图片拉伸历史过程:

- (void)viewDidLoad {
    [super viewDidLoad];

    UIButton *btn = [[UIButton alloc]init];
    btn.frame = CGRectMake(100, 100, 200, 100);
    //旧图片
    UIImage *image = [UIImage imageNamed:@"common_button_blue_highlighted"];

    //可以指定平铺还是拉伸,得到一张新图片
    //指定受保护的区域
    UIEdgeInsets insets = UIEdgeInsetsMake(5, 5, 5, 5);
    UIImage *newImage =  [image resizableImageWithCapInsets:insets resizingMode:UIImageResizingModeStretch];

    //按钮设置背景
    [btn setBackgroundImage:newImage forState:UIControlStateNormal];

    [self.view addSubview:btn];

}

对于图片的处理还有很多,大家可以上网搜索,这里给大家推荐一篇:

http://blog.csdn.net/hastar521/article/details/49122607

时间: 2024-10-10 09:24:04

iOS UI基础控件之UIImageView的相关文章

iOS UI基础控件之UIView 详解

UIView 简介 什么是UIView UIView是窗口上的一块区域,是iOS中所有控件的基类,我们在app中所有能看见的都是直接或间接继承与UIView的.我们把UIView叫做视图. UIView的作用 负责内部区域的内容渲染. 负责内部区域的触摸事件. 管理本身的所有子视图. 处理基本的动画. UIView创建与使用 创建UIView //通过frame创建View UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100,

UI基础控件UIButton

一:UI基础 Button控件 1,简单说明:UIView和UIViewController间的关系 一个应用并不一定要有UIViewController,但是为了管理界面事件(比如按钮点击事件)一般我们在创建应用时要先创建控制器,控制器拥有一个UIView属性. UIView用来展示数据.及用户输入数据.监听事件的触发(比如按钮的touchupinside事件) 而控制可以用来处理这些事件,赋值UIView的管理. 按钮可以展示文字和图片,也就是说按钮具有这些属性. 2,按钮的三种状态 nor

IOS(一) 基础控件的介绍以及使用

IOS的界面的制作,相对于Android来说 简洁了很多,虽然创建布局的方式都是两种(代码创建.布局文件) 但是Android中的xml布局文件在某些方面也属于代码创建,因为自己使用到得每一个属性 都需要记忆属性名,然后利用快捷键的方式来进行引入 ,例如 @android: ...的方式导出,如果自身不知道该用什么方法,在设计界面的时候很难达到自己想要的结果 而IOS的布局文件,所有的属性均在xcode的属性栏中,只需要根据自己的需要进行修改,即可 例如一个基本的TextView: 2.采用MV

UI基础-UI基础控件(一)

一.UIView 1.简单说明 曾经有人这么说过,在iphone里你看到的,摸到的,都是UIView,所以UIView在iphone开发里具有非常重要的作用. 2.常见属性 1.frame 位置和尺寸(以父控件的左上角为原点(0, 0)) 2.center 中点 3.bounds 位置和尺寸(以自己的左上角为原点(0, 0)) 4.transform 形变属性(缩放, 旋转) 5.background 背景颜色 6.tag 标识(父控件可以根据这个标识找到对应的子控件,同一个父控件中的子控件不要

???01-UIKIT基础控件小结

iOS开发概述 cocos体系结构,一共有四层框架,要调用不同的功能,需要使用不同的框架.前期主要学习cocos touch层的UIKit框架 iOS和android的对比 ü   iOS是基于UINX,用C语言开发的,直接与系统底层交互,性能高 ü   andorid是基于Linux,用Java语言开发,基于虚拟机运行,性能差 UI基础控件 1.    UILabel——标签 作用:显示文字 属性: text属性:是label的文字 alignment属性:对齐方式 lines属性:如果为0,

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

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?没错,它的大小你设置是无效的,系统会为你分

Cocos2d-JS studio基础控件的使用

在studio里把几个基础控件往场景文件一拖,然后导出json格式的资源文件 逻辑代码如下: 1 var HelloWorldLayer = cc.Layer.extend({ 2 sprite:null, 3 value : 90, 4 // self : this, 5 ctor:function () { 6 ////////////////////////////// 7 // 1. super init first 8 this._super(); 9 10 /////////////