一張圖片實(shí)現(xiàn)時(shí)鐘(CALayer的contents)


CALayer 有一個(gè)屬性叫做contents,這個(gè)屬性的類型被定義為id,意味著它可以是任何類型的對象。在這種情況下,你可以給contents屬性賦任何值,你的app仍然能夠編譯通過。但是,在實(shí)踐中,如果你給contents賦的不是CGImage,那么你得到的圖層將是空白的。

CALayer的contentsRect屬性允許我們在圖層邊框里顯示寄宿圖的一個(gè)子域。contentsRect不是按點(diǎn)來計(jì)算的,它使用了單位坐標(biāo),單位坐標(biāo)指定在0到1之間,是一個(gè)相對值(像素和點(diǎn)就是絕對值)。所以他們是相對與寄宿圖的尺寸的。默認(rèn)的contentsRect是{0, 0, 1, 1},這意味著整個(gè)寄宿圖默認(rèn)都是可見的,如果我們指定一個(gè)小一點(diǎn)的矩形,圖片就會(huì)被裁剪。

數(shù)字圖

需求

用圖上的數(shù)字來展示一個(gè)時(shí)鐘。原理就是利用contentsRect來展示不同區(qū)域的數(shù)字。

關(guān)鍵代碼

  • 創(chuàng)建時(shí)、分、秒視圖
    // 展示內(nèi)容contents
    UIImage *image = [UIImage imageNamed:@"again"];

    digitViews = [NSMutableArray array];
    CGFloat wide = 50;
    CGFloat space = 10;
    CGFloat x = (kScreenWidth - 50*6 - 10*5 - 20)/2;
    for (int i = 0; i < 6; i++) {
        UIView *view = [[UIView alloc] initWithFrame:CGRectMake(x+(wide+space)*i, MaxY(backView)+20, wide, 80)];
        [self.view addSubview:view];
        // =========== 重點(diǎn)
        view.layer.contents = (__bridge id)image.CGImage;
        view.layer.contentsRect = CGRectMake(0, 0, 0.1, 1.0);
        view.layer.contentsGravity = kCAGravityResizeAspect;
        view.layer.magnificationFilter = kCAFilterNearest;
        // ===========
        [digitViews addObject:view];
    }
    
  • 計(jì)算數(shù)字
    - (void)tick
    {
    NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond) fromDate:[NSDate date]];
    // set hours
    [self setDigit:components.hour / 10 forView:digitViews[0]];
    [self setDigit:components.hour % 10 forView:digitViews[1]];

        // set minutes
        [self setDigit:components.minute / 10 forView:digitViews[2]];
        [self setDigit:components.minute % 10 forView:digitViews[3]];
    
        // set seconds
        [self setDigit:components.second / 10 forView:digitViews[4]];
        [self setDigit:components.second % 10 forView:digitViews[5]];
    }
    
    - (void)setDigit:(NSInteger)digit forView:(UIView *)view
    {
        NSInteger row = digit / 5;
        NSInteger line = digit % 5;
        view.layer.contentsRect = CGRectMake(line * 0.2, row * 0.53, 0.2, 0.5);
    }
    

效果圖

效果圖.gif

demo 傳送門

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Core Animation其實(shí)是一個(gè)令人誤解的命名。你可能認(rèn)為它只是用來做動(dòng)畫的,但實(shí)際上它是從一個(gè)叫做Laye...
    小貓仔閱讀 3,981評論 1 4
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜,今天將帶大家一窺ios動(dòng)畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,698評論 6 30
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜,今天將帶大家一窺iOS動(dòng)畫全貌。在這里你可以看...
    F麥子閱讀 5,274評論 5 13
  • 一、CAShapelayer 我們知道可以不使用圖片情況下利用CGpath去構(gòu)建任意形狀的陰影。其實(shí)我們也可...
    小貓仔閱讀 1,827評論 0 5
  • 約翰.肯尼斯.加爾布雷,著名經(jīng)濟(jì)學(xué)家說過 許多美國人死于食物過多,而非食物太少。 食物心理學(xué)做的調(diào)查研究, 發(fā)展中...
    奔跑的方子閱讀 279評論 0 1

友情鏈接更多精彩內(nèi)容