zoukankan      html  css  js  c++  java
  • UI进阶--Core Animation的简单使用:底部菜单旋转

    需求:
    1.三个隐藏的按钮,在红色按钮底部
    2.点击红色按钮时,底部三个隐藏按钮,就显示出来
    显示时候有旋转+平移的动画
    3.再次点击红色按钮,显示的三个按钮又隐藏
    隐藏时候旋转+平移动画

    文件和布局:

    实现的代码:

     1 //
     2 //  ViewController.m
     3 //  MenuRotation
     4 //
     5 //  Created by xiaomoge on 15/1/7.
     6 //  Copyright (c) 2015年 xiaomoge. All rights reserved.
     7 //
     8 
     9 #import "ViewController.h"
    10 #import "JWMenuRotation.h"
    11 @interface ViewController ()
    12 
    13 @end
    14 
    15 @implementation ViewController
    16 
    17 - (void)viewDidLoad {
    18     [super viewDidLoad];
    19     //添加自定义的view
    20     JWMenuRotation *menu = [JWMenuRotation menuRotation];
    21     CGFloat menuW = self.view.frame.size.width;
    22     CGFloat menuH = menu.bounds.size.height;
    23     CGFloat menuX = 0;
    24     CGFloat menuY = self.view.frame.size.height - menu.bounds.size.height;
    25     menu.frame = CGRectMake(menuX, menuY, menuW, menuH);
    26     [self.view addSubview:menu];
    27 }
    28 
    29 @end
      1 //
      2 //  JWMenuRotation.m
      3 //  MenuRotation
      4 //
      5 //  Created by xiaomoge on 15/1/7.
      6 //  Copyright (c) 2015年 xiaomoge. All rights reserved.
      7 //
      8 
      9 #import "JWMenuRotation.h"
     10 @interface JWMenuRotation ()
     11 //红色按钮
     12 @property (weak, nonatomic) IBOutlet UIButton *mainBtn;
     13 //隐藏的三个按钮
     14 @property (nonatomic,strong) NSMutableArray *btnItems;
     15 @end
     16 
     17 @implementation JWMenuRotation
     18 //懒加载
     19 - (NSMutableArray *)btnItems {
     20     if (!_btnItems) {
     21         _btnItems = [NSMutableArray array];
     22     }
     23     return _btnItems;
     24 }
     25 //如果对象是从xib/storybard加载的时候,就会调用这个方法
     26 - (id)initWithCoder:(NSCoder *)aDecoder {
     27     if (self = [super initWithCoder:aDecoder]) {
     28         [self showBtnItems];
     29     }
     30     return self;
     31 }
     32 //添加三个隐藏按钮
     33 - (void)showBtnItems {
     34     [self initBtnWithImg:@"menu_btn_call" tag:0];
     35     [self initBtnWithImg:@"menu_btn_cheyou" tag:1];
     36     [self initBtnWithImg:@"menu_btn_tixing" tag:2];
     37 }
     38 //初始化一个按钮
     39 - (void)initBtnWithImg:(NSString *)imgName tag:(NSInteger)tag {
     40     UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
     41     [btn setBackgroundImage:[UIImage imageNamed:imgName] forState:UIControlStateNormal];
     42     btn.tag = tag;
     43     [self.btnItems addObject:btn];
     44     [self addSubview:btn];
     45 }
     46 //加载完view之后就会调用这个方法,设置隐藏按钮的frame
     47 - (void)layoutSubviews {
     48     [super layoutSubviews];
     49     //设置隐藏按钮的frame
     50     CGRect btnBounds = CGRectMake(0, 0, 48, 48);
     51     //遍历隐藏按钮
     52     for (UIButton *btn in self.btnItems) {
     53         btn.frame = btnBounds;
     54         btn.center = self.mainBtn.center;
     55     }
     56     //把红色按钮置顶
     57     [self bringSubviewToFront:self.mainBtn];
     58 }
     59 //红色按钮点击事件
     60 - (IBAction)mainBtnClick:(UIButton *)sender {
     61     //获取红色按钮的形变初始状态
     62     BOOL show = CGAffineTransformIsIdentity(self.mainBtn.transform);
     63     //红色按钮的动画效果
     64     [UIView animateWithDuration:5 animations:^{
     65         if (show) {//如果初始状态未改变,那么点击后旋转45度
     66             self.mainBtn.transform = CGAffineTransformMakeRotation(M_PI_4);
     67         }else {//否则恢复为原始状态
     68             self.mainBtn.transform = CGAffineTransformIdentity;
     69         }
     70     }];
     71     //调用隐藏按钮的被点击后的响应事件
     72     [self showBtnItems:show];
     73 }
     74 //红色按钮被点击后隐藏按钮的响应事件
     75 - (void)showBtnItems:(BOOL)show {
     76     //按钮的间距
     77     CGFloat margin = 90;
     78     //遍历隐藏按钮
     79     for (UIButton *btn in self.btnItems) {
     80         //创建组动画
     81         CAAnimationGroup *groupAni = [CAAnimationGroup animation];
     82         //组动画的时间
     83         groupAni.duration = 5;
     84         
     85         //重新设置按钮的中心位置
     86         CGFloat btnCenterX = self.mainBtn.center.x + (btn.tag + 1) * margin;
     87         CGFloat btnCenterY = self.mainBtn.center.y;
     88         CGPoint position = CGPointMake(btnCenterX, btnCenterY);
     89         
     90         //创建平移动画
     91         CAKeyframeAnimation *positionAni = [CAKeyframeAnimation animationWithKeyPath:@"position"];
     92         //平移动画的路径
     93         NSValue *val1 = [NSValue valueWithCGPoint:self.mainBtn.center];
     94         NSValue *val2 = [NSValue valueWithCGPoint:CGPointMake(btnCenterX * 0.5, btnCenterY)];
     95         NSValue *val3 = [NSValue valueWithCGPoint:CGPointMake(btnCenterX * 1.2, btnCenterY)];
     96         NSValue *val4 = [NSValue valueWithCGPoint:position];
     97         positionAni.values = @[val1,val2,val3,val4];
     98         //创建旋转动画
     99         CAKeyframeAnimation *rotationAni = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"];
    100         
    101         if (show) {//被点击后
    102             rotationAni.values = @[@0,@(M_PI * 2),@(M_PI * 4),@(M_PI * 2)];
    103             btn.center = position;
    104         }else {//点击被隐藏时
    105             positionAni.values = @[val4,val3,val2,val1];
    106             btn.center = self.mainBtn.center;
    107             rotationAni.values = @[@0,@(M_PI * 2),@0,@(-M_PI * 2)];
    108         }
    109         //组动画中的动画数组
    110         groupAni.animations = @[positionAni,rotationAni];
    111         //添加组动画到图层
    112         [btn.layer addAnimation:groupAni forKey:Nil];
    113     }
    114 }
    115 //取得自定义的view
    116 + (instancetype)menuRotation {
    117     return [[[NSBundle mainBundle] loadNibNamed:@"JWMenuRotation" owner:Nil options:Nil] lastObject];
    118 }
    119 @end

    效果图:

    点击前:

    点击后:

  • 相关阅读:
    汤姆猫解决打印日志乱码问题
    oracel如何将timestamp转化为date类型
    oracle排序分页
    批量删除某一后缀的临时表
    oracle分组排序后获取每组行号
    cxf中隐藏服务列表
    怎么从一张表中查询数据插入到另一张表中
    weblogic创建域
    java多线程
    Linux常用命令大全
  • 原文地址:https://www.cnblogs.com/xiaomoge/p/4208365.html
Copyright © 2011-2022 走看看