#import "ViewControl
ler.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