初識CALayer之簡易時鐘





#import "ViewController.h" #import <QuartzCore/QuartzCore.h> @interface ViewController () { //時針 UIImageView *m_s; //分針 UIImageView *m_f; //秒針 UIImageView *m_m; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; m_s = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"s"]]; m_s.frame = CGRectMake(0, 0, 20, 90); m_f = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"f"]]; m_f.frame = CGRectMake(0, 0, 20, 100); m_m = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"m"]]; m_m.frame = CGRectMake(0, 0, 20, 130); CALayer *blueLayer = [[CALayer alloc] init]; blueLayer.frame = CGRectMake(10, 20, 300, 400); blueLayer.backgroundColor = [UIColor blueColor].CGColor; // 把blueLayer的contents屬性設置成圖片。 // contents /* An object providing the contents of the layer, typically a CGImageRef, * but may be something else. (For example, NSImage objects are * supported on Mac OS X 10.6 and later.) Default value is nil. * Animatable. *對象提供該層的內容,一個典型的cgimageref, *但多是別的東西。(例如,nsimage對象 *後來支持在MAC OS X 10.6和默認值是零。)。 *動畫。*/ UIImage *image = [UIImage imageNamed:@"b"]; blueLayer.contents = (__bridge id)(image.CGImage); /* CALayer與contentMode對應的屬性叫作contentsGravity,可是它是一個NSString類型,而不是像對應的UIKit部分,那裏面的值是枚舉。contentsGravity可選的常量值有如下一些: kCAGravityCenter kCAGravityTop kCAGravityBottom kCAGravityLeft kCAGravityRight kCAGravityTopLeft kCAGravityTopRight kCAGravityBottomLeft kCAGravityBottomRight kCAGravityResize kCAGravityResizeAspect kCAGravityResizeAspectFill 和cotentMode同樣,contentsGravity的目的是爲了決定內容在圖層的邊界中怎麼對齊,咱們將使用kCAGravityResizeAspect,它的效果等同於UIViewContentModeScaleAspectFit, 同時它還能在圖層中等比例拉伸以適應圖層的邊界。 */ blueLayer.contentsGravity = kCAGravityCenter; // 當用代碼的方式來處理寄宿圖的時候,必定要記住要手動的設置圖層的contentsScale屬性,不然,你的圖片在Retina設備上就顯示得不正確啦。代碼以下: blueLayer.contentsScale = [UIScreen mainScreen].scale; // UIView有一個叫作clipsToBounds的屬性能夠用來決定是否顯示超出邊界的內容, //CALayer對應的屬性叫作masksToBounds,把它設置爲YES,圖片就在邊界裏了 blueLayer.masksToBounds = YES; // [self addSpriteImage:image withContentRect:CGRectMake(0, 0, 1, 1) Layer:blueLayer]; // blueLayer.contentsCenter = CGRectMake(0.25, 0.25, .5, .5); // self.view.transform = CGAffineTransformMakeRotation(.5); [self.view.layer addSublayer:blueLayer]; m_s.center = CGPointMake(blueLayer.position.x , blueLayer.position.y); m_f.center = CGPointMake(blueLayer.position.x , blueLayer.position.y); m_m.center = CGPointMake(blueLayer.position.x , blueLayer.position.y); m_s.layer.anchorPoint = CGPointMake(.5, .9); m_f.layer.anchorPoint = CGPointMake(.5, .9); m_m.layer.anchorPoint = CGPointMake(.5, .9); [self.view addSubview:m_s]; [self.view addSubview:m_f]; [self.view addSubview:m_m]; [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(tick) userInfo:nil repeats:YES]; //set initial hand positions [self tick]; } - (void)tick { //convert time to hours, minutes and seconds NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSUInteger units = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; NSDateComponents *components = [calendar components:units fromDate:[NSDate date]]; CGFloat hoursAngle = (components.hour / 12.0) * M_PI * 2.0; //calculate hour hand angle //calculate minute hand angle CGFloat minsAngle = (components.minute / 60.0) * M_PI * 2.0; //calculate second hand angle CGFloat secsAngle = (components.second / 60.0) * M_PI * 2.0; //rotate hands m_s.transform = CGAffineTransformMakeRotation(hoursAngle); m_f.transform = CGAffineTransformMakeRotation(minsAngle); m_m.transform = CGAffineTransformMakeRotation(secsAngle); } /*! * @Author Yunis_song, 15-01-07 16:01:51 * * @brief 加載圖片切割尺寸,只加載本身想要的部分 * * @param image 圖片 * @param rect 加載圖片剪裁信息 * @param layer 圖片加載到哪裏 */ - (void)addSpriteImage:(UIImage *)image withContentRect:(CGRect)rect Layer:(CALayer *)layer //set image { layer.contents = (__bridge id)image.CGImage; //scale contents to fit layer.contentsGravity = kCAGravityResizeAspect; //set contentsRect //CGRectMake(x, y, w, h) 加載圖片位置 //x 加載圖片其實x座標 值:0-1,相對位置 0 起始點 0.5 一半起始點 //y 加載圖片其實y座標 值:0-1,相對位置 0 起始點 0.5 一半起始點 //w 寬度 值:0-1 1加載所有 0.5 加載通常寬度 //h 高度 值:0-1 1加載所有 0.5 加載通常高度 layer.contentsRect = rect; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
相關文章
相關標籤/搜索