Swift 4,设备方向

Posted

技术标签:

【中文标题】Swift 4,设备方向【英文标题】:Swift 4, device orientation 【发布时间】:2018-12-05 01:03:50 【问题描述】:

我正在做一个 ArKit+CoreLocation 应用程序,当我触摸一个节点时,我会在屏幕上的视图上显示一些信息。问题是当我旋转设备时,我重绘了 DataView,但没有正确绘制。

我注意到的第一件事是,当我启动应用程序并且手机处于纵向模式时,我必须评估 if(!UIDevice.current.orientation.isPortrait ) 以获得适合该案例的正确尺寸。 为什么在启动过程中方向不是纵向?

只有在应用程序启动时才能很好地管理尺寸。如果我在横向模式下运行应用程序,视图会正确呈现,纵向也是如此。我检测到的另一个问题是,当我“重绘”视图时,如果我想更新视图内的文本,那就不可能了。

我制作了一个视频来向您展示正在发生的事情,同时也知道当一个节点被选中时,它周围有一个紫色的圆圈。而且您会看到,在重新定向之后,无论我触摸哪个节点,我都无法更新文本。 https://youtu.be/ls_Y6dnW8E4

我的源代码是

/*
 * Initialize the TextView to display the information about the monument
 */
func initDataView() 

    let screenWidth = self.view.frame.width
    let screenHeight = self.view.frame.height
    var leftPadding : CGFloat = 0.0
    var bottomPadding : CGFloat = 0.0
    var frameHeight : CGFloat = 0.0

    /*
     * Configure paddings if the device is a phone
     */
    if (UIDevice.current.userInterfaceIdiom == .phone) 

        if ( UIDevice.current.orientation.isPortrait ) 
            (leftPadding, bottomPadding, frameHeight) = getDataViewPaddings(phone: true, portrait: true, screenWidth: screenWidth, screenHeight: screenHeight)
         else 
            (leftPadding, bottomPadding, frameHeight) = getDataViewPaddings(phone: true, portrait: false, screenWidth: screenWidth, screenHeight: screenHeight)
        

    

    dataView = UIView(frame: CGRect(x: 0, y: 0, width: screenWidth-(leftPadding*2), height: screenHeight/frameHeight))
    dataView.frame.origin.x = leftPadding
    dataView.frame.origin.y = screenHeight - dataView.frame.height - bottomPadding
    //dataView.backgroundColor = UIColor.white.withAlphaComponent(0.7)

    //Adjust border and border color
    dataView.layer.borderWidth = 4.0
    dataView.layer.borderColor = UIColor(hexString: "#951789ff")?.cgColor

    initTextView(leftPadding: leftPadding)

    dataView.addSubview(textView)
    dataView.addSubview(descriptionView)
    dataView.addSubview(iconView)



public override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) 
    initDataView()

【问题讨论】:

检查您的目标设置 > 常规 > 部署信息。如果设备方向支持横向,它可以是非纵向的。仅供参考,即使您在设置中取消选中横向,您也可以使用横向模式。该设置用于启动。 【参考方案1】:

使用带有 ARkit ARSCNView 的 UIKit UIViews 与使用任何其他视图没有什么不同。如果您要设置自定义框架,则必须在 viewDidLayoutSubviews 中完成代码。在这种情况下,尽管看起来您只想将视图固定在距前缘和底部一定距离且宽度和高度不变的情况下。如果这是您想要的,那么只需使用自动布局并让布局引擎计算位置。这适用于代码或界面构建器。您也可以在界面生成器中手动将 UIView 的类设置为 ARSCNView。

【讨论】:

以上是关于Swift 4,设备方向的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中获取设备方向

Swift 4:设备旋转后 UI 无法更新

如何在 Swift 中以编程方式更改设备方向?

SpriteKit 设备方向改变导致 SKLabelNode 变形 Swift

swift 使用神经网络预测设备方向

以编程方式快速更改设备方向 4 IOS 11 [重复]