gpt4 book ai didi

ios - layoutAttributesForElementsInRect : method trouble, 如何使 Collection View 中的项目从中心淡出?

转载 作者:行者123 更新时间:2023-11-28 19:56:07 28 4
gpt4 key购买 nike

我有一个包含项目的 UICollectionView。我希望中心的项目是全彩色的,而靠近收藏 View 垂直边界的项目会慢慢淡出。我想出了 layoutAttributesForElementsInRect 的自定义实现,但它似乎没有按预期工作。

首先,它很少被调用。一次在启动时,有时在稍后,通常是在我接近 collectionView 结束时。其次,我无法获得归一化距离,它从 -2 到 6,我只想要 0 到 1。

我到底失败了什么?我采用可见矩形并计算从单元中心到其边缘的距离,然后对其进行归一化。

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
NSArray *attribs = [super layoutAttributesForElementsInRect:rect];

CGRect visibleRect;
visibleRect.origin = self.collectionView.contentOffset;
visibleRect.size = self.collectionView.bounds.size;

for (UICollectionViewLayoutAttributes *attributes in attribs) {
if (CGRectIntersectsRect(attributes.frame, rect)) {

CGFloat distanceFromCenter = CGRectGetMidY(visibleRect) - attributes.center.y;
CGFloat normalizedDistance = distanceFromCenter / (visibleRect.size.height / 2);
attributes.alpha = 1 - normalizedDistance;
}
}

return attribs;
}

更新:

这是我想要的:

enter image description here

当第一行日期 (22-28) 接近 Collection View 的边缘时,我希望它们慢慢淡出。最后一行也是如此。如您所见,日期 1 和 2 已经不可见,因为它们是浅灰色。日期 1-31 是黑色的,因为我突出显示了现在占据大部分 View 的月份。

我现在在每次滚动后通过 ScrollView 委托(delegate)方法执行此操作,但这是非常难看的代码。
我想在布局属性方法中做同样的事情。

最佳答案

恐怕我不认为你会在这方面有很多运气。我认为 layoutAtrributesForElementsInRect 很少被调用,因为就 collectionView 而言,它的“内容 View ”没有改变——只有 contentOffset。您的 scrollView 委托(delegate)代码应该能够识别偏移量何时发生变化,因此(大概)您可以强制重新加载相关单元格以为它们提供正确的 alpha。

关于您的规范化代码,我想传递给该方法的 Rect 必须比 collectionView 的边界大得多 - 您是否尝试过记录以确定传递的是哪个 Rect?或者也许 super 是懒惰的并且为所有东西传递属性,无论它们是否在那个 Rect 中。您的 CGRectIntersectsRect 应该捕捉到这一点,但这也可能包括边缘落在 Rect 内但中心落在 Rect 外的单元格。为了应对负值,您应该使用 fabs 来获取距中心距离的绝对值。

关于ios - layoutAttributesForElementsInRect : method trouble, 如何使 Collection View 中的项目从中心淡出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26319593/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com