繁体   English   中英

从自动旋转动画中排除UIView

[英]Exclude UIView from animating on autorotation

TL; DR

需要保持自转,但排除一个UIView在方向改变时自动旋转,如何?

背景故事

我需要在动画期间保持UIView静止,伴随着自转(在方向改变时发生)。 类似于iOS相机应用程序处理旋转的方式(即控件在其位置旋转)。

我尝试过的事情

  • shouldAutorotate()返回false ,订阅UIDeviceOrientationDidChangeNotification ,并尝试单独手动处理每个视图的旋转事件。

    如果您不需要更改任何UIViews的位置,那么效果很好,否则很难弄清楚它应该在哪里结束以及如何在那里找到它

  • 在主UIWindow下放置一个非旋转的UIWindow,并将主UIWindow背景颜色设置为清除。

    如果它只是一个项目,那么效果很好,但我不想管理一堆UIWindows

  • 反向旋转即旋转UIView的方向与旋转方向相反。 不可靠,看起来很奇怪,它也是眩晕诱发

  • 覆盖viewWillTransitionToSize方法中的动画。 失败

  • 还有很多其他很难在这里列出的东西,但它们都失败了

可以这样做吗? 如果是这样,怎么样?

我支持iOS8 +


更新这是@ Casey的例子中视图应该如何布局/定位:

在此输入图像描述

我遇到了同样的问题,并从Apple找到了一些例子,这有助于防止UIView轮换: https//developer.apple.com/library/ios/qa/qa1890/_index.html

但是,如果UIView未放置在屏幕中央,则应手动处理新位置。

我认为这很难回答的部分原因是因为在实践中它并没有真正意义。

假设我创建了一个使用autolayout在纵向和横向中看起来像这样的视图:

标准布局

如果你想像你要问的那样阻止c旋转,你会期望最终视图看起来像什么? 它会是这3个选项中的一个吗?

不稳定的布局

没有您想要实现的肖像/风景视图的图形,并且您希望它的动画描述将很难回答您的问题。

你使用NSLayoutConstraint ,故事板或基于框架的数学来布局你的观点吗? 你能提供的任何代码都会很棒

如果您想要与相机应用程序具有相同的效果,请使用大小类(请参阅此处此处 )。

如果没有,创建包含不旋转的视图控制器的UIWindow有什么问题? 以下代码似乎对我有用(其中UILabel表示您不想旋转的视图)。

class ViewController: UIViewController {
    var staticWindow: UIWindow!

    override func viewDidLoad() {
        super.viewDidLoad()
        showWindow()
    }

    func showWindow() {
        let frame = CGRect(x: 10, y: 10, width: 100, height: 100)
        let vc = MyViewController()
        let label = UILabel(frame: frame)
        label.text = "Hi there"
        vc.view.addSubview(label)
        staticWindow = UIWindow(frame: frame)
        staticWindow.rootViewController = MyViewController()
        staticWindow.windowLevel = UIWindowLevelAlert + 1;
        staticWindow.makeKeyAndVisible()
        staticWindow.rootViewController?.presentViewController(vc, animated: false, completion: nil)
    }
}

class MyViewController: UIViewController {
    override func shouldAutorotate() -> Bool {
        return false
    }

    override func shouldAutomaticallyForwardRotationMethods() -> Bool {
        return false
    }

    override func shouldAutomaticallyForwardAppearanceMethods() -> Bool {
        return false
    }

    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return UIInterfaceOrientationMask.Portrait
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM