当设备旋转而不将设备锁定为纵向模式时,如何将 collectionView 的所有项目保持在适当的位置?

Posted

技术标签:

【中文标题】当设备旋转而不将设备锁定为纵向模式时,如何将 collectionView 的所有项目保持在适当的位置?【英文标题】:How do you hold all the items of a collectionView in place when the device rotates without locking the device in portrait mode? 【发布时间】:2018-09-28 19:06:47 【问题描述】:

我想构建一个collectionView,当用户旋转设备而不将设备的方向锁定为纵向模式时,它将所有单元格保持在适当的位置。我曾尝试使布局无效,但无济于事。感谢您的帮助。

【问题讨论】:

仅在 info.plist 中将支持的界面方向设置为纵向? @AshleyMills 我还想允许应用检测何时处于横向模式 您还有其他需要在两个方向上工作的屏幕? @AshleyMills 在某种意义上是的,我希望他们能够检测到它们何时处于横向模式,但我不希望屏幕旋转或 collectionView 屏幕上的任何项目在发生旋转 我不确定我是否理解 - 如果屏幕不旋转,您为什么想知道设备是否处于横向? 【参考方案1】:

根据您的评论,您希望所有屏幕都保持纵向,但要知道设备是否处于横向而不旋转界面(对于相机屏幕),您应该……

your info.plist 中将支持的界面方向设置为纵向

使用CMMotionManager检测设备方向...

let motionManager = CMMotionManager()
var currentOrientation = UIDeviceOrientation.portrait

func montiorOrientation() 
    motionManager.startAccelerometerUpdates(to: OperationQueue())  data, error in
        if let error = error 
            print("CM orientation error - \(error)")
            return
        
        let acceleration = data!.acceleration

        let orientation: UIDeviceOrientation = fabs(acceleration.y) < fabs(acceleration.x) ?
            (acceleration.x > 0 ? .landscapeRight : .landscapeLeft) :
            (acceleration.y > 0 ? self.currentOrientation : .portrait) // Ignore portraitUpsideDown

        if orientation != self.currentOrientation 
            DispatchQueue.main.async 
                self.currentOrientation = orientation
            
        

    

【讨论】:

以上是关于当设备旋转而不将设备锁定为纵向模式时,如何将 collectionView 的所有项目保持在适当的位置?的主要内容,如果未能解决你的问题,请参考以下文章

应用程序启动时锁定为纵向从横向旋转到纵向 (iOS)

如何将视图从纵向模式更改为横向模式并锁定它?

在视图中锁定纵向? IOS 7

如何以编程方式将我的 android 应用程序锁定为纵向/横向模式?

在 ios 应用程序中将 UIImagePickerController 锁定为纵向模式

应用程序第一次处于纵向模式,如果设备处于横向模式