iOS 動畫 第二章 寄宿圖

[self liveInImage];
- (void)liveInImage {
    UIView *layerV = [[UIView alloc] init];
    layerV.frame = CGRectMake(20.0f, 20.0f, 200.0f, 300.0f);
    layerV.backgroundColor = [UIColor blackColor];
    [self.view addSubview:layerV];
    
    /*
    //contents屬性:如果你給contents賦的不是CGImage萍恕,那么你得到的圖層將是空白的
    //你真正要賦值的類型應(yīng)該是CGImageRef逸嘀,它是一個指向CGImage結(jié)構(gòu)的指針。UIImage有一個CGImage屬性允粤,它返回一個"CGImageRef",如果你想把這個值直接賦值給CALayer的contents崭倘,那你將會得到一個編譯錯誤。因為CGImageRef并不是一個真正的Cocoa對象类垫,而是一個Core Foundation類型司光。
    //layer.contents = (__bridge id)image.CGImage;//如果你沒有使用ARC(自動引用計數(shù)),你就不需要__bridge這部分悉患。但是残家,你干嘛不用ARC?售躁!
    
    UIImage *image = [UIImage imageNamed:@"Meal"];
    layerV.layer.contents = (__bridge id)image.CGImage;
    
    //contentGravity:CALayer與contentMode對應(yīng)的屬性叫做contentsGravity, 但是它是一個NSString類型
    //layerV.layer.contentsGravity = kCAGravityResizeAspect;
    
    //contentsScale:屬性定義了寄宿圖的像素尺寸和視圖大小的比例,默認(rèn)情況下它是一個值為1.0的浮點數(shù).
    //如果你只是單純地想放大圖層的contents圖片坞淮,你可以通過使用圖層的transform和affineTransform屬性來達(dá)到這個目的.
    //UIView有一個類似功能但是非常少用到的contentScaleFactor屬性。
    layerV.layer.contentsGravity = kCAGravityCenter;
    layerV.layer.contentsScale = image.scale;
    
    //maskToBounds:UIView有一個叫做clipsToBounds的屬性可以用來決定是否顯示超出邊界的內(nèi)容陪捷,CALayer對應(yīng)的屬性叫做masksToBounds
    layerV.layer.masksToBounds = YES;
    
    //contentsRect:CALayer的contentsRect屬性允許我們在圖層邊框里顯示寄宿圖的一個子域回窘。
    //它使用了單位坐標(biāo),單位坐標(biāo)指定在0到1之間市袖,是一個相對值(像素和點就是絕對值)啡直。默認(rèn)的contentsRect是{0, 0, 1, 1}
    //contentsRect在app中最有趣的地方在于一個叫做image sprites(圖片拼合)的用法。
    UIView *coneView = [[UIView alloc] init];
    coneView.frame = CGRectMake(20.f, 20.0f, 50.0f, 50.0f);
    [self.view addSubview:coneView];
    [self addSpriteImage:image ContentRect:CGRectMake(0, 0, 0.5, 0.5) toLayer:coneView.layer];
    
    UIView *shipView = [[UIView alloc] init];
    shipView.frame = CGRectMake(100.0f, 30.0f, 50.0f, 50.0f);
    [self.view addSubview:shipView];
    [self addSpriteImage:image ContentRect:CGRectMake(0.5, 0, 0.5, 0.5) toLayer:shipView.layer];

    
    UIView *iglooView = [[UIView alloc] init];
    iglooView.frame = CGRectMake(60.0f, 100.0f, 50.0f, 50.0f);
    [self.view addSubview:iglooView];
    [self addSpriteImage:image ContentRect:CGRectMake(0, 0.5, 0.5, 0.5) toLayer:iglooView.layer];

    
    UIView *anchorView = [[UIView alloc] init];
    anchorView.frame = CGRectMake(120.0f, 100.0f, 50.0f, 50.0f);
    [self.view addSubview:anchorView];
    [self addSpriteImage:image ContentRect:CGRectMake(0.5, 0.5, 0.5, 0.5) toLayer:anchorView.layer];
    
    //contentsCenter:contentsCenter其實是一個CGRect凌盯,它定義了一個固定的邊框和一個在圖層上可拉伸的區(qū)域付枫。contentsCenter是{0, 0, 1, 1}
    UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeCustom];
    btn1.frame = CGRectMake(20.0f, 200.0, 200.0f, 200.0f);
    [self.view addSubview:btn1];
    [self addStretchableImage:image contentCenter:CGRectMake(0.0, 0.0, 0.5, 0.5) toLayer:btn1.layer];
    
    UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeCustom];
    btn2.frame = CGRectMake(120.0f, 400.0, 200.0f, 200.0f);
    [self.view addSubview:btn2];
    [self addStretchableImage:image contentCenter:CGRectMake(0.25, 0.25, 0.5, 0.5) toLayer:btn2.layer];
     */
    
    //Custome Drawing
    //可以直接用Core Graphics直接繪制寄宿圖。能夠通過繼承UIView并實現(xiàn)-drawRect:方法來自定義繪制驰怎。
    //如果UIView檢測到-drawRect: 方法被調(diào)用了阐滩,它就會為視圖分配一個寄宿圖,這個寄宿圖的像素尺寸等于視圖大小乘以 contentsScale的值县忌。
    //-drawRect:方法里面的代碼利用Core Graphics去繪制一個寄宿圖掂榔,然后內(nèi)容就會被緩存起來直到它需要被更新
    
    //CALayer有一個可選的delegate屬性,實現(xiàn)了CALayerDelegate協(xié)議症杏,當(dāng)CALayer需要一個內(nèi)容特定的信息時装获,就會從協(xié)議中請求。
    
    //當(dāng)需要被重繪時厉颤,CALayer會請求它的代理給他一個寄宿圖來顯示穴豫。它通過調(diào)用下面這個方法做到的:
    //(void)displayLayer:(CALayerCALayer *)layer;
    //如果代理不實現(xiàn)-displayLayer:方法,CALayer就會轉(zhuǎn)而嘗試調(diào)用下面這個方法:
    //- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;
    
    //在調(diào)用這個方法之前,CALayer創(chuàng)建了一個合適尺寸的空寄宿圖(尺寸由bounds和contentsScale決定)和一個Core Graphics的繪制上下文環(huán)境精肃,為繪制寄宿圖做準(zhǔn)備秤涩,他作為ctx參數(shù)傳入。
    //create sublayer
    CALayer *blueLayer = [CALayer layer];
    blueLayer.frame = CGRectMake(50.f, 50.0f, 100.0f, 100.0f);
    blueLayer.backgroundColor = [[UIColor blueColor] CGColor];
    
    //set controller as layer delegate
    blueLayer.delegate = self;
    
    //ensure that layer backing image uses correct scale
    blueLayer.contentsScale = [UIScreen mainScreen].scale;
    
    //add layer to our view
    [layerV.layer addSublayer:blueLayer];
    
    //force layer to redraw
    [blueLayer display];
}

- (void)addSpriteImage:(UIImage *)image ContentRect:(CGRect )rect toLayer:(CALayer *)layer {
    layer.contents = (__bridge id)image.CGImage;
    layer.contentsGravity = kCAGravityResizeAspect;
    layer.contentsRect = rect;
}

- (void)addStretchableImage:(UIImage *)image contentCenter:(CGRect )rect toLayer:(CALayer *)layer {
    layer.contents = (__bridge id)image.CGImage;
    layer.contentsCenter = rect;
}

#pragma mark CALayerDelegate
/*
 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
    //draw a thick red circle
    CGContextSetLineWidth(ctx, 10.0f);
    CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor);
    CGContextStrokeEllipseInRect(ctx, layer.bounds);
}
*/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末司抱,一起剝皮案震驚了整個濱河市筐眷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌习柠,老刑警劉巖匀谣,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異资溃,居然都是意外死亡武翎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門肉拓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來后频,“玉大人,你說我怎么就攤上這事暖途”跋В” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵驻售,是天一觀的道長露久。 經(jīng)常有香客問我,道長欺栗,這世上最難降的妖魔是什么毫痕? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮迟几,結(jié)果婚禮上消请,老公的妹妹穿的比我還像新娘。我一直安慰自己类腮,他們只是感情好臊泰,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蚜枢,像睡著了一般缸逃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厂抽,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天需频,我揣著相機(jī)與錄音,去河邊找鬼筷凤。 笑死昭殉,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饲化,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼莽鸭,長吁一口氣:“原來是場噩夢啊……” “哼吗伤!你這毒婦竟也來了吃靠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤足淆,失蹤者是張志新(化名)和其女友劉穎巢块,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巧号,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡族奢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了丹鸿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片越走。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖靠欢,靈堂內(nèi)的尸體忽然破棺而出廊敌,到底是詐尸還是另有隱情,我是刑警寧澤门怪,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布骡澈,位于F島的核電站,受9級特大地震影響掷空,放射性物質(zhì)發(fā)生泄漏肋殴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一坦弟、第九天 我趴在偏房一處隱蔽的房頂上張望护锤。 院中可真熱鬧,春花似錦酿傍、人聲如沸烙懦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽修陡。三九已至,卻和暖如春可霎,著一層夾襖步出監(jiān)牢的瞬間魄鸦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工癣朗, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留拾因,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像绢记,于是被迫代替她去往敵國和親扁达。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

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