2

我有一个简单的UICollectionViewCell,带有一个图像和一个标签。在常规尺寸的课堂上,我希望图片处于最佳状态,并在其下面加上标签。这就是它看起来像在Xcode的预览标签:UICollectionViewCell - 针对不同大小类别的不同布局

enter image description here

在任何其他级别大小我想图像出现在左边,而右边的标签:

enter image description here

我设置的约束是这样的:

ImageView的有以下限制:

  • 前缘和顶约束所有-不限
  • 固定的宽度和高度的任何-不限

该标签具有以下约束条件:

  • 尾随约束的SuperView - 所有-任何
  • 对ImageView的最大限制 - 仅用于Regular-Regular
  • 对Superview的主要限制 - 仅适用于Regular-Regular
  • 顶部约束到上海华 - 所有,任何但是对于常规定期
  • 导致约束ImageView的不是 - 所有,任何但是对于常规定期

不是我还实施返回不同的方法根据当前的特征集合单元尺寸:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 
    if (traitCollection.horizontalSizeClass == .Regular) { 
     return CGSizeMake(240, 194) 
    } 
    else { 
     return CGSizeMake(340, 128) 
    } 
    } 

细胞看起来很好的预览,当我在iPhone上(如紧凑型普通)运行它的一切工作正常。然而,当我在iPad上运行自动布局打破:

enter image description here

当然,我得到了一堆在调试控制台的警告:无法同时满足的约束。

所以,我想问题是 - 为不同大小类别设置单元格的正确方法是什么?

我创建了一个github上回购了demo project

谢谢!

+1

如果只支持iOS的9和更高版本,可以通过使用stackView –

回答

2

你想要做的是禁用这些限制对于常规常规尺寸类像你有,而且还改变了他们的优先< 1000(什么即不需要)。这样,它将使用特定大小类的更高优先级约束。

enter image description here

+0

这似乎工作,即使它有点违反直觉,你必须改变优先级,以使自动布局使用适当的约束。是不是卸载约束对于自动布局引擎足够清楚的指示,我不希望它在这个特定的大小类?我会再等几天,如果没有更好的答案,那么我会接受并给你一个奖励=)谢谢! – almas

+0

@almas我想到了这一点,我的意见是约束并没有真正被删除。解决这个问题的方法是为所有其他大小类别明确设置它,以便您可以禁用顶级“已安装”复选标记。请参阅我的更新后的公共关系,只需降低优先级即可。 –

0

这可能不是最完美的解决方案,但我尝试过去做这导致更多的痛苦与自动布局规模类和我找到了最好的解决办法是:

  1. 有一个单独的笔尖每个尺寸类,然后根据需要布置各个视图。
  2. 对于每个尺寸类别都有单独的CollectionViewFlowLayouts,然后在尺寸更改时在它们之间转换。

按照此模式的单元尺寸将由collectionViewFlowlayout而不是sizeForItem...确定,你将有超过其他参数如sectionInsetminimumLineSpacing等集合视图中改变大小的类时,往往需要不同的更多的控制。

这里是为我工作的代码更改:

let cellIdentifierCompact = "CustomCellCompact" 
    let cellIdentifierRegular = "CustomCellReg" 

    lazy var compactLayout: UICollectionViewFlowLayout = { 
    let layout = UICollectionViewFlowLayout() 
    layout.itemSize = CGSizeMake(240, 194) 
    return layout 
    }() 

lazy var regLayout: UICollectionViewFlowLayout = { 
    let layout = UICollectionViewFlowLayout() 
    layout.itemSize = CGSizeMake(320, 128) 
    return layout 
    }() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let customCellNib = UINib(nibName: cellIdentifierCompact, bundle: nil) 
    self.collectionView.registerNib(customCellNib, forCellWithReuseIdentifier: cellIdentifierCompact) 

    let customCellNibReg = UINib(nibName: cellIdentifierRegular, bundle: nil) 
    self.collectionView.registerNib(customCellNibReg, forCellWithReuseIdentifier: cellIdentifierRegular) 
    self.configureLayoutForSize() 
    } 


func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cellId = self.collectionView.collectionViewLayout == self.regLayout ? cellIdentifierRegular : cellIdentifierCompact 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(cellId, forIndexPath: indexPath) 
    return cell 
    } 

    func configureLayoutForSize(){ 
    switch self.traitCollection.horizontalSizeClass{ 
    case UIUserInterfaceSizeClass.Regular: 
     self.collectionView.setCollectionViewLayout(self.regLayout, animated: false) 
    case .Compact, .Unspecified: 
     self.collectionView.setCollectionViewLayout(self.compactLayout, animated: false) 
    } 
    } 

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 
    self.configureLayoutForSize() 
    self.collectionView.reloadData() 
    } 
+0

感谢这个答案@Dallas做到这一点。我相信这个问题有很多解决方法,包括你的建议。但是,我认为有多个笔尖和流布局是一个矫枉过正的问题,特别是对于这样一个简单的单元格布局。理想情况下,我想了解我的实现有什么问题 - 是iOS错误,还是代码/笔尖中存在错误? – almas

相关问题