0

我现在卡在 XCode 中控制 UISlider 了。我在 Interface Builder 中制作了一个水平滑块,并设法在 xcode 中对控件进行编码。现在我只是不确定如何编写逻辑。如果用户将笔尖向左滑动,我希望它逆时针旋转我的图像,如果用户向右滑动,则顺时针旋转图像。

我设置的滑块最小值为 0,最大值为 100。初始值为 50。

对于转换,我使用 CGAffineTransformMakeRotation(myAngle)。我已将 myAngle 设置为浮动。至于条件,这里有一段代码:

mySlider.value = myAngle; // This is for CGAffine

if(myAngle < 50) {
   myAngle -= 0.1;
}

if(myAngle > 50) {
   myAngle += 0.1;
}

当我滑动笔尖时,它只会逆时针旋转。我可以使用的最佳逻辑是什么?希望有人可以提供帮助。谢谢。

-Hakimo

4

2 回答 2

0

请注意,文档中提到了angleas,

该矩阵旋转坐标系轴的角度(以弧度为单位)。在 iOS 中,正值指定逆时针旋转,负值指定顺时针旋转。在 Mac OS X 中,正值指定顺时针旋转,负值指定逆时针旋转。

我认为像下面这样的东西应该可以工作。不过我不确定。(考虑到 minimumValue 为 0)。

float middleValue = slider.maximumValue / 2;
float value = middleValue - slider.value;
float degrees = (middleValue / 180) * value;
float radians = degrees * (3.14/180);
于 2011-07-01T10:31:49.837 回答
0

如果您希望滑块上的固定位置对应于固定的旋转角度,那么您可以执行以下操作:

float degreesToRadians = M_PI / 180.0;
CGFloat angle = (mySlider.value - 50) * degreesToRadians;
myView.transform = CGAffineTransformMakeRotation(angle);

另一方面,如果想要更复杂的行为,例如滑块在被拖动时会捕捉到中间,并且拖动的距离决定了视图的旋转速度,那么我建议使用计时器。设置一个NSTimer来调用给定的选择器,并在该选择器中执行以下操作:

- (void)timerFired:(NSTimer *)aTimer {
  CGFloat angleDelta = (mySlider.value - 50) / 500;
  // I'll assume myAngle is an instance variable.
  myAngle += angleDelta;
  myView.transform = CGAffineTransformMakeRotation(myAngle);
}

在其他地方,您需要编写一个方法来设置mySlider.value = 50用户何时停止拖动它,您可以通过在滑块上为UIControlEventTouchUpInsideand ...添加目标/动作来实现。Outside

如果需要,您可以在UIView每次设置变换时使用动画,使用等于NSTimer间隔的动画持续时间,使旋转看起来非常平滑。如果你这样做,那么我实际上建议使用动画回调代替计时器方法,以避免两个事件之间可能的交叉。

于 2011-07-01T10:37:54.267 回答