【问题标题】:24 hour analog clock24 小时模拟时钟
【发布时间】:2012-11-20 18:11:45
【问题描述】:

我正在尝试制作 24 小时模拟时钟,目前有一个 12 小时时钟。

我写的:

   currentTime = [NSDate date];
dateComponents = [calendar components:unitFlags fromDate:currentTime];
hour = [dateComponents hour];
minute = [dateComponents minute];
second = [dateComponents second];
hourAngle = (30 * hour + minute / 2);
minAngle = (6 * minute);
secAngle = (6 * second);
secondHand.transform = CGAffineTransformMakeRotation(secAngle * M_PI / 180);
minuteHand.transform = CGAffineTransformMakeRotation(minAngle * M_PI / 180);
hourHand.transform = CGAffineTransformMakeRotation(hourAngle * M_PI / 180);

这非常适合 12 小时制,但我想将其设为 24,因此建议我将角度值除以 2,如下所示:

hourAngle = (30 * hour + minute / 2) /2;
minAngle = (6 * minute) /2;
secAngle = (6 * second) /2; 

但是,这给了我一个从上到下的 180 度角,在达到 180 度后重置。

我需要进行哪些更改才能让我的时钟 360 度旋转?

【问题讨论】:

    标签: iphone objective-c ios


    【解决方案1】:

    显然,分钟和秒的角度不会改变。只有小时角减半。此外,请确保小时达到 23 以内的所有值。

    【讨论】:

    • 我不知道为什么我没有想到只需要划分小时角。分角和秒角显然不需要它。我在过去的 12 个小时里一直在使用它,但它还没有自行重置,到目前为止这对我来说看起来不错。谢谢!
    【解决方案2】:

    您想要做的是将 24 小时时钟包装为 12 小时旋转,您可以像这样使用模数:

    hourAngle = (30 * (hour % 12) + minute / 2);
    

    【讨论】:

      【解决方案3】:

      我创建了一个制作模拟风格时钟的项目,可在此处PSAnalogClock 获得。我用它来计算时间

      编辑 - 感谢@nes1983

      int hoursFor12HourClock = hours % 12;
      

      然后计算我使用的角度

      float rotationForHoursComponent  = hoursFor12HourClock * degreesPerHour;
      float rotationForMinuteComponent = degreesPerMinute * [self minutes];
      
      float totalRotation = rotationForHoursComponent + rotationForMinuteComponent;
      

      【讨论】:

      • 第一行代码是不是写 hoursFor12HourClock = hours % 12 的晦涩方式?而且,OP 有相反的问题:如何制作 24 小时制。
      • 第一行并不晦涩,它只是说如果小时数小于 12,则返回小时数,否则返回小时数 - 12。如果您阅读问题,则问题是如何显示具有从 12 或 24 小时的时间开始,表面上看 12 小时。
      • 对不起,我真的想过你所说的,是的,这似乎是一种蹩脚的做法
      【解决方案4】:

      不是一个直接的答案,更像是一个额外的视角。 ;) 以下代码取自应用程序elastic time clock,该应用程序可在 AppStore 上找到,由 Your Headless Standup Programmer 编写。

      无需过多解释,看看为elastic time clock写的cocos2d step方法,也许它会让你对永恒有一些额外的了解:

      //You remember the math... 
      //reference: http://en.wikipedia.org/wiki/Clock_angle_problem
      
      - (void)step:(ccTime)delta {
      
        //DLog(@"STEP delta: %f", delta);
        NSDate *d = [NSDate date];
      
        //NSTimeInterval interval = [d timeIntervalSince1970];
        NSTimeInterval interval = [d timeIntervalSince1970] + ([[NSTimeZone localTimeZone] secondsFromGMT]);
      
        //DLog(@"date=%@ interval=%f", d, interval);
      
        float sixty = 60 * h13Ratio; //change 60 minutes to 60*k minutes
      
        //normal clock
        int days = interval / 86400; //24*60*60
        h = (int)interval / 3600 - (days * 24); //1 hour = 60*60
        m = (interval/60) - (days * 24 * 60) - (h * 60); 
        s = (int)interval % 60;
      
        //elastic clock
        //int _days = days * h13Ratio; not used
        _h = h * h13Ratio;
        _m = m * h13Ratio;
        _s = s * h13Ratio;
      
        //DLog(@"hours=%i minutes=%i seconds=%i", _hours, _minutes, _seconds);
      
        //angle speed for clock hands
        float h_speed = 360 / (h13Number * sixty); 
        float m_speed = (360 / sixty);  
        float s_speed = (360 / sixty); 
      
        //rotation angles for clock hands
        h_roto = (h_speed * _h * sixty) + (h_speed * _m); 
        m_roto = m_speed * _m;
        s_roto = s_speed * _s;
      
          //DLog(@"h_roto=%f m_roto=%f s_roto=%f", h_roto, m_roto, s_roto);
      
        //rotate clock hands
        //[self updateClockHands];    
      }
      

      如果有人将 h13Ratio 变量设置为具有如下值:

          h13Number = numberOfHoursInTheDay_OnTheClockFace; //24 if You want a 24h day, or 13 if You want a 13h day
          h13Ratio = h13Number*2 / 24.0f;
      

      h13Ratio 将是 2。这是有道理的,因为钟面上的数字是原来的两倍。 :)

      享受

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-16
        • 1970-01-01
        • 2015-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多