我只能说你需要继承 UIView 并使其成为 UIGestureRecognizerDelegate 和 UICollectionViewDelegate 的代表,然后在你的 UIView 子类中,执行以下操作,因为代码虽然拥有,但我无法提供更多信息就我自己而言,它是专有的,可能会激怒我使用它的很多组织,所以这里是秘诀:
CGPoint contentOffset = [scrollView contentOffset];
CGFloat newHeight = [_headerView maxHeight] - contentOffset.y;
CGRect frame = [_headerView frame];
if (newHeight > [_headerView maxHeight]) {
frame.origin.y = contentOffset.y;
frame.size.height = [_headerView maxHeight];
[_headerView setFrame:frame];
} else if (newHeight < [_headerView minHeight]) {
frame.origin.y = contentOffset.y;
frame.size.height = [_headerView minHeight];
[_headerView setFrame:frame];
} else {
frame.origin.y = contentOffset.y;
frame.size.height = newHeight;
[_headerView setFrame:frame];
}
if ([_delegate respondsToSelector:@selector(scrollViewDidScroll:)]) {
return [_delegate scrollViewDidScroll:scrollView];
}
您必须将另一个定义为此自定义 UiCollectionView 标头的 UIView 子类化。然后,您必须在 UIView/UICollectionView 委托的自定义子视图中声明 UIView 自定义标题视图,然后在 UICollctionViewdelegate 中设置该自定义子视图的标题。然后,您应该将 UIView/UIcollectionView 的复合子类拉入您的 UIViewController。哦,是的,并且在您的 layoutSubViews 中,确保您执行通过双层子类传递的高度计算。因此,您将拥有以下文件:
UIVew 这是 UICollectionView 的代表,也是我之前提到的
UIView 这是一个 UISCrollViewDelegate 这是标题视图
在编号 1 中拉入子类 UIView 的 UIViewController
1 号的 UIView 子类拉入 2 号并将其设置为标题
在第 4 部分,请确保您执行以下操作:
- (CGFloat)maxHeight
{
if (SCREEN_WIDTH == 414)
{
return 260;
}else if (SCREEN_WIDTH == 375)
{
return 325;
}else
{
return 290;
}
}
- (CGFloat)minHeight
{
if (SCREEN_WIDTH == 414)
{
return 90;
}else if (SCREEN_WIDTH == 375)
{
return 325;
}else
{
return 290;
}
}
这将传递给 UIView 子类,它是我已经解释过的复合子类。这个想法是在这个header UIView的子类(上面的第2个)中捕获你的header的maxHeight,然后将它传递给在scrollViewDidScroll中截取这些值的主UIView子类。
最后一点信息,确保你在所有方法中设置你的 layoutSubviews 来拦截滚动事件。例如上面的数字 1,layoutsubviews 方法是这样的:
- (void)layoutSubviews
{
CGRect frame = [_headerView frame];
frame.size.width = [self frame].size.width;
[_headerView setFrame:frame];
[super layoutSubviews];
}
这就是我能给你的全部了,我希望我能发布更多,但这应该让你了解它是如何在生产环境中为你在野外看到的大型应用程序完成的。
还有一点需要注意。当你开始走上这样密集的实现之路时,不要惊讶地发现,例如,应用程序中的单个视图控制器可以使用我解释过的方法,将有 30-40 个自定义子类它们本身就是子类,或者是复合子类或我自己的子类或我自己的子类的子类。我告诉你这个是为了让你知道需要多少代码才能做到这一点,不是吓唬你,而是让你知道可能需要一段时间才能做到这一点,并且不要自责如果需要一段时间才能工作。祝你好运!!