ios – UICollectionView布局不一致,UICollectionViewFlowLayout

前端之家收集整理的这篇文章主要介绍了ios – UICollectionView布局不一致,UICollectionViewFlowLayout前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我无法以一致的方式在UICollectionView中显示单元格.单元的初始显示是正确的,但是每次用户滚动过去然后返回到一组单元格时,显示都是不正确的.行应该只包含2个或1个单元格. 2个单元格,每个显示宽度的一半,1个单元格占全宽.
  1. - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
  2. {
  3. return [self preferredSizeForIndexPath:indexPath];
  4. }
  5.  
  6. - (CGSize)preferredSizeForIndexPath:(NSIndexPath *)indexPath {
  7.  
  8. BOOL isLastObjectInSection = NO;
  9. NSString *sectionKey = [[arrCollectionData[indexPath.section] allKeys] objectAtIndex:0];
  10. DLog(@"SectionKey: %@",sectionKey);
  11. NSArray *arrSection = [arrCollectionData[indexPath.section] objectForKey:sectionKey];
  12. DLog(@"ArrSection: %@",arrSection);
  13.  
  14. if ( arrSection[indexPath.row] == arrSection.lastObject ) {
  15. if( arrSection.count % 2 != 0 ) {
  16. isLastObjectInSection = YES;
  17. }
  18. }
  19.  
  20. CGSize cellSize = CGSizeZero;
  21. if (UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation])) {
  22. if (isLastObjectInSection == YES) {
  23. cellSize = CGSizeMake(IPAD_BADGE_WIDTH_LANDSCAPE_WIDE,IPAD_BADGE_HEIGHT_LANDSCAPE_WIDE);
  24. } else {
  25. cellSize = CGSizeMake(IPAD_BADGE_WIDTH_LANDSCAPE,IPAD_BADGE_HEIGHT_LANDSCAPE);
  26. }
  27. } else {
  28. if (isLastObjectInSection == YES) {
  29. cellSize = CGSizeMake(IPAD_BADGE_WIDTH_WIDE,IPAD_BADGE_HEIGHT_WIDE);
  30. } else {
  31. cellSize = CGSizeMake(IPAD_BADGE_WIDTH,IPAD_BADGE_HEIGHT);
  32. }
  33. }
  34. DLog(@"CellSize: %@",NSStringFromCGSize(cellSize));
  35. return cellSize;
  36.  
  37. }

以下是收集数据的示例.

  1. Printing description of self->arrCollectionData:
  2. <__NSArrayI 0x94bbc40>(
  3. {
  4. "March 12,2013" = (
  5. "<FMLeafTimelineContainer: 0x94b2430>","<FMLeafTimelineContainer: 0x94b3670>"
  6. );
  7. },{
  8. "February 25,2013" = (
  9. "<FMLeafTimelineContainer: 0x94b4500>"
  10. );
  11. },{
  12. "February 14,2013" = (
  13. "<FMLeafTimelineContainer: 0x94b48f0>","<FMLeafTimelineContainer: 0x94b3a60>"
  14. );
  15. },{
  16. "February 12,2013" = (
  17. "<FMLeafTimelineContainer: 0x94b3ce0>","<FMLeafTimelineContainer: 0x94b2b00>"
  18. );
  19. },{
  20. "February 4,2013" = (
  21. "<FMCommunityTimelineContainer: 0x94b4e90>","<FMCommunityTimelineContainer: 0x94b5050>","<FMCommunityTimelineContainer: 0x94b5f70>"
  22. );
  23. },{
  24. "January 30,2013" = (
  25. "<FMCommunityTimelineContainer: 0x94b6ad0>","<FMCommunityTimelineContainer: 0x94b5a90>"
  26. );
  27. },{
  28. "January 24,2013" = (
  29. "<FMCommunityTimelineContainer: 0x94b5d00>","<FMCommunityTimelineContainer: 0x94b6d90>"
  30. );
  31. },{
  32. "January 22,2013" = (
  33. "<FMCommunityTimelineContainer: 0x94b6440>"
  34. );
  35. },{
  36. "January 21,2013" = (
  37. "<FMCommunityTimelineContainer: 0x94b6260>","<FMCommunityTimelineContainer: 0x94b62e0>","<FMCommunityTimelineContainer: 0x94b70c0>","<FMCommunityTimelineContainer: 0x94b55a0>","<FMCommunityTimelineContainer: 0x94b82d0>","<FMCommunityTimelineContainer: 0x94b78b0>"
  38. );
  39. },{
  40. "December 20,2012" = (
  41. "<FMCommunityTimelineContainer: 0x94b53f0>"
  42. );
  43. },{
  44. "December 6,2012" = (
  45. "<FMCommunityTimelineContainer: 0x94b7200>"
  46. );
  47. },{
  48. "December 4,2012" = (
  49. "<FMCommunityTimelineContainer: 0x94b72b0>"
  50. );
  51. },{
  52. "November 19,2012" = (
  53. "<FMCommunityTimelineContainer: 0x94b7ae0>"
  54. );
  55. }
  56. )

下面的图片都展示了集合视图的相同部分.

解决方法

问题是由父实例的子视图引起的,该子视图具有在实例化时分配的固定帧大小. Overrode setFrame:用于UICollectionView子类以分配子视图帧的值,每次单元格出列并重新排队时调用setFrame:进行相应调整.

猜你在找的iOS相关文章