iOS繪畫的三種方式

第一種繪圖形式:在UIView的子類方法drawRect:中繪制一個藍色圓齿椅,使用UIKit在Cocoa為我們提供的當前上下文中完成繪圖任務(wù)。

- (void) drawRect: (CGRect) rect {

UIBezierPath* p = [UIBezierPathbezierPathWithOvalInRect:CGRectMake(0,0,100,100)];

[[UIColor blueColor] setFill];

[p fill];

}

第二種繪圖形式:使用Core Graphics實現(xiàn)繪制藍色圓。

- (void) drawRect: (CGRect) rect {

CGContextRef con = UIGraphicsGetCurrentContext();

CGContextAddEllipseInRect(con, CGRectMake(0,0,100,100));

CGContextSetFillColorWithColor(con, [UIColor blueColor].CGColor);

CGContextFillPath(con);

}

第三種繪圖方式:我將在UIView子類的drawLayer:inContext:方法中實現(xiàn)繪圖任務(wù)

drawLayer:inContext:方法是一個繪制圖層內(nèi)容的代理方法鲤妥。為了能夠調(diào)用

drawLayer:inContext:方法没酣,我們需要設(shè)定圖層的代理對象。但要注意徽级,不應(yīng)該將UIView對象設(shè)置為顯示層的委托對象,這是因為UIView對象已經(jīng)是隱式層的代理對象聊浅,

再將它設(shè)置為另一個層的委托對象就會出問題餐抢。輕量級的做法是編寫負責繪圖形的代理類。在MyView.h文件中聲明如下代碼:

@interface MyLayerDelegate : NSObject

@end

然后MyView.m文件中實現(xiàn)接口代碼:

@implementation MyLayerDelegate

- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx {

UIGraphicsPushContext(ctx);

UIBezierPath* p = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0,0,100,100)];

[[UIColor blueColor] setFill];

[p fill];

UIGraphicsPopContext();

}

@end

直接將代理類的實現(xiàn)代碼放在MyView.m文件的#import代碼的下面低匙,這樣感覺好像在使用

私有類完成繪圖任務(wù)(雖然這不是私有類)旷痕。需要注意的是,我們需要將引用的上下文轉(zhuǎn)變成當前上下文顽冶。

因為圖層的代理是assign內(nèi)存管理策略欺抗,那么這里就不能以局部變量的形式創(chuàng)建MyLayerDelegate實例對象賦值給圖層代理。這里選擇在MyView.m中增加一個實例變量强重,因為實例變量默認是strong:

@interface MyView () {

MyLayerDelegate* _layerDeleagete;

}

@end

使用該圖層代理:

MyView *myView = [[MyView alloc] initWithFrame: CGRectMake(0, 0, 320, 480)];

CALayer *myLayer = [CALayer layer];

_layerDelegate = [[MyLayerDelegate alloc] init];

myLayer.delegate = _layerDelegate;

[myView.layer addSublayer:myLayer];

[myView setNeedsDisplay]; // 調(diào)用此方法绞呈,drawLayer: inContext:方法才會被調(diào)用。

第四種繪圖形式:使用Core Graphics在drawLayer:inContext:方法中實現(xiàn)同樣操作间景,代碼如下:

- (void)drawLayer:(CALayer*)lay inContext:(CGContextRef)con {

CGContextAddEllipseInRect(con, CGRectMake(0,0,100,100));

CGContextSetFillColorWithColor(con, [UIColor blueColor].CGColor);

CGContextFillPath(con);

}

最后报强,演示UIGraphicsBeginImageContextWithOptions的用法,并從上下文中生成一個UIImage對象拱燃。生成UIImage對象的代碼可以在任何地方被使用秉溉,它沒有上述繪圖方法那樣的限制。

第五種繪圖形式:使用UIKit實現(xiàn):

UIGraphicsBeginImageContextWithOptions(CGSizeMake(100,100), NO, 0);

UIBezierPath* p = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0,0,100,100)];

[[UIColor blueColor] setFill];

[p fill];

UIImage* im = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

解釋一下UIGraphicsBeginImageContextWithOptions函數(shù)參數(shù)的含義:第一個參數(shù)表示所要創(chuàng)建的圖片的尺寸碗誉;第二個參數(shù)用來指定所生成圖片的背景是否為不透明召嘶,如上我們使用YES而不是NO,則我們得到的圖片背景將會是黑色,顯然這不是我想要的哮缺;第三個參數(shù)指定生成圖片的縮放因子弄跌,這個縮放因子與UIImage的scale屬性所指的含義是一致的。傳入0則表示讓圖片的縮放因子根據(jù)屏幕的分辨率而變化尝苇,所以我們得到的圖片不管是在單分辨率還是視網(wǎng)膜屏上看起來都會很好铛只。

第六種繪圖形式:使用Core Graphics實現(xiàn):

UIGraphicsBeginImageContextWithOptions(CGSizeMake(100,100), NO, 0);

CGContextRef con = UIGraphicsGetCurrentContext();

CGContextAddEllipseInRect(con, CGRectMake(0,0,100,100));

CGContextSetFillColorWithColor(con, [UIColor blueColor].CGColor);

CGContextFillPath(con);

UIImage* im = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

UIImage常用的繪圖操作

一個UIImage對象提供了向當前上下文繪制自身的方法埠胖。我們現(xiàn)在已經(jīng)知道如何獲取一個圖片類型的上下文并將它轉(zhuǎn)變當前上下文。

平移操作:下面的代碼展示了如何將UIImage繪制在當前的上下文中淳玩。

UIImage* mars = [UIImage imageNamed:@"Mars.png"];

CGSize sz = [mars size];

UIGraphicsBeginImageContextWithOptions(CGSizeMake(sz.width*2, sz.height), NO, 0);

[mars drawAtPoint:CGPointMake(0,0)];

[mars drawAtPoint:CGPointMake(sz.width,0)];

UIImage* im = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

UIImageView* iv = [[UIImageView alloc] initWithImage:im];

[self.window.rootViewController.view addSubview: iv];

iv.center = self.window.center;

縮放操作:下面代碼展示了如何對UIImage進行縮放操作:

UIImage* mars = [UIImage imageNamed:@"Mars.png"];

CGSize sz = [mars size];

UIGraphicsBeginImageContextWithOptions(CGSizeMake(sz.width*2, sz.height*2), NO, 0);

[mars drawInRect:CGRectMake(0,0,sz.width*2,sz.height*2)];

[mars drawInRect:CGRectMake(sz.width/2.0, sz.height/2.0, sz.width, sz.height) blendMode:kCGBlendModeMultiply alpha:1.0];

UIImage* im = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

裁剪操作:下面代碼展示了如何獲取圖片的右半邊:

UIImage* mars = [UIImage imageNamed:@"Mars.png"];

CGSize sz = [mars size];

UIGraphicsBeginImageContextWithOptions(CGSizeMake(sz.width/2.0, sz.height), NO, 0);

[mars drawAtPoint:CGPointMake(-sz.width/2.0, 0)];

UIImage* im = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末直撤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蜕着,更是在濱河造成了極大的恐慌谋竖,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件承匣,死亡現(xiàn)場離奇詭異蓖乘,居然都是意外死亡,警方通過查閱死者的電腦和手機韧骗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門嘉抒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人袍暴,你說我怎么就攤上這事些侍。” “怎么了容诬?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵娩梨,是天一觀的道長沿腰。 經(jīng)常有香客問我览徒,道長,這世上最難降的妖魔是什么颂龙? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任习蓬,我火速辦了婚禮,結(jié)果婚禮上措嵌,老公的妹妹穿的比我還像新娘躲叼。我一直安慰自己,他們只是感情好企巢,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布枫慷。 她就那樣靜靜地躺著,像睡著了一般浪规。 火紅的嫁衣襯著肌膚如雪或听。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天笋婿,我揣著相機與錄音誉裆,去河邊找鬼。 笑死缸濒,一個胖子當著我的面吹牛足丢,可吹牛的內(nèi)容都是我干的粱腻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼斩跌,長吁一口氣:“原來是場噩夢啊……” “哼绍些!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起滔驶,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤遇革,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后揭糕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萝快,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年著角,在試婚紗的時候發(fā)現(xiàn)自己被綠了揪漩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡吏口,死狀恐怖奄容,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情产徊,我是刑警寧澤昂勒,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站舟铜,受9級特大地震影響戈盈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谆刨,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一塘娶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧痊夭,春花似錦刁岸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至番舆,卻和暖如春酝碳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背合蔽。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工击敌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拴事。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓沃斤,卻偏偏與公主長得像圣蝎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子衡瓶,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容