自动布局和集合视图问题

Posted

技术标签:

【中文标题】自动布局和集合视图问题【英文标题】:Autolayout and Collection View Issue 【发布时间】:2013-06-05 05:09:53 【问题描述】:

所以基本问题是,当我单击单元格时,它应该转到新视图控制器中的单元格索引 1,但是当您启用自动布局时。 collectionview 内容偏移量变化消失并被重置。关闭它,工作正常。自动布局以某种方式导致内容偏移重置,但我不确定为什么或如何解决此问题。

此处提供代码。

https://github.com/HaloZero/AutolayoutCollectionViewIssue

【问题讨论】:

如果您从 viewDidAppear 而不是 viewWillAppear 调用 snapToCellAtIndex:withAnimation:method,它可以工作。但是,您确实会在第二个单元格出现之前短暂地看到第一个单元格。 你好@HaloZero你在哪里......我已经解决了你的问题请在你身边测试。 【参考方案1】:

使用你的代码:--

- (void) viewWillAppear:(BOOL)animated 
    [super viewWillAppear:animated];
    [self performSelectorOnMainThread:@selector(doyouwork) withObject:nil waitUntilDone:NO];


-(void)doyouwork

    [self snapToCellAtIndex:1 withAnimation:NO];


- (void) snapToCellAtIndex:(NSInteger)index withAnimation:(BOOL) animated

    NSIndexPath *path = [NSIndexPath indexPathForRow:index inSection:0];
    [self.collectionView scrollToItemAtIndexPath:path atScrollPosition:UICollectionViewScrollPositionLeft animated:animated];

为我工作。

【讨论】:

那么视图 WillAppear 不会在主线程上发生吗?抱歉,回复延迟了,我在 WWDC 上把这个告诉苹果人,他们提到我应该把它作为一个错误提交。【参考方案2】:

不是自动布局重置内容偏移,而是当你尝试捕捉单元格时,子视图没有定位。

使用自动布局,子视图的位置会稍晚一点(其中首先调用 viewWillAppear)。尝试使用 viewDidLayoutSubviews 来捕捉单元格:

来自viewDidLayoutSubviews 的文档:

通知视图控制器它的视图刚刚布置了它的子视图。

所以在计算完所有的约束并放置好你的子视图之后,你就可以调用捕捉方法了。

- (void)viewDidLayoutSubviews

    [super viewWillLayoutSubviews];
    [self snapToCellAtIndex:1 withAnimation:NO];

【讨论】:

以上是关于自动布局和集合视图问题的主要内容,如果未能解决你的问题,请参考以下文章

集合视图、自动布局 UICollectionViewFlowLayout 和 itemSize

根据各种屏幕尺寸自动布局集合视图

集合视图自动布局

集合视图单元格的自动布局行为怪异

如何通过自动布局设置集合视图单元格大小

带有子视图的自动布局 NSCollectionView