Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何在不考虑设备方向的情况下保持UIView指向特定方向?_Iphone_Ios_Core Animation_Uiaccelerometer - Fatal编程技术网

Iphone 如何在不考虑设备方向的情况下保持UIView指向特定方向?

Iphone 如何在不考虑设备方向的情况下保持UIView指向特定方向?,iphone,ios,core-animation,uiaccelerometer,Iphone,Ios,Core Animation,Uiaccelerometer,我有一个观点,我想永远面朝上。假设你有一个UIImageView,它有一个箭头,不管用什么方式握住设备,它都指向上。显然,我需要加速计,但告诉它根据坐标旋转图像只会在我第一次思考时起作用,因为旋转是相对的。有没有更简单的方法?我觉得某个地方会有一个简单的示例应用程序,可以做类似的事情。是您正在寻找的示例应用程序-在iOS参考库中(很棒的文档!)苹果的示例代码正是您想要的;看看这个: 要接收特定的运动数据,请使用uiAccelerator的共享实例及其委托 至于旋转,我不确定。请在此处查看“Bub

我有一个观点,我想永远面朝上。假设你有一个UIImageView,它有一个箭头,不管用什么方式握住设备,它都指向上。显然,我需要加速计,但告诉它根据坐标旋转图像只会在我第一次思考时起作用,因为旋转是相对的。有没有更简单的方法?我觉得某个地方会有一个简单的示例应用程序,可以做类似的事情。

是您正在寻找的示例应用程序-在iOS参考库中(很棒的文档!)

苹果的示例代码正是您想要的;看看这个:

要接收特定的运动数据,请使用
uiAccelerator
的共享实例及其委托

至于旋转,我不确定。请在此处查看“BubbleLevel”示例代码:


加速计学员文档引用了该代码和其他相关示例代码

应用于视图的变换不是累积的。相反,视图一开始是与其父视图的坐标系对齐的,并且变换是相对于该坐标系应用的

正如其他答案所暗示的那样,苹果的产品中有足够的部分可以满足你的需求<代码>-[LevelViewController Accelerator:didAccelerate:已包含如何提取重力矢量的平滑屏幕相对旋转分量的示例:

// Use a basic low-pass filter to only keep the gravity in the accelerometer values for the X and Y axes
accelerationX = acceleration.x * kFilteringFactor + accelerationX * (1.0 - kFilteringFactor);
accelerationY = acceleration.y * kFilteringFactor + accelerationY * (1.0 - kFilteringFactor);

// keep the raw reading, to use during calibrations
currentRawReading = atan2(accelerationY, accelerationX);
给定和的坐标系,计算视图所需的旋转时需要记住以下几个因素:

  • 当设备垂直于纵向时,
    atan2
    将返回-π/2(-90°),因为输入重力向量为{0.0,-1.0,0.0}
  • cGraffineTransformMakeRotation
    创建一个变换,该变换将顺时针(在iOS上)旋转指定的弧度数,但来自
    atan2
    的原始角度指定逆时针旋转
  • 因此,您将希望通过-(currentRawReading+π/2)旋转视图,假设其父视图的方向与纵向屏幕一致:

    view.transform = CGAffineTransformMakeRotation(-(currentRawReading + M_PI/2));
    

    不,我需要一直展示,而不仅仅是风景画和肖像画。是的,我会使用加速计和旋转。不,我需要它一直显示,而不仅仅是横向和纵向。这是y,我会使用加速计和旋转。编辑以回应您的评论。