zoukankan      html  css  js  c++  java
  • 【IOS实例小计】UIImageView

    预备知识

    UIImage

    是一个专门存储图片数据的对象,默认兼容的图片格式是 PNG,可以通过文件、Quartz image对象或 image Data数据得到一个图片对象。

    UIImage相关功能比较多,除了代表图片数据外,还可以对图片中的数据进行处理,从而产生不同的图片效果。

     

    UIImage创建

    用UIImage加载图像的方法很多,最常用的是下面四种:

     一、从当前工程目录中得到图片,用imageNamed函数

    [UIImage imageNamed:ImageName];

    [UIImage imageNamed:@"a.png"]; 

     二、从数据库得到图片、用NSData的方式加载,一般从数据库读取图片使用,例如: 

    NSString *filePath = [[NSBundle mainBundle]pathForResource:fileName ofType:extension];

    NSData *image = [NSDatadataWithContentsOfFile:filePath];

    [UIImage imageWithData:image]; 

    三,从文件目录中得到图片,使用[UIImage imageWithContentOfFile:] 或者[imageinitWithContentOfFile:] 

    NSString *filePath = [[NSBundle mainBundle]pathForResource:fileName ofType:@"图片扩展名"];

    [UIImage imageWithContentsOfFile:aImagePath]; 

    //绑定文件夹中  icon.png 的图片

    NSString *path = [[NSBundle mainBundle]pathForResource:@”icon”ofType:@”png”];

    NSImage *myImage = [UIImageimageWithContentsOfFile:path];   

    四、从网络得到图片

    UIImage *image = [[UIImage alloc]initWithData:[NSData dataWithContentsOfURL[NSURLURLWithString:@"http://www.2cto.com/uploadfile/2013/0702/20130702085459778.jpg"]]]; 

    UIImageView *imageView = [[UIImageView alloc]initWithImage:image];

    UIImageView 

    UIImageView:可以通过UIImage加载图片赋给UIImageView,加载后你可以指定显示的位置和大小。 

     

    1、初始化 

    UIImageView *imageView = [[UIImageView alloc]      initWithFrame:CGRectMake(0.0,45.0,300,300)]; 

    imageView.image = [UIImageimageNamed:@"a.png"];//加载入图片 

    [self.view addSubView:image]; 

    [imageView release]; 

    //imageNamed方法是不能通过路径进行加载图片的,此方式容易引起发生内存警告从而导致自动退出的问题。

    //最好是通过直接读取文件路径[UIImageimageWithContentsOfFile]解决掉这个问题.

    NSImage *image = [[NSImagealloc]initWithContentsOfURL:(NSURL *)]; 

    NSImage *image = [[NSImagealloc]initWithContentsOfFile:(NSString *)]; 

    //让一个UIImageView响应点击事件 

    //创建一个指定大小的图片区域

    UIImageView *imgView =[[UIImageView alloc]initWithFrame:CGRectMake(0, 0,320, 44)];

    //允许用户操作该 区域

    imgView.userInteractionEnabled=YES;

    //创建用户“轻击手势”的响应,并通过 @selector() 指定,用户点击后调用的方法

    UITapGestureRecognizer *singleTap=[[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(onClickImage)];

    //把手势对象,添加给视图对象

    [imgView addGestureRecognizer:singleTap];

    //释放资源

    [singleTap release];  

    -(void)onClickImage{

       //here, do whatever you wantto do

       NSLog(@"imageview is clicked!");

    }

     

    1)用imageNamed的方式加载时,系统会把图像Cache到内存。如果图像比较大,或者图像比较多,用这种方式会消耗很大的内存,而且释放图像的内存是一件相对来说比较麻烦的事情。例如:如果利用imageNamed的方式加载图像到一个动态数组NSMutableArray,然后将将数组赋予一个UIView的对象的animationImages进行逐帧动画,那么这将会很有可能造成内存泄露。并且释放图像所占据的内存也不会那么简单。但是利用imageNamed加载图像也有自己的优势。对于同一个图像系统只会把它Cache到内存一次,这对于图像的重复利用是非常有优势的。例如:你需要在一个TableView里重复加载同样一个图标,那么用imageNamed加载图像,系统会把那个图标Cache到内存,在Table里每次利用那个图像的时候,只会把图片指针指向同一块内存。这种情况使用imageNamed加载图像就会变得非常有效。

     2)利用NSData方式加载时,图像会被系统以数据方式加载到程序。当你不需要重用该图像,或者你需要将图像以数据方式存储到数据库,又或者你要通过网络下载一个很大的图像时,请尽量使用imageWithData的方式加载图像。

    用NSTimer去实现apple的UIImageView animation的效果(这是一种解决办法)

    扩展:

    为UIImageView增加手势

    [ImageView addGestureRecognizer:我们自己的手势recognizer];

    如何创建一个手势?看看UITapGestureRecognizer 的用法吧


     //单指单击

     UITapGestureRecognizer *singleFingerOne = [[UITapGestureRecognizer alloc] initWithTarget:self
     action:@selector(handleSingleFingerEvent:)];
     singleFingerOne.numberOfTouchesRequired = 1; //手指数
     singleFingerOne.numberOfTapsRequired = 1; //tap次数
     singleFingerOne.delegate= self;
     
     //单指双击
     UITapGestureRecognizer *singleFingerTwo = [[UITapGestureRecognizer alloc] initWithTarget:self
     action:@selector(handleSingleFingerEvent:)];
     singleFingerTwo.numberOfTouchesRequired = 1;
     singleFingerTwo.numberOfTapsRequired = 2;
     singleFingerTwo.delegate= self;
     
     //双指单击
     UITapGestureRecognizer *doubleFingerOne = [[UITapGestureRecognizer alloc] initWithTarget:self
     action:@selector(handleDoubleFingerEvent:)];
     doubleFingerOne.numberOfTouchesRequired = 2;
     doubleFingerOne.numberOfTapsRequired = 1;
     doubleFingerOne.delegate= self;
     
     UITapGestureRecognizer *doubleFingerTwo = [[UITapGestureRecognizer alloc] initWithTarget:self
     action:@selector(handleDoubleFingerEvent:)];
     doubleFingerTwo.numberOfTouchesRequired = 2;
     doubleFingerTwo.numberOfTapsRequired = 2;
     doubleFingerTwo.delegate= self;
     
     //如果不加下面的话,当单指双击时,会先调用单指单击中的处理,再调用单指双击中的处理
     [singleFingerOne requireGestureRecognizerToFail:singleFingerTwo];
     //同理双指亦是如此
     [doubleFingerOne requireGestureRecognizerToFail:doubleFingerTwo];
     
     [self.view addGestureRecognizer:singleFingerOne];
     [self.view addGestureRecognizer:singleFingerTwo];
     [self.view addGestureRecognizer:doubleFingerOne];
     [self.view addGestureRecognizer:doubleFingerTwo];
     
     [singleFingerOne release];
     [singleFingerTwo release];
     [doubleFingerOne release];
     [doubleFingerTwo release];

    处理事件的方法,代码:

     //处理单指事件
    - (void)handleSingleFingerEvent:(UITapGestureRecognizer *)sender
    {
    if(sender.numberOfTapsRequired == 1) {
    //单指单击
    NSLog(@"单指单击");
     }elseif(sender.numberOfTapsRequired == 2){
    //单指双击
    NSLog(@"单指双击");
    }
     }
     //处理双指事件
     - (void)handleDoubleFingerEvent:(UITapGestureRecognizer *)sender
     {
     if(sender.numberOfTapsRequired == 1) {
     //双指单击
     NSLog(@"双指单击");
     }elseif(sender.numberOfTapsRequired == 2){
     //双指双击
     NSLog(@"双指双击");
     }
     }

    参考:

    http://www.2cto.com/kf/201307/224346.html

    http://blog.sina.com.cn/s/blog_60e2dbcf01014bfm.html

  • 相关阅读:
    在这个互联网泡沫时代,施主你有何焦虑?
    对于公司最近一次技术分享的总结
    Windows系统下Redis的安装
    论语
    系统的简单和复杂是由什么决定的?
    Swift之 ? 和 !
    div模拟table,可实现左右高度同增长(html布局)
    动态添加的无缝轮播
    根据数据库名获取表和字段信息(mysql版)
    博客园更新了?
  • 原文地址:https://www.cnblogs.com/james1207/p/3301861.html
Copyright © 2011-2022 走看看