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对象.

results matching ""

    No results matching ""