这是我的问题:我正在开发iOS上的Kodi Remote(http://forum.kodi.tv/showthread.php?tid=235973)并且一切运行良好(经典开发)但我有一个我无法解释的行为。
我有多个视图控制器;在其中一个(包含UICollectionView的UIViewController)中,我实现了这个委托方法:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
CGSize originalSize = [(UICollectionViewFlowLayout *)collectionViewLayout itemSize];
CGSize collectionViewSize = [collectionView frame].size;
CGFloat interItemSpacing = [(UICollectionViewFlowLayout *)collectionViewLayout minimumInteritemSpacing];
UICollectionViewFlowLayout *collectionViewFlowLayout = (UICollectionViewFlowLayout *)[[self collectionView] collectionViewLayout];
UIEdgeInsets sectionInset = [collectionViewFlowLayout sectionInset];
CGFloat usableWidth = (collectionViewSize.width - ((kColumns - 1) * interItemSpacing) - sectionInset.left - sectionInset.right);
CGFloat width = usableWidth / kColumns;
CGFloat height = width * originalSize.height / originalSize.width;
return CGSizeMake(width, height);
}
我得到了集合视图框架(边界是相同的,当然,我不需要原点)并且它工作得很好。无论高度如何,我都可以使用iPhone 5模拟器288宽度。
但是,在故事板中视图控制器的复制粘贴中,我获得了304宽度。最奇怪的行为是使用FLEX,在渲染之后,集合视图的尺寸为288像素。
“唯一”的区别在于第一个视图控制器刚被推送,第二个视图控制器包含在UITabBarController中。
PS:我正在谈论的第一个屏幕是第3个&第4个截图。如果有人对此有解释,我会接受它;)
更新1:
如果我在 - (void)viewDidLayoutSubviews中使集合视图布局无效,则会正确绘制项目但是有一个闪存,因为整个集合视图被重绘(下面的标题和项目)。
答案 0 :(得分:1)
- (CGSize)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout*)collectionViewLayout
sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return CGSizeMake(self.collectionView.frame.size.width,
self.collectionView.frame.size.height);
}
并取消选中"限制边距"并单击所有点缀的红色约束 所以-8填充将在iPhone 6 +中消失
答案 1 :(得分:0)
使用Storyboard
解决问题时,这很有意义。首先,您将清楚地了解您的设计。其次,您可以使用完整的0行代码构建应用程序,从而导致0个错误。
父UITabBarController
和一组UINavigationController
是一种常见的设计模式,只有当您按照以下方式实现它时,才能获得正确的UI行为。
您不必使用Storyboard
来创建上面的层次结构。您可以以编程方式将UIViewController
嵌入UINavigationController
。
►在GitHub上找到此解决方案,并在Swift Recipes上找到其他详细信息。