亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS開發中使用Quartz2D繪圖及自定義UIImageView控件

2020-07-26 03:31:52
字體:
來源:轉載
供稿:網友

繪制基本圖形
一、簡單說明

圖形上下文(Graphics Context):是一個CGContextRef類型的數據

圖形上下文的作用:保存繪圖信息、繪圖狀態

決定繪制的輸出目標(繪制到什么地方去?)(輸出目標可以是PDF文件、Bitmap或者顯示器的窗口上)

2015112094942852.png (634×127)

相同的一套繪圖序列,指定不同的Graphics Context,就可將相同的圖像繪制到不同的目標上。

2015112095009895.png (341×334)

Quartz2D提供了以下幾種類型的Graphics Context:

Bitmap Graphics Context

PDF Graphics Context

Window Graphics Context

Layer Graphics Context

Printer Graphics Context

只要上下文不同,繪制的地方就不同。

本文說明如何把圖片繪制到Bitmap上面去,即要求生成一張圖片,圖片上面保存了繪圖信息。

Bitmap就是圖片,相當于系統的UIimage。一個UIImage就是一個Bitmap

 

二、怎么把圖片繪制到Bitmap上?

注意:不能在drawRect:方法中直接獲取Bitmap的上下文,需要我們自己進行創建。

代碼示例:

復制代碼 代碼如下:

//
//  YYViewController.m
//  06-繪制基本圖形
//
//  Created by apple on 14-6-22.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"

@interface YYViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *iv;
@end


復制代碼 代碼如下:

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    //加載圖片
    //0.創建一個Bitmap上下文
    //c語言的方法
//    CGBitmapContextCreate(<#void *data#>, <#size_t width#>, <#size_t height#>, <#size_t bitsPerComponent#>, <#size_t bytesPerRow#>, <#CGColorSpaceRef space#>, <#CGBitmapInfo bitmapInfo#>)
    //oc中封裝的方法
    //方法1
//    UIGraphicsBeginImageContext(<#CGSize size#>);
    //方法2
    UIGraphicsBeginImageContextWithOptions( CGSizeMake(200, 200), NO, 0);
    //1.獲取bitmap上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    //2.繪圖(畫一個圓)
    CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 100, 100));
    //3.渲染
    CGContextStrokePath(ctx);
    //4.獲取生成的圖片
    UIImage *image=UIGraphicsGetImageFromCurrentImageContext();
    //5.顯示生成的圖片到imageview
    self.iv.image=image;
    //6.保存繪制好的圖片到文件中
    //先將圖片轉換為二進制數據,然后再將圖片寫到文件中
//    UIImageJPEGRepresentation(image, 1); //第二個參數為保存的圖片的效果
    NSData *data=UIImagePNGRepresentation(image);
    [data writeToFile:@"/Users/apple/Desktop/abc.png" atomically:YES];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end


程序執行效果:

2015112095029392.png (317×500)

程序執行完畢后,會在指定的位置創建一個abc.png的圖片

2015112095044226.png (676×509)

補充說明:

1.創建Bitmap圖形上下文的方法

復制代碼 代碼如下:

  //方法1   UIGraphicsBeginImageContext(<#CGSize size#>);

  //方法2 UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale)


使用兩個方法同樣都可以創建,但是使用第一個方法將來創建的圖片清晰度和質量沒有第二種方法的好。
方法2接收三個參數:
CGSize size:指定將來創建出來的bitmap的大小

BOOL opaque:設置透明YES代表透明,NO代表不透明

CGFloat scale:代表縮放,0代表不縮放

創建出來的bitmap就對應一個UIImage對象

 

2.Quartz2D的內存管理

使用含有“Create”或“Copy”的函數創建的對象,使用完后必須釋放,否則將導致內存泄露

使用不含有“Create”或“Copy”的函數獲取的對象,則不需要釋放

如果retain了一個對象,不再使用時,需要將其release掉

可以使用Quartz 2D的函數來指定retain和release一個對象。例如,如果創建了一個CGColorSpace對象,則使用函數CGColorSpaceRetain和CGColorSpaceRelease來retain和release對象。

也可以使用Core Foundation的CFRetain和CFRelease。注意不能傳遞NULL值給這些函數

自定義UIImageView控件

一、實現思路

Quartz2D最大的用途在于自定義View(自定義UI控件),當系統的View不能滿足我們使用需求的時候,自定義View。
使用Quartz2D自定義View,可以從模仿系統的ImageView的使用開始。
需求驅動開發:模仿系統的imageview的使用過程
1.創建
2.設置圖片
3.設置frame
4.把創建的自定義的view添加到界面上(在自定義的View中,需要一個image屬性接收image圖片參數->5)。
5.添加一個image屬性(接下來,拿到image之后,應該把拿到的這個image給渲染出來。怎么渲染?自定義的view怎么把圖片顯示出來?->把圖片給畫出來,所以需要重寫自定義View的drawRect:方法)。
6.重寫自定義View的drawRect:方法,在該方法內部畫出圖形。
二、代碼實現

復制代碼 代碼如下:

  系統自帶的ImageView的使用
//
//  YYViewController.m
//  02-自定義UIimageview
//
//  Created by apple on 14-6-22.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"

@interface YYViewController ()

@end

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    //系統的UIImageview的使用
//    1.創建一個UIImageView
    UIImageView *iv=[[UIImageView alloc]init];
//    2.設置圖片
    iv.image=[UIImage imageNamed:@"me"];
//    3.設置frame
    iv.frame=CGRectMake(100, 100, 100, 100);
//    4.把創建的自定義的view添加到界面上
    [self.view addSubview:iv];
}
@end


實現效果:

2015112095107424.png (321×503)

使用Quartz2D自定義View,代碼如下:

新建一個自定義的類,讓其繼承自UIView,YYimageView.h文件代碼如下:

復制代碼 代碼如下:

//
//  YYimageView.m
//  02-自定義UIimageview
//
//  Created by apple on 14-6-22.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYimageView.h"

@implementation YYimageView

//重寫drawRect:方法
- (void)drawRect:(CGRect)rect
{
    [self.image drawInRect:rect];
}

@end


在主控制器中,模仿系統自帶的UIImageView的使用過程,實現同樣的效果。
復制代碼 代碼如下:

//
//  YYViewController.m
//  02-自定義UIimageview
//
//  Created by apple on 14-6-22.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"
#import "YYimageView.h"

@interface YYViewController ()

@end


復制代碼 代碼如下:

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
   
//    //系統的UIImageview的使用
////    1.創建一個UIImageView
//    UIImageView *iv=[[UIImageView alloc]init];
////    2.設置圖片
//    iv.image=[UIImage imageNamed:@"me"];
////    3.設置frame
//    iv.frame=CGRectMake(100, 100, 100, 100);
////    4.把創建的自定義的view添加到界面上
//    [self.view addSubview:iv];
   
   
    //自定義UIImageView
    //1.創建
    //2.設置圖片
    //3.設置frame
    //4.把創建的自定義的view添加到界面上
    YYimageView *yyiv=[[YYimageView alloc]init];
    yyiv.image=[UIImage imageNamed:@"me"];
    yyiv.frame=CGRectMake(100, 100, 100, 100);
    [self.view addSubview:yyiv];

}
@end


三、完善

存在的問題?

在界面上,添加一個按鈕,要求點擊按鈕,能夠實現圖片的切換。

復制代碼 代碼如下:

//
//  YYViewController.m
//  02-自定義UIimageview
//
//  Created by apple on 14-6-22.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"
#import "YYimageView.h"

@interface YYViewController ()
@property(nonatomic,strong)UIImageView *imageView;
@end


復制代碼 代碼如下:

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
   
    //系統的UIImageview的使用
//    1.創建一個UIImageView
    UIImageView *iv=[[UIImageView alloc]init];
//    2.設置圖片
    iv.image=[UIImage imageNamed:@"me"];
//    3.設置frame
    iv.frame=CGRectMake(100, 100, 100, 100);
//    4.把創建的自定義的view添加到界面上
    [self.view addSubview:iv];
    self.imageView=iv;
   
   
    //自定義UIImageView
    //1.創建
    //2.設置圖片
    //3.設置frame
    //4.把創建的自定義的view添加到界面上
//    YYimageView *yyiv=[[YYimageView alloc]init];
//    yyiv.image=[UIImage imageNamed:@"me"];
//    yyiv.frame=CGRectMake(100, 100, 100, 100);
//    [self.view addSubview:yyiv];
   
    //添加一個button按鈕,當點擊button按鈕的時候,切換圖片
    UIButton *btn=[[UIButton alloc]initWithFrame:CGRectMake(100, 300, 100, 50)];
    [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [btn setTitle:@"點擊切換" forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];

}

-(void)btnClick
{
    UIImage *image=[UIImage imageNamed:@"psb.jpeg"];
    self.imageView.image=image;
}
@end


點擊按鈕后,實現圖片的切換。

2015112095131144.png (319×497)

說明:系統的UIimage可以替換。而自定義imageview不會變換,因為自定義的view要想換圖片,需要重新繪制并渲染一次圖片。所以在拿到替換圖片的時候,需要重新繪制一次圖片,重寫setimage方法。
完善后的代碼如下:

主控制器中,YYViewController.m文件的代碼:

復制代碼 代碼如下:

//
//  YYViewController.m
//  02-自定義UIimageview
//
//  Created by apple on 14-6-22.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"
#import "YYimageView.h"

@interface YYViewController ()
@property(nonatomic,strong)UIImageView *imageView;
@property(nonatomic,strong)YYimageView *yyimageView;
@end


復制代碼 代碼如下:

@implementation YYViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
   
//    //系統的UIImageview的使用
////    1.創建一個UIImageView
//    UIImageView *iv=[[UIImageView alloc]init];
////    2.設置圖片
//    iv.image=[UIImage imageNamed:@"me"];
////    3.設置frame
//    iv.frame=CGRectMake(100, 100, 100, 100);
////    4.把創建的自定義的view添加到界面上
//    [self.view addSubview:iv];
//    self.imageView=iv;
   
   
    //自定義UIImageView
    //1.創建
    //2.設置圖片
    //3.設置frame
    //4.把創建的自定義的view添加到界面上
    YYimageView *yyiv=[[YYimageView alloc]init];
    yyiv.image=[UIImage imageNamed:@"me"];
    yyiv.frame=CGRectMake(100, 100, 100, 100);
    [self.view addSubview:yyiv];
    self.yyimageView=yyiv;
   
    //添加一個button按鈕,當點擊button按鈕的時候,切換圖片
    UIButton *btn=[[UIButton alloc]initWithFrame:CGRectMake(100, 300, 100, 50)];
    [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [btn setTitle:@"點擊切換" forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];

}

-(void)btnClick
{
    NSLog(@"按鈕被點擊了");
    UIImage *image=[UIImage imageNamed:@"psb.jpeg"];
//    self.imageView.image=image;
    self.yyimageView.image=image;
}
@end


YYimageView.m文件的代碼:
復制代碼 代碼如下:

//
//  YYimageView.m
//  02-自定義UIimageview
//
//  Created by apple on 14-6-22.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYimageView.h"

@implementation YYimageView

//重寫drawRect:方法
- (void)drawRect:(CGRect)rect
{
    [self.image drawInRect:rect];
}

//重寫set方法
-(void)setImage:(UIImage *)image
{
    _image=image;
    [self setNeedsDisplay];
}
@end

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人精品在线视频| 色综合久久久888| …久久精品99久久香蕉国产| 日本91av在线播放| 这里只有视频精品| 亚洲老头老太hd| 色午夜这里只有精品| 国产91免费看片| 欧美在线www| 4438全国成人免费| 高清欧美性猛交xxxx黑人猛交| 深夜精品寂寞黄网站在线观看| 国产精品一区二区性色av| 国产99久久精品一区二区 夜夜躁日日躁| 国产精品高潮呻吟久久av黑人| 亚洲欧美日韩综合| 久久久成人的性感天堂| 欧美裸体xxxx极品少妇| 久久久久中文字幕2018| 成人激情在线播放| 日韩大片在线观看视频| 在线播放国产一区中文字幕剧情欧美| 在线观看日韩www视频免费| 粉嫩av一区二区三区免费野| 亚洲精品国产品国语在线| 国产精品高潮粉嫩av| 亚洲a区在线视频| 日韩精品在线电影| 亚洲精品美女网站| 欧美中文在线观看国产| 日本中文字幕不卡免费| 日本高清视频精品| 麻豆国产精品va在线观看不卡| 51ⅴ精品国产91久久久久久| 欧美日韩成人网| 九九热精品在线| 欧美另类69精品久久久久9999| 亚洲精品美女久久| 国产91精品久久久久久久| 国产成人精品视频在线观看| 精品国产老师黑色丝袜高跟鞋| 久久视频在线观看免费| 91精品久久久久久久久不口人| 亚洲va久久久噜噜噜| 成人黄色激情网| 日韩一级黄色av| 亚洲欧洲午夜一线一品| 久久精品国产一区二区电影| 欧美极品少妇xxxxⅹ免费视频| 亚洲激情在线视频| 亚洲精品97久久| 2019国产精品自在线拍国产不卡| 色综合久久精品亚洲国产| 日韩免费在线观看视频| 日韩中文字幕不卡视频| 日韩精品视频中文在线观看| 亚洲香蕉av在线一区二区三区| 欧美丰满老妇厨房牲生活| 亚洲精品91美女久久久久久久| 日本一区二区在线免费播放| 欧美理论电影在线观看| 久久久久久久久久亚洲| 亚洲aa中文字幕| 欧美一级在线亚洲天堂| 亚洲一区二区黄| 中文字幕日韩视频| 国产精品吹潮在线观看| 国产精品欧美在线| 欧美一区二区大胆人体摄影专业网站| 欧美人与性动交| 久久好看免费视频| 国产成人精品免费视频| 日韩在线观看高清| 成人啪啪免费看| 亚洲国产日韩精品在线| 欧美一级黑人aaaaaaa做受| 欧美午夜www高清视频| 亚洲韩国青草视频| 国内精品400部情侣激情| 亚洲人成电影在线| 亚洲精品成人久久久| 久久伊人免费视频| 国产美女精品视频免费观看| 久久精品视频中文字幕| 91色视频在线观看| 国内伊人久久久久久网站视频| 国产精品最新在线观看| 久久91精品国产91久久久| 欧美大片大片在线播放| 福利视频导航一区| 日韩成人中文字幕| 久久久在线免费观看| 色樱桃影院亚洲精品影院| 岛国视频午夜一区免费在线观看| 欧美日韩成人精品| 日韩在线精品一区| 久久久久久久久久久成人| 国产精品视频资源| 日韩视频一区在线| 成人观看高清在线观看免费| 亚洲视频在线观看视频| 国产精品久久久久久久久久东京| 97涩涩爰在线观看亚洲| 国产亚洲视频在线| 亚洲第一免费网站| 欧洲美女7788成人免费视频| 97精品免费视频| 久久成人综合视频| 久久久久久久久久久亚洲| 在线成人一区二区| 精品丝袜一区二区三区| 最近2019中文字幕在线高清| 91美女高潮出水| 国产成人精品电影久久久| 最近2019年中文视频免费在线观看| 欧美激情伊人电影| 国产成人在线视频| 久久69精品久久久久久久电影好| 国产欧美亚洲精品| 欧美激情视频网站| 亚洲电影中文字幕| 久久久www成人免费精品| 欧美激情在线播放| 欧美电影免费看| 日韩成人中文电影| 日韩中文字幕国产精品| 精品久久久一区| 国产精品爽爽爽爽爽爽在线观看| 亚洲一区二区黄| 国产欧美日韩亚洲精品| 国产成人精品久久二区二区| 国产精品九九久久久久久久| 国产精品中文字幕久久久| 97国产suv精品一区二区62| 亚洲人成绝费网站色www| 日韩不卡中文字幕| 亚洲精品视频在线播放| 日本成人免费在线| 久久久久久中文字幕| 日韩亚洲欧美成人| 欧美亚洲在线播放| 精品国产欧美一区二区五十路| 日韩大片免费观看视频播放| 色婷婷av一区二区三区在线观看| 久久九九精品99国产精品| 亚洲欧美综合另类中字| 欧美激情亚洲精品| 成人xxxxx| 日韩一区二区三区国产| 亚洲欧美另类在线观看| 欧美小视频在线| 国产日韩欧美日韩大片| 日韩av在线免播放器| 91午夜理伦私人影院| 91精品国产乱码久久久久久久久| 日韩亚洲国产中文字幕| 欧美一区三区三区高中清蜜桃| 国产久一一精品| 国产97在线播放| 久久成人亚洲精品| 亚洲国产日韩欧美在线99| 欧美精品电影在线| 色哟哟入口国产精品| 国产精品久久久久久久久久久久久久|