我正在尝试使 CollectionView 中的项目大小适应保持纵横比的屏幕尺寸。到目前为止,它仅在iPad上运行良好,我已经根据资产的尺寸设置了height
和width
:
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)
}
我在返回尺寸时交换了width
和height
,因为该应用程序仅是横向的。这仍然不是最好的解决方案,因为卡不会保持纵横比。那么有没有办法使尺寸适应屏幕保持纵横比?
可以将纵横比约束应用于单元格,以便它们本身保持纵横比,然后将单元格中的另一个约束应用于视图,以便它们保持相对于视图的纵横比。然后,您可以应用等宽/高约束,通过乘数调整单元格的大小。
我想我在 8 年前就混淆了想法,我今天使用的解决方案(众多解决方案之一)非常简单:一个单例,它检查正在使用的设备是 iPhone 还是 iPad,并相应地返回不同的尺寸。
因此,使用随机数,如下所示:
func getCardSize() -> CGSize {
if UIDevice.current.userInterfaceIdiom == .pad {
return CGSize(width: 100, height: 150)
} else {
return CGSize(width: 50, height: 75)
}
}