【问题标题】:Camera App like screen rotation and navigation相机应用程序,如屏幕旋转和导航
【发布时间】:2015-11-22 02:12:50
【问题描述】:

我想复制原生相机应用程序的确切行为(包括其导航到画廊和返回),当设备旋转时,UI 控件旋转到位而不是整个屏幕旋转。我可以通过在纵向模式下锁定屏幕并手动处理设备旋转通知来复制旋转行为,如下所示:

- (BOOL)shouldAutorotate {
  return NO;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
  return UIInterfaceOrientationPortrait;
}

- (void)orientationDidChange:(NSNotification*)note {
  UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;

  UIInterfaceOrientation newOrientation = UIInterfaceOrientationPortrait;
  switch (orientation) {
    case UIDeviceOrientationPortraitUpsideDown:
      newOrientation = UIInterfaceOrientationPortraitUpsideDown;
      break;

    case UIDeviceOrientationLandscapeLeft:
      newOrientation = UIInterfaceOrientationLandscapeLeft;
      break;

    case UIDeviceOrientationLandscapeRight:
      newOrientation = UIInterfaceOrientationLandscapeRight;
      break;

    case UIDeviceOrientationPortrait:
      newOrientation = UIInterfaceOrientationPortrait;
      break;

    default:
      newOrientation = self.currentOrientation;
      break;
  }

  if (newOrientation == self.currentOrientation) {
    return;
  }
  self.currentOrientation = newOrientation;
  [self rotateInterfaceToOrientation:self.currentOrientation];
}

- (void)rotateInterfaceToOrientation:(UIInterfaceOrientation)orientation {
  double rotationAngle = 0;
  switch (orientation) {
    case UIInterfaceOrientationPortraitUpsideDown: rotationAngle = M_PI; break;
    case UIInterfaceOrientationLandscapeLeft: rotationAngle = M_PI_2; break;
    case UIInterfaceOrientationLandscapeRight: rotationAngle = -M_PI_2; break;
    default: rotationAngle = 0; break;
  }

  CGFloat angle = (float)rotationAngle;
  self.defaultTransform = CGAffineTransformMakeRotation(angle);

  ... manual animation by setting transform
}

这很好用,并且完全符合我的需要。

我的问题与应用程序的屏幕仍然是纵向的事实有关。

整个应用程序同时支持纵向和横向模式。当我导航到不同的屏幕并返回时,过渡会中断,因为它正在从横向视图过渡到纵向视图。就在过渡动画开始之前,以前的横向视图将布局更改为纵向(尽管它被奇怪地拉伸了)。来自模拟器的视频:http://gfycat.com/DeafeningGaseousBrant。您可以在过渡开始时看到布局更改。它在设备上更加明显,因为您可以一直看到屏幕。值得一提的是,我正在使用自定义转换管理器来使屏幕在导航时转向正确的方向(这可能解释了为什么视图会像移动一样移动,但它对有问题的行为没有影响)。

当我使用键盘或 UIAlertView 显示提示时,它们的方向是错误的。再次模拟器:http://gfycat.com/SelfreliantPointedEwe

有没有办法从视图控制器中指定视图当前是纵向还是横向?或者有没有办法在不使用自动布局调整大小/布局的情况下手动旋转屏幕?

【问题讨论】:

    标签: ios objective-c cocoa-touch screen-rotation


    【解决方案1】:

    通过旋转和重塑视图来应用旋转。如果您对视图应用反向旋转和整形,它将看起来不旋转。

    通过重塑,我的意思是交换宽度和高度。

    旋转到横向时,应用将视图旋转 (-) 90 度的变换,并手动交换边界的宽度和高度。您的视图将不再出现旋转,但界面方向不会受到影响。还可以将任何子视图旋转相反的角度并移动它们以匹配重新调整的边界。

    【讨论】:

    • 我在其他问题中阅读了该解决方案,但我不敢相信这是正确的方法。使用自动布局时,如果不根据设备方向进行复杂的约束编辑,就不可能达到想要的效果。其中一件事是,当您将设备向左横向旋转时,触发按钮位于右侧。当您将其旋转到右侧横向时,它位于左侧。仅靠自动布局根本无法做到这一点。一定有其他的魔法发生了。
    【解决方案2】:

    当设备旋转时,UI 控件在原地旋转而不是整个屏幕旋转

    实际上,事实并非如此。应用确实旋转 - 但元素旋转,并且它们使用animateAlongside,因此它们的旋转与应用的旋转同步。您无法判断应用正在旋转,因为没有状态栏来指示这一点。

    【讨论】:

    • 嗯,Camera.app 的实际操作方式有点复杂,因为当旋转锁定打开时它们也会旋转东西。
    • @FilipRadelic 我没有注意到这一点。这实际上是一个很好的收获。所以看起来他们真的不会将屏幕旋转到横向。但是当他们在画廊之间切换时,导航如何工作?
    • @Montas 我并不是在暗示他们不旋转屏幕。当旋转锁定关闭时他们肯定会这样做(您可以确认因为控制中心和通知中心工作正常),只是旋转锁定会变得更加复杂。
    • @FilipRadelic 他们确实会旋转控件,但是当您打开图库时,它会以纵向模式打开。这就是为什么我认为他们实际上并没有旋转屏幕,只是使用一些过渡魔法让它看起来像屏幕旋转。顺便说一句,在我的解决方案中,当旋转被锁定时,我的控件不会旋转。
    • @Alfa 好的,但您的评论是针对 memy 的答案。 (您没有签署其他用户。)所以我回答说,就我而言,没有任何改变。无论应用程序如何旋转,我仍然使用这种技术来保持单个视图“向上”(从地面)。
    【解决方案3】:

    看起来 Apple 的从预览打开的库不是导航打开的视图控制器,而是模态打开的视图控制器,它甚至可以从预览中打开。只有当您触摸“所有照片”按钮时,才会在这一刻加载初始照片应用程序,并带有真正的导航栏...... (我在 iOS 9 中检查过)

    【讨论】:

      猜你喜欢
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多