Lottery
彩票
实现思路:
1.分析开发方式
- 采用纯代码搭建框架,因为界面非常多,使用storyboard,不好管理.
2.环境部署
- 修改main interface 程序启动,不需要加载Main.storyboard.
- 项目部署,支持7.0以上
- 支持的方向
- 应用程序图标
- 启动图片,默认加载LaunchScreen
- 注意:LaunchScreen比LaunchImage优先级高。
- 设置LaunchImage需要注意,默认模拟器的尺寸跟启动图片有关系。
3.搭建框架
- 程序启动完成,创建窗口,设置窗口跟控制器,显示窗口。
- 自定义tabBarController
- 设置tabBar上的按钮
4.自定义导航控制器
如果一个控制器既要显示自己的view,又想有导航条就可以作为导航控制器的根控制器。
设置导航条的背景图片,所有控制器导航条的颜色都是一样的,必须在导航条显示之前设置,
也就不能在控制器的viewDidLoad设置
。解释UIBarMetrics属性,UIBarMetricsDefault只有这种属性,才能设置成功,并且控制器的尺寸会变化。
- 介绍appearance,拿到整个应用程序的导航条,属于导航条的事情,最好放在导航控制器里,自定义导航控制器。
- 给导航控制器添加导航功能,点击设置按钮跳转,搭建我的彩票界面导航条内容。
- 跳转隐藏底部条,设置属性hidesBottomBarWhenPushed,但是默认只会隐藏系统自带的tabBar,因此把自定义tabBar添加到系统的tabBar上。
- 设置返回按钮
- 滑动返回功能
5.自定义导航控制器转场动画
- 想滑动范围大一点,自定义导航控制器转场动画。
- 如何自定义导航控制器转场动画?
- 成为导航控制器代理,实现两个方法。
- animationControllerForOperation:自定义转场动画,返回nil,默认系统自带的转场动画。需要返回一个动画对象。
- interactionControllerForAnimationController:控制转场控制器交互,返回动画交互对象。
注意:必须实现了自定义转场动画方法,才会调用交互方法,
- 自定义pop动画对象。
UIViewControllerContextTransitioning,转场动画上下文对象,系统创建的,不需要我们创建。
转场动画上下文对象作用:保存整个转场动画的信息,通过他告诉系统动画执行到哪一步,如何执行动画的,主要通过他获取转场的来源和目的控制器,和存储转场控制器的view。
[transitionContext containerView]:获取的是导航控制器存放子控制器的view
- 自定义转场动画
// pop动画:目的控制器的view慢慢往右边移动,需要先把目的控制器先插入到来源控制器下面。
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
// 获取来源控制器
UIViewController *sourceVc = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
// 获取目的控制器
UIViewController *destVc = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
// 获取存放子控制器的view
UIView *contentView = [transitionContext containerView];
// 把目的控制器插入到下面
[contentView insertSubview:destVc.view belowSubview:sourceVc.view];
[UIView animateWithDuration:0.25 animations:^{
// 来源控制器往右边移动
sourceVc.view.transform = CGAffineTransformMakeTranslation([UIScreen mainScreen].bounds.size.width, 0);
} completion:^(BOOL finished) {
// 通知系统,转场动画完成,系统会自动把来源控制器的view移除父控件
[transitionContext completeTransition:YES];
}];
NSLog(@"%@%@",sourceVc,destVc);
}
- 已经自定义转场动画成功了,接下来就是通过与用户手势交互来控制转场动画进度。
怎么控制,需要返回自定义动画交互对象,来控制动画。
- 使用UIPercentDrivenInteractiveTransition:系统自带的控制器转场动画进度的类。 — 添加手势通过,通过滑动手势距离,来控制动画进度,计算滑动百分比,滑动到屏幕的时候,动画刚好完成。
注意:只有用户在滑动,才需要返回动画交互对象,但用户点击按钮,是不需要的,否则会出现问题,因为只要一返回动画交互对象,动画就交给交互对象管了,就不会自动执行动画,因此需要判断。是否拖动。
注意:当手值没有滑动到一般时,需要取消动画执行,需要在自定义动画对象中,做判断,如果动画取消,就不执行完动画。
// 注意:如果动画取消,就不需要动画完成 [transitionContext completeTransition:!transitionContext.transitionWasCancelled];
6.利用运行时解决滑动返回
- 思路:
既然系统能有滑动返回功能,肯定实现了某个方法,并且调用了某个对象的方法。因为手势创建需要传入target,action.
- 打印下系统的滑动返回手势,解读打印
<UIScreenEdgePanGestureRecognizer: 0x7fd74af46bc0; state = Possible; enabled = NO; delaysTouchesBegan = YES; view = <UILayoutContainerView 0x7fd74ac3b460>; target= <(action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7fd74af462f0>)>>
手势类型: UIScreenEdgePanGestureRecognizer
target类型: _UINavigationInteractiveTransition
action:handleNavigationTransition:
- 首先方法
handleNavigationTransition:
肯定在_UINavigationInteractiveTransition类型的对象中实现了,我们只要拿到系统创建的这个对象就好了 - 利用运行时遍历UIGestureRecognizer类的属性,因为只有UIGestureRecognizer才有target方法,运行时只能遍历当前类的所有属性,不能遍历他的子类或者父类。
- 发现_targets数组,打印数组,利用断点获取他的类型UIGestureRecognizerTarget,里面有两个属性target和action
- 利用KVC获取UIGestureRecognizerTarget里面的target对象,就是_UINavigationInteractiveTransition类型对象。
- 自己创建一个Pan手势调用这个方法即可。
5.搭建购彩大厅
设置购彩大厅导航条活动按钮
包装一个按钮,目的点击的时候取消高亮。抽分类,快速创建UIBarButton
点击按钮,弹出遮盖,和pop菜单。
遮盖添加到窗口上,一般需要显示在最前面的,都直接添加到窗口上。
pop菜单不能添加到遮盖上,因为遮盖设置透明度,会影响到pop菜单,原理:给父控件设置透明度,会影响子类。
点击pop菜单,边移动边缩放,注意:pop菜单有子控件,需要把子控件的尺寸也缩放,因为子控件的尺寸不合跟着父控件改变而改变。
pop菜单缩放完毕,取消遮盖,封装遮盖,提供两个方法,显示和消失,默认MBProgressHud.
6.搭建竞技场
1> 设置导航条背景,
在viewDidLoad,导航控制器还没有值,拿不到导航条直接设置。
获取全局的导航条背景不现实,应该是单独搞个导航控制器,获取这个控制器下的导航条设置背景
自定义竞技场导航控制器,目的设置导航条的背景
2> 设置导航条titleView
- 学习seguement属性,tintcolor决定中间的一条直线和默认文字颜色。
- 设置背景颜色,设置文字颜色,需要设置文字属性。
3> 设置竞技场背景
- 第一种方式,添加一个UIImageView
- 第二种方式,自定义背景view,画上去,这样的好处,少创建一个UIImageView对象.