iOS 模仿Pokemon Go主页的动画Menu
来源:互联网 发布:美国mac气动官网中文版 编辑:程序博客网 时间:2024/05/21 19:28
YHCustomMenu:github地址
前言
那天我没事申请了个美国区的AppleID,下了个Pokemon Go,注册了个账号,然后进入官网,看到了这样一个菜单栏。
是不是很好看? 看完的我少女心爆棚啊~~~~
于是着手在iOS上实现,其实很简单。
主要是点击事件和动画的结合,动画中包含着图片的渲染 以及那个彩色的覆盖视图的移动动画。
附上我第一次做的效果图。直接用另一个View覆盖的,所以根本不是我想要的效果。
于是我换了种思路,我想是不是图片是固定的,经过渲染而得的不同颜色呢?
于是进行实践,又有了下面的效果图。
差不多了,其他需要按照需求优化即可。
正文
我的创作思路,我总共创建了两个自定义view,一个是Menu上的ButtonView,我管它叫YHCustomMenuView。主要由一条彩色线,一个图标,一个彩色覆盖视图组成。
另一个就是YHCustomMenu,是由多个YHCustomMenuView组成,有number和defaultIndex以及themeColorArr和iconImgArr四个参数,需要我们自己设置。
主要代码:
YHCustomMenuView.h
#import <UIKit/UIKit.h>@interface YHCustomMenuView : UIView//图标@property (nonatomic, retain) UIImage *iconImg;//整体颜色@property (nonatomic, retain) UIColor *themeColor;//图片上的icon@property (nonatomic, retain) UIImageView *iconImgView;@end
YHCustomMenuView.m
#import "YHCustomMenuView.h"@interface YHCustomMenuView ()//彩色覆盖视图@property (nonatomic, retain) UIView *colorfulView;//白色底图的彩色线条@property (nonatomic, retain) UIView *lineView;@end@implementation YHCustomMenuView- (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self addAllSubViews]; } return self;}//添加所有的子视图- (void)addAllSubViews { //所有的frame基于父视图设计 CGFloat width = self.frame.size.width; CGFloat height = self.frame.size.height; self.lineView =[[UIView alloc] initWithFrame:CGRectMake(width-5,0, 5, height)];\ self.iconImgView = [[UIImageView alloc] initWithFrame:CGRectMake(width * 0.35,height *0.35, width *0.3, width *0.3)]; self.iconImgView.userInteractionEnabled = YES; self.colorfulView = [[UIView alloc] initWithFrame:CGRectMake(-width, 0,width , height)]; [self addSubview:self.lineView]; [self addSubview:self.colorfulView]; [self addSubview:self.iconImgView]; [self bringSubviewToFront:self.iconImgView]; }//设置图标的时候需要使其能够被渲染颜色 方便动画中的变色- (void)setIconImg:(UIImage *)iconImg { UIImage *img = [iconImg imageWithRenderingMode:(UIImageRenderingModeAlwaysTemplate)]; self.iconImgView.image = img; }//统一设置主题颜色 使其看起来和谐美观- (void)setThemeColor:(UIColor *)themeColor { self.lineView.backgroundColor = themeColor; self.colorfulView.backgroundColor = themeColor; [self.iconImgView setTintColor:themeColor];}@end
YHCustomMenu.h
#import <UIKit/UIKit.h>#import "YHCustomMenuView.h"@interface YHCustomMenu : UIView//按钮的数量@property (nonatomic, assign) NSInteger number;//自定义图标@property (nonatomic, strong) NSArray *iconImgArr;//自定义颜色@property (nonatomic, strong) NSArray *themeColorArr;//默认选择页@property (nonatomic, assign) NSInteger defaultIndex;@endYHCustomMenu.m
#import "YHCustomMenu.h"#define SCREEHEIGHT ([UIScreen mainScreen].bounds.size.height - 20)@interface YHCustomMenu ()//用于盛放所有自定义菜单视图的数组@property (nonatomic,retain) NSMutableArray *allViewsArr;//用于盛放所有颜色的数组@property (nonatomic,retain) NSMutableArray *allColorArr;@end@implementation YHCustomMenu- (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { } return self;}- (NSMutableArray *)allViewsArr { if (!_allViewsArr) { self.allViewsArr = [[NSMutableArray alloc] init]; } return _allViewsArr;}- (NSMutableArray *)allColorArr { if (!_allColorArr) { self.allColorArr = [[NSMutableArray alloc] init]; } return _allColorArr;}//设置数字之后才能添加 自定义菜单视图- (void)setNumber:(NSInteger)number { CGFloat width = self.frame.size.width; CGFloat height = self.frame.size.height; for (int i = 0; i < number; i ++) { YHCustomMenuView *view = [[YHCustomMenuView alloc] initWithFrame:CGRectMake(0,height/number * i,width,height/number )]; view.tag = 10000+i; UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)]; [view addGestureRecognizer:tap]; [self addSubview:view]; [self.allViewsArr addObject:view]; }}//设置图标数组后才能设置 自定义菜单视图的 图标- (void)setIconImgArr:(NSArray *)iconImgArr { for (int i = 0; i < self.allViewsArr.count; i++) { YHCustomMenuView *view = self.allViewsArr[i]; view.iconImg = [UIImage imageNamed:iconImgArr[i]]; }}//设置主题颜色数组后才能设置 自定义菜单视图的 主题颜色- (void)setThemeColorArr:(NSArray *)themeColorArr { [self.allColorArr addObjectsFromArray:themeColorArr]; for (int i = 0; i < self.allViewsArr.count; i++) { YHCustomMenuView *view = self.allViewsArr[i]; view.themeColor = themeColorArr[i]; }}//设置默认选择的分页 会选中该分页 不选则无- (void)setDefaultIndex:(NSInteger)defaultIndex { YHCustomMenuView *view = self.allViewsArr[defaultIndex - 1]; [self changeCenterForView:view];}//添加点击事件- (void)tapAction:(UITapGestureRecognizer *)tap { YHCustomMenuView *view = (YHCustomMenuView *)[tap view]; [self changeCenterForView:view];}//icon颜色的变化以及彩色遮挡物的位置动画- (void)changeCenterForView:(YHCustomMenuView *)customView { for (YHCustomMenuView *view in self.subviews) { NSArray *viewArr = [view subviews]; if ([view isEqual:customView]) { view.userInteractionEnabled = NO; for (UIView *view in viewArr) { if (view.frame.size.width == self.frame.size.width) { [UIView animateWithDuration:0.3 delay: 0 options: UIViewAnimationOptionCurveLinear animations: ^{ CGPoint center = view.center; center.x += SCREEHEIGHT/7; view.center = center; [customView.iconImgView setTintColor:[UIColor whiteColor]]; } completion: nil]; } } } else { view.userInteractionEnabled = YES; for (UIView * subview in viewArr) { if (subview.frame.size.width == self.frame.size.width) { if (subview.frame.origin.x >= 0) { [UIView animateWithDuration:0.3 delay: 0 options: UIViewAnimationOptionCurveLinear animations: ^{ CGPoint center = subview.center; center.x -= SCREEHEIGHT/7; subview.center = center; [view.iconImgView setTintColor:self.allColorArr[(view.tag - 10000)]]; } completion: nil]; } } } } }}@end
使用示例:
到此结束。
有些细节我可能没有处理好,代码质量也不高。
所以希望大家能够指出我的问题和错误,共同学习,共同进步。
github地址在上面
阅读全文
0 0
- iOS 模仿Pokemon Go主页的动画Menu
- iOS开发:Pokemon Go试玩,未越狱的iPhone伪造GPS定位信息
- iOS Pokemon Go试玩,未越狱的iPhone伪造GPS定位信息
- iOS 虚拟GPS 就是为了玩pokemon go 哈哈哈哈
- iOS 模仿系统的抖动动画
- Pokemon Go 教程
- Pokemon Go 反伪造GPS机制的探讨
- Pokemon Go的发家史与营销套路
- 带你开发类似Pokemon Go的AR游戏(1)
- 带你开发类似Pokemon Go的AR游戏(2)
- pokemon go 和 虚拟gps
- iOS模仿微信的那个视频眼睛动画
- iOS模仿安卓Material Design的涟漪动画按钮
- 模仿的豌豆荚滑动Menu 的 实现
- AR技术应用 の 如何做一个Pokemon GO这只皮卡丘是你的吗?
- 当Pokemon GO VR化时,我们能体验到怎样的“精灵世界”?
- 从火遍全球的Pokemon GO游戏看AR(增强现实)
- [iOS]过渡动画之高级模仿 airbnb
- file
- Lenovo T460 Fn功能键切换
- 实例讲解ArrayList用法
- android 7.0
- JS实现自动刷新
- iOS 模仿Pokemon Go主页的动画Menu
- HTML5文字排版的小技巧
- aop详解
- Android Studio 的Logcat不会显示Log.i,log.e以及错误信息提示的问题
- 大话数据挖掘
- iOS开发基础之系统定位
- 测试测试
- 数据库水平切分的实现原理解析
- 【Python】Centos7通过RDO安装openstack(ocata)