iOS 시계 개발 사례 공유
사고방식 은 바로 CALayer 의 암시 적 애니메이션 을 이용 하여 실현 하 는 것 이다.UIView 의 비 근 층,즉 수 동 으로 만 든 layer 는 그 속성 이 변 할 때 기본적으로 애니메이션 효 과 를 발생 시 키 기 때문에 이러한 속성 을 애니메이션 속성 이 라 고도 부른다.예 를 들 어 bounds,backgroundColor,position.
시계 안의 시계 판 은 하나의 UIView 이 고,세 개의 바늘 은 세 개의 수 동 으로 만 든 layer 이다.
먼저 storyboard 에 UIImageView 를 만들어 서 디스크 그림 을 설정 합 니 다.
 
 그리고 viewdLoad 에서 세 개의 바늘 을 초기 화하 고 타 이 머 를 설정 하여 현재 시간 을 가 져 옵 니 다.현재 시간 에 대응 하 는 시침 분침 초침 을 각각 대응 하 는 각 도 를 가 리 킵 니 다.
//
// ViewController.m
//     
//
// Created by Daniel on 16/4/7.
// Copyright © 2016  Daniel. All rights reserved.
//
 
#define kClockWH _clockView.bounds.size.width
 
//         
#define preSecondA 6
 
//         
#define preMinuteA 6
 
//         
#define preHourA 30
 
//         
#define preHourMinute 0.5
 
//         
#define preMinuteSecond 0.1
 
#define angle2raditon(a) ((a) / 180.0 * M_PI)
 
#import "ViewController.h"
 
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *clockView;
 
/**    */
@property(nonatomic, strong) CALayer *secondL;
 
/**    */
@property(nonatomic, strong) CALayer *minuteL;
 
/**    */
@property(nonatomic, strong) CALayer *hourL;
 
@end
 
@implementation ViewController
 
- (void)viewDidLoad {
 [super viewDidLoad];
  
 //    
 [self setUpHourLayer];
  
 //    
 [self setUpMinuteLayer];
 
 //    
 [self setUpSecondLayer];
  
 //     
 [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];
  
 //          ,               
 [self timeChange];
  
}
 
- (void)timeChange {
  
 //        
 NSCalendar *calendar = [NSCalendar currentCalendar];
  
 NSDateComponents *cmp = [calendar components:NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour fromDate:[NSDate date]];
  
 //   
 NSInteger second = cmp.second;
  
 //   
 NSInteger minute = cmp.minute;
  
 //    
 NSInteger hour = cmp.hour;
  
 //        
 CGFloat secondA = second * preSecondA;
  
 //        
 CGFloat minuteA = minute * preMinuteA + second * preMinuteSecond;
  
 //        
 CGFloat hourA = hour * preHourA + minute * preHourMinute;
  
 //    
 _secondL.transform = CATransform3DMakeRotation(angle2raditon(secondA), 0, 0, 1);
  
 //    
 _minuteL.transform = CATransform3DMakeRotation(angle2raditon(minuteA), 0, 0, 1);
  
 //    
 _hourL.transform = CATransform3DMakeRotation(angle2raditon(hourA), 0, 0, 1);
  
}
 
#pragma mark -      
- (void)setUpHourLayer {
  
 CALayer *hourL = [CALayer layer];
  
 //       
 hourL.backgroundColor = [UIColor blackColor].CGColor;
  
 //      
 hourL.anchorPoint = CGPointMake(0.5, 1);
  
 //             
 hourL.position = CGPointMake(kClockWH * 0.5, kClockWH * 0.5);
  
 hourL.cornerRadius = 4;
  
 //    bounds
 hourL.bounds = CGRectMake(0, 0, 4, kClockWH * 0.5 - 40);
  
 //      clockView   
 [_clockView.layer addSublayer:hourL];
  
 _hourL = hourL;
  
}
 
 
#pragma mark -      
- (void)setUpMinuteLayer {
  
 CALayer *minuteL = [CALayer layer];
  
 //       
 minuteL.backgroundColor = [UIColor blackColor].CGColor;
  
 //      
 minuteL.anchorPoint = CGPointMake(0.5, 1);
  
 //             
 minuteL.position = CGPointMake(kClockWH * 0.5, kClockWH * 0.5);
  
 minuteL.cornerRadius = 4;
  
 //    bounds
 minuteL.bounds = CGRectMake(0, 0, 4, kClockWH * 0.5 - 20);
  
 //      clockView   
 [_clockView.layer addSublayer:minuteL];
  
 _minuteL = minuteL;
  
}
 
#pragma mark -      
- (void)setUpSecondLayer {
  
 CALayer *secondL = [CALayer layer];
  
 //       
 secondL.backgroundColor = [UIColor redColor].CGColor;
  
 //      
 secondL.anchorPoint = CGPointMake(0.5, 1);
  
 //             
 secondL.position = CGPointMake(kClockWH * 0.5, kClockWH * 0.5);
  
  
 //    bounds
 secondL.bounds = CGRectMake(0, 0, 1.5, kClockWH * 0.5 - 20);
  
 //      clockView   
 [_clockView.layer addSublayer:secondL];
  
 _secondL = secondL;
  
}
 
 
@end 
 이상 은 본 고의 모든 내용 이 므 로 여러분 들 이 IOS 프로 그래 밍 을 배 우 는 데 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.