我只能说的是,您需要对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];
}
您必须子类化另一个UIView,该UIView被定义为自定义UiCollectionView的标题。然后,您必须在UIView / UICollectionView委托的自定义子视图中声明UIView自定义标题视图,然后将该自定义子视图的标题设置为UICollctionViewdelegate。然后,您应该将UIView / UIcollectionView的这个复合子类引入到您的UIViewController中。哦,是的,在您的layoutSubViews中,请确保进行通过双层子类传递的高度计算。因此,您将拥有以下文件:
UIVew 这是UICollectionView的委托和我之前提到的内容
UIView 这是UISCrollViewDelegate,也是标题视图
UIViewController 将第1步子类化的UIView引入其中
UIView 第1步的子类,引入第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的最大高度,然后将其传递到截取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个自定义子类,这些子类要么是自己的子类,要么是复合子类或我的自己的子类的子类。我告诉你这个,让你了解到需要多少代码才能做到这一点,而不是吓唬你,但也让你知道可能需要一段时间才能做好,并且如果需要一段时间才能使其正常工作,请不要责备自己。祝你好运!