【问题标题】:Horizontal scroll when rotate UIColectionView in swift快速旋转 UIColectionView 时的水平滚动
【发布时间】:2014-07-28 13:01:23
【问题描述】:

我正在尝试快速构建collectionView,我希望当设备处于纵向时collectionView 垂直滚动,而当我在横向模式下旋转设备时collectionView 水平滚动。这是CollectionView 类:

class SceneBuilderVC: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource{
    @IBOutlet var collection: UICollectionView!

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

    override func shouldAutorotate() -> Bool{
       return true
    }

    override func supportedInterfaceOrientations() -> Int{
        return Int(UIInterfaceOrientationMask.All.toRaw())
    }

    func numberOfSectionsInCollectionView(collectionView: UICollectionView!) -> Int {
        return 1;
    }

    func collectionView(collectionView: UICollectionView!, numberOfItemsInSection section: Int) -> Int {
           return 50;
    }

    func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell!{
        var cell:UICollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as UICollectionViewCell
        cell.backgroundColor = UIColor.redColor()
        return cell
    }
}

要更改滚动方向,我需要更改 collectionView 布局。

var flowLayout:UICollectionViewFlowLayout = UICollectionViewFlowLayout()
var scrollDirection = UICollectionViewScrollDirection.Vertical
flowLayout.scrollDirection = scrollDirection
self.collection.collectionViewLayout = flowLayout

另外,在 iOS8 中,Apple 将屏幕旋转方式 willRotateToInterfaceOrientation:duration 改为 viewWillTransitionToSize:withTransitionCoordinator

如何使用 **viewWillTransitionToSize:withTransitionCoordinator* 方法检查设备何时旋转并因此更改滚动方向?

【问题讨论】:

    标签: ios swift uicollectionview


    【解决方案1】:

    使用 animateAlongsideTransition 中的完成处理程序检查旋转后的方向并进行任何调整。

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
        coordinator.animateAlongsideTransition(nil, completion: {context in
            if(UIDevice.currentDevice().orientation == UIDeviceOrientation.Portrait || UIDevice.currentDevice().orientation == UIDeviceOrientation.PortraitUpsideDown){
                //this is portrait (or upsidedown), do something
            }else{
                //landscape 
            }
        })
    }
    

    但除非在特殊情况下,您不应该真正关心设备的确切方向,您可以简单地将视图调整为“新尺寸”

    【讨论】:

      【解决方案2】:

      选项 #1:

      如果您的集合视图占据了整个屏幕,那么您可以简单地检查宽度是否大于高度并将结果作为横向。

      选项 #2:

      或者你可以使用函数:

      UIInterfaceOrientationIsLandscape(self.interfaceOrientation) 
      

      但你应该知道 interfaceOrientation 属性在 iOS8 中已被弃用。

      【讨论】:

      • 如果我使用选项 1,我必须在哪里检查它?因为没有一个函数会在每次设备改变方向时被调用。
      • 检查viewWillTransitionToSize:withTransitionCoordinator: 中的size 属性。
      • viewWillTransitionToSize:withTransitionCoordinator: 每次设备旋转时都会被调用。但它不会在初始加载视图时被调用,因此您应该在viewDidLoad(或任何其他合适的方法)中手动调用。
      【解决方案3】:

      这就是完整的功能:

      override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator   coordinator: UIViewControllerTransitionCoordinator!){
          if let theAppDelegate = UIApplication.sharedApplication() {
              let orientation = theAppDelegate.statusBarOrientation
              if orientation.isPortrait {
                  println("Landscape")
                  var flowLayout:UICollectionViewFlowLayout = UICollectionViewFlowLayout()
                  //flowLayout.sectionInset = UIEdgeInsetsMake(5, 5, 5, 5);
                  //flowLayout.itemSize = CGSizeMake(80, 80)
                  var scrollDirection = UICollectionViewScrollDirection.Horizontal
                  flowLayout.scrollDirection = scrollDirection
                  self.collection.collectionViewLayout = flowLayout
              }else{
                  println("Protrait")
                  var flowLayout:UICollectionViewFlowLayout = UICollectionViewFlowLayout()
                  // flowLayout.sectionInset = UIEdgeInsetsMake(5, 5, 5, 5);
                  //flowLayout.itemSize = CGSizeMake(80, 80)
                  var scrollDirection = UICollectionViewScrollDirection.Vertical
                  flowLayout.scrollDirection = scrollDirection
                  self.collection.collectionViewLayout = flowLayout
              }
          }
      }
      

      【讨论】:

      • 不起作用:状态栏的方向是在方向更改发生之前...并且您不知道更改是 90 度还是 180 度或其他。所以这行不通。根据shinobicontrols.com/blog/posts/2014/08/06/…,我认为您必须查看协调器上的 targetTransform()。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 2010-09-12
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多