【问题标题】:iOS: How to rotate UIImageView around center point?iOS:如何围绕中心点旋转 UIImageView?
【发布时间】:2013-11-10 22:27:51
【问题描述】:

我目前正在尝试旋转时钟的时针和分针。这是我正在为应用程序开发的迷你游戏之一。下面的这个功能随机设置时针和分针的位置。目前我正在跟踪将用于将手重置回原始位置的旋转。问题发生在第一次或几次旋转后,分针有时出现在随机位置。我可以做些什么来解决或改进此问题或提高准确性。我的另一个问题是手 UIImageViews 的起源应该是什么(左上角?中间?)。所有建议将不胜感激。

// function used to randomly move hands of clock and set answers
-(void)normal_move_hands
{
    int hourHandLocation = arc4random() % 12;   // 12 unique locations for hour hand
    int miniuteHandLocation = arc4random() % 4;   // 4 unique locations for minute hand
    if(hourHandLocation ==0)
    {
        hourHand.transform =CGAffineTransformMakeRotation(M_PI / 6); // 1
        rotationBackHour = (M_PI * 11 /6);
        hourCorrectAnswer = [NSString stringWithFormat:@"1"];
    }
    if(hourHandLocation ==1)
    {
        hourHand.transform =CGAffineTransformMakeRotation(M_PI / 3); // 2
        rotationBackHour = (M_PI * 10/6);
        hourCorrectAnswer = [NSString stringWithFormat:@"2"];
    }
    if(hourHandLocation ==2)
    {
        hourHand.transform =CGAffineTransformMakeRotation(M_PI / 2); // 3
        rotationBackHour = (M_PI * 3/2);
        hourCorrectAnswer = [NSString stringWithFormat:@"3"];
    }
    if(hourHandLocation ==3)
    {
        hourHand.transform =CGAffineTransformMakeRotation(M_PI *2 /3); // 4
        rotationBackHour = (M_PI * 4/3);
        hourCorrectAnswer = [NSString stringWithFormat:@"4"];
    }
    if(hourHandLocation ==4)
    {
        hourHand.transform =CGAffineTransformMakeRotation(M_PI * 5 / 6 ); // 5
        rotationBackHour = (M_PI * 7/6);
        hourCorrectAnswer = [NSString stringWithFormat:@"5"];
    }
    if(hourHandLocation ==5)
    {
        hourHand.transform =CGAffineTransformMakeRotation(M_PI); // 6
        rotationBackHour = (M_PI);
        hourCorrectAnswer = [NSString stringWithFormat:@"6"];
    }
    if(hourHandLocation ==6)
    {
        hourHand.transform =CGAffineTransformMakeRotation(M_PI * 7 / 6); // 7
        rotationBackHour = (M_PI * 5/6);
        hourCorrectAnswer = [NSString stringWithFormat:@"7"];
    }
    if(hourHandLocation ==7)
    {
        hourHand.transform =CGAffineTransformMakeRotation(M_PI * 4 /3); // 8
        rotationBackHour = (M_PI * 2/3);
        hourCorrectAnswer = [NSString stringWithFormat:@"8"];
    }
    if(hourHandLocation ==8)
    {
        hourHand.transform =CGAffineTransformMakeRotation(M_PI * 3 / 2); // 9
        rotationBackHour = (M_PI /2);
        hourCorrectAnswer = [NSString stringWithFormat:@"9"];
    }
    if(hourHandLocation ==9)
    {
        hourHand.transform =CGAffineTransformMakeRotation(M_PI * 10 /6); // 10
       rotationBackHour = (M_PI /3);
        hourCorrectAnswer = [NSString stringWithFormat:@"10"];
    }
    if(hourHandLocation ==10)
    {
        hourHand.transform =CGAffineTransformMakeRotation(M_PI * 11 /6); // 11
        rotationBackHour = (M_PI /6);
        hourCorrectAnswer = [NSString stringWithFormat:@"11"];
    }
    if(hourHandLocation ==11)  // 12
    {
        rotationBackHour = 0;
         hourCorrectAnswer = [NSString stringWithFormat:@"12"];
    }


   if(miniuteHandLocation == 0)  // 0 miniute 
   {
       rotationBackMinute = 0;
       minuteCorrectAnswer = [NSString stringWithFormat:@"0"];

   }
   if(miniuteHandLocation == 1)  // 15 miniute
   {
       minuteHand.transform = CGAffineTransformMakeRotation(M_PI /2);
       minuteCorrectAnswer = [NSString stringWithFormat:@"1"];
       rotationBackMinute = (M_PI * 3/2);
   }
   if(miniuteHandLocation == 2)  // 30 miniute
   {
        minuteHand.transform = CGAffineTransformMakeRotation(M_PI);
        minuteCorrectAnswer = [NSString stringWithFormat:@"2"];
       rotationBackMinute = (M_PI);
   }
   if(miniuteHandLocation == 3)  // 45 miniute
   {
       minuteHand.transform = CGAffineTransformMakeRotation(M_PI * 3 /2);
       minuteCorrectAnswer = [NSString stringWithFormat:@"3"];
       rotationBackMinute = (M_PI /2);
   }

}

这是我的重置功能,用于将指针重置回原来的位置。

-(void)reset_hands
{
    hourHand.transform = CGAffineTransformMakeRotation(rotationBackHour);
    minuteHand.transform = CGAffineTransformMakeRotation(rotationBackMinute);
}

【问题讨论】:

  • 你不能简单地用hourHand.transform = CGAffineTransformMakeRotation(0)重置吗?
  • 嗨 Martin R,您的建议似乎有助于重置和获得正确的时间答案,但它不能解决时针有时会出现在奇怪位置的事实。感谢您的快速回复!
  • “有时出现在奇怪的地方”很难回答 :-)

标签: ios css objective-c uiimageview


【解决方案1】:

根据我上面的评论:您可以简单地重置转换

hourHand.transform = CGAffineTransformMakeRotation(0);
// or:
hourHand.transform = CGAffineTransformIdentity;

而且没有必要记住rotationBackHour。 (设置transform不会累加。)

还请注意,您可以将代码简化为

hourHand.transform = CGAffineTransformMakeRotation((hourHandLocation + 1)*M_PI/6.0);
hourCorrectAnswer = [NSString stringWithFormat:@"%d", hourHandLocation + 1];

使许多 if 块过时。

“有时出现在随机位置” 问题是由 Autolayout 或 Autosizing 选项引起的。关闭它们或修复它们,以使小时/分钟视图与时钟的大小和相对位置不会改变。

【讨论】:

  • 嘿 Martin R. 所以我在你的 CGAffineTransformMakeRotation 中添加并摆脱了 rotationBackHour。但是,现在唯一的问题是,在 6 和 9(小时)内,我的时针发疯了,并且没有停留在中心。对于所有其他时间,图片都是正确的......
  • 你已经正式回答了我问题的第 1 部分哈哈:谢谢!
  • @RyanCW:视图是否有任何自动布局或自动调整大小选项?
  • 这是什么意思?我在玩分针的原点,但基本上在我的 xib 文件中我有:1)背景中的时钟图像 2)分针(方形)3)时针(方形)所有相互重叠......
  • @RyanCW:检查文件检查器中的“使用自动布局”选项,并可能在尺寸检查器中检查视图的“自动调整大小”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 2013-05-20
  • 1970-01-01
相关资源
最近更新 更多