的iOS 6.0:UICollectionView不尊重与pagingEnabled clipsTo

2019-08-08 00:35发布

背景

我实施UICollectionView ,努力实现瓷砖的分页水平滚动视图(首次)。 我想每瓦在与它的姐妹瓷砖左右(类似在Safari浏览器的应用程序的页面选择器)部分可见的框架的中心显示。 我感兴趣的使用UICollectionView利用内置电池的出列,宁可不使用一个旋转UITableView

问题

我发现的问题是,当使用pagingEnabled = YESclipsToBounds = NO ,在UICollectionView去除细胞外collectionView帧(他们不是在visibleCells尽快分页完成阵列)。 任何人都可以提供关于如何实现显示姐瓷砖的预览,同时保持这些基本设置的效果建议? 还是我处理这个错误?

截图

开始 滚动 结束

滚动屏幕是完全正确的。 但在开始和结束的镜头我希望这是绿色可见蓝色的利润。

下面是在我的AppDelegate.m(信贷tutsplus.com这里基本设置):

#import "AppDelegate.h"

@interface ViewController : UICollectionViewController
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"ID"];
    [self.view setBackgroundColor:[UIColor blueColor]];
    // pad the collection view by 20 px
    UIEdgeInsets padding = UIEdgeInsetsMake(20.0, 20.0, 20.0, 20.0);
    [self.collectionView setFrame:UIEdgeInsetsInsetRect(self.view.frame, padding)];
    // set pagingEnabled and clipsToBounds off
    [self.collectionView setPagingEnabled:YES];
    [self.collectionView setClipsToBounds:NO];
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return 5;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ID" forIndexPath:indexPath];
    UILabel *label = [[UILabel alloc] initWithFrame:cell.bounds];
    label.textAlignment = NSTextAlignmentCenter;
    label.text = [NSString stringWithFormat:@"%d", indexPath.row];
    [label setBackgroundColor:[UIColor greenColor]];
    [cell.contentView addSubview:label];
    return cell;
}
@end

@implementation AppDelegate
{
    ViewController *vc;
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // setup the UICollectionViewFlowLayout
    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
    layout.itemSize = CGSizeMake(280, 280);
    layout.minimumInteritemSpacing = 0;
    layout.minimumLineSpacing = 0;
    layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
    // add a custom UICollectionViewController to the window
    vc = [[ViewController alloc] initWithCollectionViewLayout:layout];
    self.window.rootViewController = vc;
    self.window.backgroundColor = [UIColor yellowColor];
    [self.window makeKeyAndVisible];
    return YES;
}
@end

Answer 1:

事实证明,要解决这个实际上是相当简单的。 我只是需要重叠UICollectionViewCell细胞像素足以让他们的的CollectionView的框架内仍然显示分页滚动结束后。 该培训相关的代码是

layout.itemSize = CGSizeMake(300, 300);
layout.minimumLineSpacing = -20.0;

和余子类的UICollectionViewFlowLayout和重载了(CGSize)collectionViewContentSize方法返回单元的非重叠的大小。



Answer 2:

非常感谢有关使用负minimumLineSpacing尖端。 我创建了使用从XIB文件加载的集合视图细胞的测试器的应用程序。 所述细胞具有透明背景和用于该单元的内容的“内”图。

通过这种方式,自定义的流布局是没有必要的。

https://github.com/j4johnfox/CollectionViewTester



Answer 3:

我不是的CollectionView的专家,但它可能是可能与这条线在cellForItemAtIndexPath做:

[cell.contentView addSubview:label];

每次它叫,另一个标签子视图加入到细胞。 无论是检查现有标签或子类UICollectionViewCell?



Answer 4:

你要还覆盖-pointInside:withEvent:允许滚动手势集合视图的框架之外开始。 我这样做是使用UIEdgeInsets在我收集视图子类属性:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    CGRect extendedBounds = UIEdgeInsetsInsetRect(self.bounds, self.touchAreaInsets);

    return CGRectContainsPoint(extendedBounds, point);
}

如果你不需要App Store的安全性,您可以覆盖_visibleBounds避免负面间距黑客:

- (CGRect)_visibleBounds {
     return UIEdgeInsetsInsetRect(self.bounds, self.touchAreaInsets);
}

如果你不是太压上的代码大小和需要App Store的安全,你也可以继承PSTCollectionView并可能覆盖visibleBoundRects达到相同的效果。



文章来源: iOS 6.0: UICollectionView doesn't respect clipsToBounds with pagingEnabled