当前位置: 首页 > 知识库问答 >
问题:

在iOS8中禁用单个子视图上的自动旋转

端木高卓
2023-03-14

我正在编写一个绘图应用程序,我不希望绘图视图旋转。同时,我希望其他控件根据设备的方向很好地旋转。在iOS7中,我通过以下方式解决了这个问题:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    float rotation;

    if (toInterfaceOrientation==UIInterfaceOrientationPortrait) {
        rotation = 0;
    }
    else if (toInterfaceOrientation==UIInterfaceOrientationLandscapeLeft) {
        rotation = M_PI/2;
    } else if (toInterfaceOrientation==UIInterfaceOrientationLandscapeRight) {
        rotation = -M_PI/2;
    }

    self.drawingView.transform = CGAffineTransformMakeRotation(rotation);
    self.drawingView.frame = self.view.frame;
}

但在iOS 8上,即使调用了该函数并正确设置了变换,也不会阻止视图旋转。

我尝试过创建一个视图控制器,它可以简单地防止视图的旋转并将其视图添加到视图层次结构中,但它不会响应用户输入。

有什么想法吗?

谢谢

共有3个答案

连德水
2023-03-14

Swift 4有很多更新,包括viewWillTransition函数。

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    let targetRotation = coordinator.targetTransform
    let inverseRotation = targetRotation.inverted()

    coordinator.animate(alongsideTransition: { context in
        self.drawingView.transform = self.drawingView.transform.concatenating(inverseRotation)
        self.drawingView.frame = self.view.bounds
        context.viewController(forKey: UITransitionContextViewControllerKey.from)
    }, completion: nil)
}
祁飞飙
2023-03-14

迪米特里的回答对我非常有效。这是代码的swift版本,以防有人需要它。。。

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
  let targetRotation = coordinator.targetTransform()
  let inverseRotation = CGAffineTransformInvert(targetRotation)

  coordinator.animateAlongsideTransition({ context in
    self.drawingView.transform = CGAffineTransformConcat(self.drawingView.transform, inverseRotation)
    self.drawingView.frame = self.view.bounds
    context.viewControllerForKey(UITransitionContextFromViewControllerKey)
  }, completion: nil)
}
公西马鲁
2023-03-14

在与子视图和TransitionCoordinator进行了一些斗争之后,我终于找到了答案:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    CGAffineTransform targetRotation = [coordinator targetTransform];
    CGAffineTransform inverseRotation = CGAffineTransformInvert(targetRotation);

    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {

        self.drawingView.transform = CGAffineTransformConcat(self.drawingView.transform, inverseRotation);

        self.drawingView.frame = self.view.bounds;
    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
    }];
}

我要做的是,计算应用于视图的变换的逆,然后使用它来更改变换。此外,我还使用视图边界更改了帧。这是因为它是全屏幕的。

 类似资料:
  • 我有一个通过plist文件配置的应用程序,以支持纵向、横向左侧和横向右侧方向(即,UISupportedInterfaceOrientationPortrait、UIInterfaceOrientationLandscapeLeft和UIInterfaceOrientationLandscapeRight)。但我已经将支持的方向限制为仅在视图控制器内部纵向。如果我在视图控制器的视图上显示UIAct

  • 我正在开发一款ios应用程序,它必须在横向和纵向两种模式下都能工作,但有一种视图应该始终在横向模式下。因此,我有: 如果我在横向模式下使用我的应用程序,并到达此视图并旋转设备(iPad),则调用此方法并返回false,因此界面不会旋转,好东西。 但是如果我在纵向视图中,并且到达该视图,则调用此方法并返回false,但是方向不会改变。在这种情况下,如果我将设备旋转到横向,该方法将返回true,接口将

  • 我使用autolayout在故事板中创建了一个UIViewController,它有一个嵌入式UITableView。由于某些原因,表视图部分上方存在空白。我的期望是tableview将所有可用空间分割为单元格,并使单元格从顶部开始。 当使用自动布局和大小类时,是什么导致表视图在第一部分上方添加空白?

  • 我遇到了自动布局的问题,似乎无法找到应该很容易实现的答案。 我有以下视图层次结构: 标签上的前导/尾随限制使它们在更薄的设备上更高(iPhone 4s vs iPhone 6)。 为了让UIScrollview正常工作,我需要在UIScrollView内部设置UIView的高度约束,以避免出现“不明确的高度”警告。 但在iPhone 4s上运行时,UIView不够高,无法容纳它的子视图。 到目前为

  • 我想做的是: 由父视图控制器管理的父视图不应旋转。 由子视图控制器管理的子视图应该旋转到所有方向。 我所尝试的: 家长视图控制器 儿童视图控制器 Xcode部署信息中支持的方向设置为所有四个。 我得到的: 没有视图的旋转。如果将父视图的旋转设置为“全部”,则所有视图将一起旋转。所以要么全有要么全无。 更新 当我尝试放置UIDeviceOrientationIDChangeNotification的

  • 我有一个带有子视图控制器的视图控制器。 应强制A始终保持纵向,但应允许B自由旋转。 我知道shouldAutorotate应该适用于任何视图控制器及其子级,但有什么方法可以绕过它吗?看起来我可以使用shouldAutorotateToInterfaceOrientation,但这在iOS 8中被阻止了。 我想保持视频播放器静态(因此无论设备方向如何,水平视频始终是水平的),而控制层子视图覆盖允许自