根据屏幕尺寸调整收藏视图中项目布局的大小,保持纵横比



我正在尝试使 CollectionView 中的项目大小适应保持纵横比的屏幕尺寸。到目前为止,它仅在iPad上运行良好,我已经根据资产的尺寸设置了heightwidth

private let cardWidth: CGFloat = 362
private let cardHeight: CGFloat = 568

然后在CardLayout类中,它继承自UICollectionViewFlowDelegate

   scrollDirection = UICollectionViewScrollDirection.Horizontal
   itemSize = CGSizeMake(cardWidth, cardHeight)
   minimumInteritemSpacing = 10

问题是物品是卡片,所以height> width,而我只为iPhone和iPad开发横向。我尝试使用UIScreen.mainScreen().bounds但没有成功。我设法为iPhone和iPad都获得了不错的结果,并添加了CollectionViewController

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize{
return CGSizeMake(collectionView.frame.size.height / 2 ,collectionView.frame.size.width / 2)
}

我在返回尺寸时交换了widthheight,因为该应用程序仅是横向的。这仍然不是最好的解决方案,因为卡不会保持纵横比。那么有没有办法使尺寸适应屏幕保持纵横比?

可以将纵横比约束应用于单元格,以便它们本身保持纵横比,然后将单元格中的另一个约束应用于视图,以便它们保持相对于视图的纵横比。然后,您可以应用等宽/高约束,通过乘数调整单元格的大小。

我想我在 8 年前就混淆了想法,我今天使用的解决方案(众多解决方案之一)非常简单:一个单例,它检查正在使用的设备是 iPhone 还是 iPad,并相应地返回不同的尺寸。

因此,使用随机数,如下所示:

 func getCardSize() -> CGSize {
     if UIDevice.current.userInterfaceIdiom == .pad {
         return CGSize(width: 100, height: 150)
     } else {
         return CGSize(width: 50, height: 75)
     }
 }