gpt4 book ai didi

iphone - UIScrollView。关于实现 "infinite"滚动/缩放有什么想法吗?

转载 作者:行者123 更新时间:2023-12-03 18:19:51 25 4
gpt4 key购买 nike

因此,UITableView 本质上支持“无限”滚动。可能有一个限制,但那个傻瓜可以滚动很长时间。我想用 UIScrollView 模仿这种行为,但有两个基本障碍:

1)scrollView.contentSize在创建时固定。2) 缩放可以让任何延迟加载方案彻底崩溃,因为它会导致无限的数据爆炸。

其他人考虑过这个想法吗?是的,我知道,我们本质上是在讨论重新创建 Google map 。任何见解将不胜感激。

干杯,道格

最佳答案

我刚刚完成了无限滚动的实现。在我的实现中,我有带有 ScrollView 和导航按钮的 UITableViewCell。 ScrollView 包含 x 个具有相同宽度的 View 。 View 水平对齐并启用分页。

scrollView.clipsToBounds = YES;
scrollView.scrollEnabled = YES;
scrollView.pagingEnabled = YES;
scrollView.showsHorizontalScrollIndicator = NO;

我的代码逻辑如下:

  1. 在我的初始化函数中我
    • 创建所有 View (对于 ScrollView )和
    • 将它们放入数组中
    • 将它们添加到 ScrollView
  2. 然后我调用一个函数,该函数在循环中计算每个 View 的位置(每次检测到滚动时也需要调用该函数)。它总是采用数组的第一个元素并将框架设置为 (0,0,...,...),第二个元素设置为 (i*width,0,....,....) 等等在。被调用的函数如下所示:

    - (void)updateOffsetsOfViews{
    int xpos = 0;
    for (int i=0; i<[views count]; i++) {
    UIImageView *_view = [views objectAtIndex:i];
    CGRect aFrame = _view.frame;
    aFrame.origin.x = xpos;
    aFrame.origin.y = 0.0;
    _view.frame = aFrame;
    xpos += viewWidth;
    }
    float center = 0;
    if(fmod([views count],2) == 1){
    center = viewWidth * ([views count]-1)/2;
    }else {
    center = viewWidth * [views count]/2;
    }
    [scrollView setContentOffset:CGPointMake(center, 0)];
    lastOffset = center;
    }
  3. 然后(仍在初始化过程中)我添加一个观察者

    [scrollView addObserver:self forKeyPath:@"contentOffset" options:0 context:nil];

    所以每次 ScrollView 中的某些内容发生变化时,我都会调用 (observeValueForKeyPath) 函数,如下所示:

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object  change:(NSDictionary *)change context:(void *)context
    {
    UIImageView *_viewFirst = (UIImageView *)[views objectAtIndex:0];
    if ( fmod([scrollView contentOffset].x,viewWidth) == 0.0) {
    if ([scrollView contentOffset].x > lastOffset) {
    [views removeObjectAtIndex:0];
    [views addObject:_viewFirst];
    [self updateOffsetsOfViews];
    }else if ([scrollView contentOffset].x < lastOffset) {
    UIImageView *_viewLast = (UIImageView *)[views lastObject];
    [views removeLastObject];
    [views insertObject:_viewLast atIndex:0];
    [self updateOffsetsOfViews];
    }
    }
    }
  4. 在 dealloc 或 viewDidUnload 中(取决于您如何实现它),不要忘记删除观察者。

    [scrollView removeObserver:self forKeyPath:@"contentOffset"];   

希望这会有所帮助,您可能会注意到一些开销,但在我的实现中,我还支持一次滚动 5 页(嗯......无限)和自动动画滚动等,所以您可能会看到一些可以扔掉的东西。

关于iphone - UIScrollView。关于实现 "infinite"滚动/缩放有什么想法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1493950/

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