zoukankan      html  css  js  c++  java
  • 钟表效果

    近期在做一个项目。上面有钟表的显示。

    钟表的显示无非用到角度旋转。先看下效果图:


    制作步骤例如以下:

    先切出四张图:表盘,三个指针(沿着边界切

    代码例如以下: 利用CGAffineTransformMakeRotation顺时针旋转。计算好弧度传入

    //UI

    //注意指针的加入顺序


     UIImageView *watchImageView =[[UIImageViewalloc]initWithFrame:CGRectMake(0,0,self.width,self.height)];

        watchImageView.image =PNGImage(@"watch");

        [selfaddSubview:watchImageView];


        //由于 CGAffineTransformMakeRotation旋转是以中心点进行旋转,所以要在各个指针下创建一个底部视图,然后把指针放上去,定好位置。使得实现指针旋转效果。

        UIView *minuteView = [[UIViewalloc]initWithFrame:CGRectMake((watchImageView.width -6.0)/2.0,0,6.0,160)];

       minuteView.backgroundColor =ClearColor;

        [selfaddSubview:minuteView];

        

       UIImageView *minuteImageView = [[UIImageViewalloc]initWithFrame:CGRectMake(0,8,6.0,75)];

        minuteImageView.image =PNGImage(@"minute");

        [minuteViewaddSubview:minuteImageView];

        

        UIView *hourView = [[UIViewalloc]initWithFrame:CGRectMake((watchImageView.width -6.0)/2.0,0,6.0,160)];

       hourView.backgroundColor =ClearColor;

        [selfaddSubview:hourView];

        

       UIImageView *hourImageView = [[UIImageViewalloc]initWithFrame:CGRectMake(0,18,6.0,65)];

        hourImageView.image =PNGImage(@"hour");

        [hourViewaddSubview:hourImageView];


        UIView *secondView = [[UIViewalloc]initWithFrame:CGRectMake((watchImageView.width -6.0)/2.0,0,6.0,160)];

        [selfaddSubview:secondView];

       UIImageView *secondImageView = [[UIImageViewalloc]initWithFrame:CGRectMake(0,5,6.0,90)];

        secondImageView.image =PNGImage(@"second");

        [secondViewaddSubview:secondImageView];


    //依据当前时间初始角度

         NSDate *today = [NSDatedate]; 

        

       NSCalendar *greCalendar = [[NSCalendaralloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

        

       NSDateComponents *dateComponents = [greCalendarcomponents:NSCalendarUnitHour |NSCalendarUnitMinute | NSCalendarUnitSecondfromDate:today];

       NSInteger hour = dateComponents.hour

       NSInteger minute = dateComponents.minute;

       NSInteger second = dateComponents.second;

       

       

        if (hour <12) {

           _hourAngle = hour/6.0 *M_PI;

        }else {

           _hourAngle = (hour-12)/6.0 *M_PI;

        }

       _minuteAngle = minute/30.0 *M_PI;

       _secondAngle = second/30.0 *M_PI;

        

       hourView.transform =CGAffineTransformMakeRotation(hourAngle);

       minuteView.transform =CGAffineTransformMakeRotation(minuteAngle);

       secondView.transform =CGAffineTransformMakeRotation(secondAngle);


    //起定时器。每0.05s刷新一次,实现均匀旋转。可是要开启线程,将定时器放进NSRunLoop中。保证主线程有操作时不影响指针旋转

       [selfperformSelectorInBackground:@selector(change)withObject:nil];


    - (void)change

    {

      [NSTimerscheduledTimerWithTimeInterval:0.05target:selfselector:@selector(watchRotation)userInfo:nilrepeats:YES];

      [[NSRunLoopcurrentRunLoop] run];//已经将nstimer加入到NSRunloop中了

    }

    // 计算得知,每0.05s,秒针旋转M_PI/600,分针旋转M_PI/36000。时针旋转M_PI/432000

    - (void)watchRotation

    {

       _secondAngle +=M_PI/600;

       if (_secondAngle/2.0 >M_PI) {

           _secondAngle =0;  //注意归0

        }

       _watchImageView.secondView.transform =CGAffineTransformMakeRotation(_secondAngle);

        

       _minuteAngle +=M_PI/36000;

       if (_minuteAngle/2.0 >M_PI) {

           _minuteAngle =0;

        }

       _watchImageView.minuteView.transform =CGAffineTransformMakeRotation(_minuteAngle);

        

       _hourAngle +=M_PI/432000;

       if (_hourAngle/2.0 >M_PI) {

           _hourAngle =0;

        }

       _watchImageView.hourView.transform =CGAffineTransformMakeRotation(_hourAngle);

    }


    这就哦了。这个能够进行封装。在此就不进行赘述了。

    另外。当程序进入后台,指针不再旋转,要想在程序进入前台的时候仍然显示正确的时间。那么在appDelegate的

    applicationWillEnterForeground方法中post一个通知,同一时候在钟表页面注冊成为观察者,接收通知。

    这样,接收到通知的时候,初始化指针就可以

    –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

    上面的方法存在角度偏差,这个已经測出来。后来的改进方法是,每次确定角度时,依据nscalendar,获取正确的时分秒,又一次计算角度,这样就不会有偏差。我实现的是每隔1s。指针旋转。每次都又一次计算好角度。


  • 相关阅读:
    牛客挑战赛48C铬合金之声【Prufer序列】
    Java 基础 反射
    MDX Query mdx的基本语法和概念
    Maven 深入理解maven构建生命周期和各种plugin插件
    Java基础 String,StringBuilder,StringBuffer三者的区别
    Java基础 Java 抽象类 抽象方法
    Java 基础 final vs static
    JMX JMX(Java Management Extensions)定义
    Java 多线程 生产者消费者问题
    Java 基础 如何重写equals()
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7213972.html
Copyright © 2011-2022 走看看