IOS第18天(10,核心动画-转盘,自定义buton,旋转动画)

*****HMViewController.m

#import "HMViewController.h"

#import "HMWheelView.h"

@interface HMViewController ()

@property (nonatomic, weak) HMWheelView *wheelView;

@end

@implementation HMViewController
- (IBAction)start:(id)sender {
    [_wheelView startRotating];
}
- (IBAction)stop:(id)sender {
    [_wheelView stopRotating];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    HMWheelView *wheel = [HMWheelView wheelView];
    
    wheel.center = self.view.center;
    
    [self.view addSubview:wheel];
    
    _wheelView = wheel;
    
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

***HMWheelView.m

#import "HMWheelView.h"

#import "HMWheelButton.h"

#define angle2radian(x) ((x) / 180.0 * M_PI)

@interface HMWheelView ()
@property (weak, nonatomic) IBOutlet UIImageView *rotationView;

@property (nonatomic, weak) UIButton *selectedButton;


@property (nonatomic, strong) CADisplayLink *link;

@end

@implementation HMWheelView

+ (instancetype)wheelView
{
    return [[NSBundle mainBundle] loadNibNamed:@"HMWheelView" owner:nil options:nil][0];
}


// 还有没连号线
- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super initWithCoder:aDecoder]) {
        
        NSLog(@"initWithCoder----%@",_rotationView);
        
    }
    return self;
}

// 连好线
#warning 添加按钮
- (void)awakeFromNib
{
    
    _rotationView.userInteractionEnabled = YES;
    
    
    // 裁剪的大图片
    UIImage *bigImage = [UIImage imageNamed:@"LuckyAstrology"];
    UIImage *selectedImage = [UIImage imageNamed:@"LuckyAstrologyPressed"];
    
    // 图片的尺寸
    CGFloat imageW = 40 * [UIScreen mainScreen].scale;
    CGFloat imageH = 47 * [UIScreen mainScreen].scale;
    
    for (int i = 0; i < 12; i++) {
        // 创建按钮
        HMWheelButton *button = [HMWheelButton buttonWithType:UIButtonTypeCustom];
        
        
        // 锚点
        button.layer.anchorPoint = CGPointMake(0.5, 1);
        // 位置
        button.layer.position = CGPointMake(self.bounds.size.width * 0.5, self.bounds.size.height * 0.5);
        
        // 旋转按钮
        button.layer.transform = CATransform3DMakeRotation(angle2radian(i * 30), 0, 0, 1);
        
        // 尺寸
        button.bounds = CGRectMake(0, 0, 68, 143);
        
        
        // 设置选中时候的背景图片
        [button setBackgroundImage:[UIImage imageNamed:@"LuckyRototeSelected"] forState:UIControlStateSelected];
        
        // 设置按钮的图片
        // image:裁剪的图片
        // rect:裁剪的尺寸
       CGRect clipRect = CGRectMake(i * imageW, 0, imageW, imageH);
       CGImageRef smallImage = CGImageCreateWithImageInRect(bigImage.CGImage, clipRect);
        [button setImage:[UIImage imageWithCGImage:smallImage] forState:UIControlStateNormal];
        
        // 设置选中的图片
        CGImageRef selectedSmallImage = CGImageCreateWithImageInRect(selectedImage.CGImage, clipRect);
        [button setImage:[UIImage imageWithCGImage:selectedSmallImage] forState:UIControlStateSelected];
        
        // 监听点击事件
        [button addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchDown];
        
        if (i == 0) {
            [self btnClick:button];
        }
        
        
        [_rotationView addSubview:button];
        
        
    }
}

#warning 监听按钮点击
- (void)btnClick:(UIButton *)button
{
    _selectedButton.selected = NO;
    button.selected = YES;
    _selectedButton = button;
}

#warning 开始旋转
- (void)startRotating
{
    self.link.paused = NO;

}

- (void)stopRotating
{
    _link.paused = YES;
}


- (CADisplayLink *)link
{

    if (_link == nil) {
        CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(update)];
        
        [link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
        _link = link;
    }
    return _link;
}
// 60  45 / 60.0
- (void)update
{
    _rotationView.transform = CGAffineTransformRotate(_rotationView.transform, angle2radian(45 / 60.0));
}

- (IBAction)start:(id)sender {
    
    // 1.不要和用户交互
    _rotationView.userInteractionEnabled = NO;
    
    // 2.取消慢慢的旋转
    [self stopRotating];
    
    CABasicAnimation *anim = [CABasicAnimation animation];

    anim.keyPath = @"transform.rotation";

    anim.toValue = @(M_PI * 2 * 3);

    anim.duration = 0.5;
    
    anim.delegate = self;


    [_rotationView.layer addAnimation:anim forKey:nil];
    
}

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
    _rotationView.userInteractionEnabled = YES;
    
    
    // 让选中按钮回到最在上面的中间位置:
    CGFloat angle = atan2(_selectedButton.transform.b, _selectedButton.transform.a);
    
    NSLog(@"%f",angle);
    
    // 把我们的转盘反向旋转这么多°
    _rotationView.transform = CGAffineTransformMakeRotation(-angle);
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self startRotating];
    });
}

@end

***HMWheelView.h

#import <UIKit/UIKit.h>

@interface HMWheelView : UIView

+ (instancetype)wheelView;

// 开始旋转
- (void)startRotating;

// 停止旋转
- (void)stopRotating;

@end


****HMWheelButton.m

#import "HMWheelButton.h"

@implementation HMWheelButton
 //转盘  按钮
- (CGRect)imageRectForContentRect:(CGRect)contentRect
{
    CGFloat imageW = 40;
    CGFloat imageH = 47;
    CGFloat imageX = (contentRect.size.width - imageW) * 0.5;
    CGFloat imageY = 20;
    
    return CGRectMake(imageX, imageY, imageW, imageH);
}
//去除高亮
- (void)setHighlighted:(BOOL)highlighted
{

}

@end


****HMWheelButton.h

#import <UIKit/UIKit.h>

@interface HMWheelButton : UIButton

@end

 

posted @ 2015-09-06 18:06  iso  阅读(379)  评论(0编辑  收藏  举报