Ios LayoutAttributesForelementsRect:方法问题,如何使集合视图中的项目从中心淡出?
我有一个带有项目的Ios LayoutAttributesForelementsRect:方法问题,如何使集合视图中的项目从中心淡出?,ios,xcode,ios7,collectionview,Ios,Xcode,Ios7,Collectionview,我有一个带有项目的UICollectionView。我希望中间的项目是全彩的,靠近集合视图垂直边界的项目慢慢褪色。 我提出了我的layouttributesforementsinrect的自定义实现,但它似乎没有按预期工作 首先,它很少被调用。一次是在启动时,有时是以后,通常是在我接近collectionViewend时。 其次,我没有得到标准化的距离,它从-2到6,我只想要0到1 我到底有什么地方不及格?我取可见矩形并计算从单元中心到其边缘的距离,然后对其进行规格化 - (NSArray *)
UICollectionView
。我希望中间的项目是全彩的,靠近集合视图垂直边界的项目慢慢褪色。
我提出了我的layouttributesforementsinrect
的自定义实现,但它似乎没有按预期工作
首先,它很少被调用。一次是在启动时,有时是以后,通常是在我接近collectionView
end时。
其次,我没有得到标准化的距离,它从-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;
}
更新:
以下是我想要的:
当日期的顶行(22-28)接近集合视图的边缘时,我希望它们慢慢淡出。最后一排也是如此。如您所见,日期1和日期2已经不可见,因为它们是浅灰色的。日期1-31为黑色,因为我突出显示了现在占据大多数视图的月份
现在,我通过每次滚动后的滚动视图委托方法执行此操作,但这是一段非常难看的代码。我想在布局属性方法中也这样做。恐怕我认为您在这方面不会有太多运气。我认为
layoutatributesforelementsinrect
很少被调用,因为就collectionView而言,它的“内容视图”没有改变——只有contentOffset。scrollView代理代码应该能够识别偏移量何时发生变化,因此(大概)可以强制重新加载相关单元格以获得正确的alpha
关于规范化代码,我想传递给该方法的Rect必须比collectionView的边界大得多-您是否尝试通过日志记录来准确确定传递的Rect?或者super是懒惰的,并且为所有内容传递属性,不管它们是否在该矩形中。您的
CGRectIntersectsRect
应该能够捕捉到这一点,但这也可能包括边缘位于Rect内但中心位于Rect外的单元格。为了处理负值,你应该使用fabs
来获得距离中心的绝对值。恐怕你不会有太多的运气。我认为layoutatributesforelementsinrect
很少被调用,因为就collectionView而言,它的“内容视图”没有改变——只有contentOffset。scrollView代理代码应该能够识别偏移量何时发生变化,因此(大概)可以强制重新加载相关单元格以获得正确的alpha
关于规范化代码,我想传递给该方法的Rect必须比collectionView的边界大得多-您是否尝试通过日志记录来准确确定传递的Rect?或者super是懒惰的,并且为所有内容传递属性,不管它们是否在该矩形中。您的
CGRectIntersectsRect
应该能够捕捉到这一点,但这也可能包括边缘位于Rect内但中心位于Rect外的单元格。为了处理负值,你应该使用fabs
来获得距离中心的绝对值。恐怕你不会有太多的运气。我认为layoutatributesforelementsinrect
很少被调用,因为就collectionView而言,它的“内容视图”没有改变——只有contentOffset。scrollView代理代码应该能够识别偏移量何时发生变化,因此(大概)可以强制重新加载相关单元格以获得正确的alpha
关于规范化代码,我想传递给该方法的Rect必须比collectionView的边界大得多-您是否尝试通过日志记录来准确确定传递的Rect?或者super是懒惰的,并且为所有内容传递属性,不管它们是否在该矩形中。您的
CGRectIntersectsRect
应该能够捕捉到这一点,但这也可能包括边缘位于Rect内但中心位于Rect外的单元格。为了处理负值,你应该使用fabs
来获得距离中心的绝对值。恐怕你不会有太多的运气。我认为layoutatributesforelementsinrect
很少被调用,因为就collectionView而言,它的“内容视图”没有改变——只有contentOffset。scrollView代理代码应该能够识别偏移量何时发生变化,因此(大概)可以强制重新加载相关单元格以获得正确的alpha
关于规范化代码,我想传递给该方法的Rect必须比collectionView的边界大得多-您是否尝试通过日志记录来准确确定传递的Rect?或者super是懒惰的,并且为所有内容传递属性,不管它们是否在该矩形中。您的CGRectIntersectsRect
应该能够捕捉到这一点,但这也可能包括边缘位于Rect内但中心位于Rect外的单元格。为了处理负值,您应该使用fabs
获得距离中心的绝对值