ios - 将 UIView 旋转到设备方向并调整边界大小

标签 ios objective-c uiview screen-orientation catransform3d

在我的应用程序中,我使用 CMMotionManagerUIView 旋转到设备方向。这个想法是保持 UIView 级别,无论用户如何围绕其 z 轴旋转它。想象一下飞机上的地平线仪。

这确实工作得很好,但现在我面临着真正的挑战。我想在旋转时调整 UIView 的框架大小,以便它始终完全适合设备屏幕并保持其纵横比。请参阅下面的精彩绘图。

我们将不胜感激任何帮助!

enter image description here

最佳答案

假设您设备的屏幕宽度为 W,高度为 H, View 的高度为 h,宽度为 w。您需要通过比例因子缩放 View 的框架,以确保 View 的相对角与屏幕的边缘接触。如果你旋转了一个角度 theta,那么你想找到满足以下条件的最大缩放因子:

比例因子 * ( h * sin(theta) + w * cos(theta)) <= W ;和

比例因子 * ( h * cos(theta) + w * sin(theta)) <= H

因此,重新安排这些:

scaling_factor <= W/( h * sin(theta) + w * cos(theta));和

比例因子 <= H/( h * cos(theta) + w * sin(theta))

计算每一项,然后选择两者中较小的一个。相应地调整框架的大小,或使用 CGAffineTransformMakeScale 通过 View 的变换属性应用缩放因子。如果 theta 为负或大于 pi/2,则需要稍微调整这些公式,或者使用 abs(theta) 表示负的 theta,使用 (pi - theta) 表示 theta > pi/2。

关于ios - 将 UIView 旋转到设备方向并调整边界大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25899122/

相关文章:

ios - 如何在 iOS 生成的操作表上收听操作

iphone - 在没有 UITabBarController 的情况下从 UITabBar 中删除选项卡

swift - 随着 orientation-xcode 9+ 的变化更新自定义 subview (uiview 或 web View )框架/大小

ios - 0.1 以下的 UIProgressView 值无法正确显示

ios - 我的 View Controller 被保留(我认为),但我找不到强有力的引用

objective-c - 从 NStimeInterval 准确转换为 CMTime

ios - UICollectionView 的 didSelectItemAtIndexPath 方法只被调用一次

swift - Swift 3 中的 UIView isKindOfClass

ios - 使用 UICollectionViewFlowLayout/UICollectionViewLayout 子类,不会在正确的时间调用 CellForItemAtIndexPath

ios - 替换已弃用代码 : CGContextShowText