启用分页功能的UICollectionView Center单元格

问题描述:

一直尝试使用UICollectionView对齐我的单元格并启用分页功能。不幸的是,当尝试这样做时,我永远无法让细胞在中心对齐。当我滚动收集时,细胞总是稍微偏离。我试图为纵向和横向视图做到这一点。香港专业教育学院使用的插图被尝试和中心的细胞和它们的位置:启用分页功能的UICollectionView Center单元格

- (UIEdgeInsets)collectionView: 
(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { 
    CGFloat cellSpacing = ((UICollectionViewFlowLayout *) collectionViewLayout).minimumLineSpacing; 
    CGFloat cellWidth = ((UICollectionViewFlowLayout *) collectionViewLayout).itemSize.width; 
    NSInteger cellCount = [collectionView numberOfItemsInSection:section]; 
    CGFloat inset = (collectionView.bounds.size.width - ((cellCount) * (cellWidth + cellSpacing))) * 0.5; 
    inset = MAX(inset, 0.0); 

    if(UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)){ 
     return UIEdgeInsetsMake(50.0,inset,0.0,inset); // top, left, bottom, right 
    } 
    else{ 
     return UIEdgeInsetsMake(50.0,inset,0.0,inset); // top, left, bottom, right 
    } 
} 

我再变线间距:

-(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*) 
collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section{ 

    CGFloat cellSpacing = ((UICollectionViewFlowLayout *) collectionViewLayout).minimumLineSpacing; 
    CGFloat cellWidth = ((UICollectionViewFlowLayout *) collectionViewLayout).itemSize.width; 
    NSInteger cellCount = [collectionView numberOfItemsInSection:section]; 
    CGFloat inset = (collectionView.bounds.size.width - ((cellCount-1) * (cellWidth + cellSpacing))) * 0.5; 
    inset = MAX(inset, 0.0); 

    if(UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)){ 

     NSLog(@"Changed to landscape Spacing"); 
     return inset; 

    } 
    else{ 

     return inset; 
    } 

我的细胞的大小都在这里设置:

-(CGSize) 
    collectionView:(UICollectionView *) collectionView 
    layout:(UICollectionViewLayout*)collectionViewLayout 
    sizeForItemAtIndexPath:(NSIndexPath *)indexPath{ 

    //Set Landscape size of cells 
    if(UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)){ 
     CGFloat cellWidth = [[UIScreen mainScreen] bounds].size.width-360; 
     CGFloat cellHeigt = [[UIScreen mainScreen] bounds].size.height-60; 
     NSLog(@"Is Landscape"); 
     return CGSizeMake(cellWidth, cellHeigt); 
    } 
    //Set Potrait size of cells 
    else{ 
     CGFloat cellWidth = [[UIScreen mainScreen] bounds].size.width-60; 
     CGFloat cellHeigt = [[UIScreen mainScreen] bounds].size.height-160; 
     NSLog(@"Is Portrait"); 
     return CGSizeMake(cellWidth, cellHeigt); 
    } 
} 
+0

您是否已启用对属性检查器中集合视图的分页?而不是使用像360或60这样的幻数,您应该使用相对于屏幕大小的值,即基于屏幕宽度/高度的分割(因为它可能会在具有不同屏幕大小的设备上失败)。 – Rikh

+0

是的,我使用这些'魔术'数字,以便我可以为单元格获得合适的大小。你会如何建议我获得最好的细胞大小?至于分页,我通过集合代理启用它。 'coll.pagingEnabled = YES;' –

+0

嗯,我不确定你试图达到什么,但不是试图操纵单元格的内容视图(因为它留下了错误空间),我只是简单地设置单元格为整个屏幕宽度,然后使用autoLayout将其内容居中。如果您可以发布您想要实现的图像,也许我可以提供帮助! – Rikh

而不是尝试以编程方式设置框架,您可以简单地设置单元格占用整个宽度UICollectionView并使用autoLayout将内容居中,这样您就不必考虑界面变化和不同屏幕尺寸作为autoLayout将为您处理。在您的数据源,

-(CGSize) 
    collectionView:(UICollectionView *) collectionView 
    layout:(UICollectionViewLayout*)collectionViewLayout 
    sizeForItemAtIndexPath:(NSIndexPath *)indexPath{ 

    return CGSizeMake(collectionView.bounds.size.width, collectionView.bounds.size.height) 
} 

设置你的所有项目间的间距为0,并启用分页为UICollectionView

接下来只需使用的autoLayout设置内容到细胞内中心!

+0

是的,正如我想要的,感谢您的帮助:) –

试试这个。你必须采取UICollectionViewFlowLayout并设置它的滚动方向,最小空间并附加到集合视图布局。

UICollectionViewFlowLayout *flowLayout; 

    - (void)viewDidLoad { 
     [super viewDidLoad]; 
    flowLayout = [[UICollectionViewFlowLayout alloc]init]; 

     flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal; 
     flowLayout.minimumInteritemSpacing = 0.0; 

     flowLayout.minimumLineSpacing = 0.0; 

     _obj_CollectionView.pagingEnabled = YES; 
     _obj_CollectionView.collectionViewLayout = flowLayout; 
    } 

如果你想垂直滚动修改它。

希望它能起作用。

+0

谢谢,我会给这个镜头 –