将 UIView 附加到 UIScrollView 的顶部

Posted

技术标签:

【中文标题】将 UIView 附加到 UIScrollView 的顶部【英文标题】:append UIView's to the top of a UIScrollView 【发布时间】:2012-07-17 02:21:34 【问题描述】:

例如在 Tweetbot 的 iPhone 应用中。当你打开应用程序和新的推文进来时,它只会被附加到 UIScrollView 的顶部,你看到的当前推文没有被刷新。我怎样才能达到同样的效果?假设我有一个 UIScrollView,其中一个 UIView 从原点 10,10 添加到 UIScrollView。

然后我下载了一些项目,我想把它放在 10,10.. 所以我基本上需要把这个旧项目移到 10,10 对吗?如果我这样做了,那么在转换期间用户会看到它发生了变化,这不是我想要的效果。就像在 Tweetbot 的应用程序中一样,似乎没有任何变化,只是您将区域扩大到 10,10 以上并在那里添加新内容。

我该怎么做?

基本上我想在 UIScrollView 中实现 insertRowAtIndexPath。

【问题讨论】:

【参考方案1】:

将以这种方式重申问题:如何在不移动已经存在的内容的情况下将内容添加到 UIScrollView 的顶部(相对于它的当前偏移量)。

如果这是正确的问题,正确的答案是按照您的建议进行添加并向下移动,然后滚动与添加的内容相同的高度,从而产生旧内容没有移动的错觉。

- (void)insertRowAtTop 

    // not showing insert atIndexPath because I don't know how you have your subviews indexed
    // inserting at the top, we can just shift everything down.  you can extend this idea to
    // the middle but it requires that you can translate from rows to y-offsets to views

    // shift everything down
    for (UIView *view in self.scrollView.subviews) 
        if ([view isKindOfClass:[MyScrollViewRow self]]) 
            MyScrollViewRow *row = (MyScrollViewRow *)view;          // all this jazz so we don't pick up the scroll thumbs
            row.frame = CGRectOffset(row.frame, 0.0, kROW_HEIGHT);   // this is a lot easier if row height is constant
        
    
    MyScrollViewRow *newRow = [[MyScrollViewRow alloc] initWithFrame:CGRectMake(0.0,0.0,320.0,kROW_HEIGHT)];
    // init newRow
    [self.scrollView addSubview:newRow];

    // now for your question.  scroll everything so the user perceives that the existing rows remained still
    CGPoint currentOffset = self.scrollView.contentOffset
    self.scrollView.contentOffset = CGPointMake(currentOffset.x, currentOffset.y + kROW_HEIGHT);

【讨论】:

【参考方案2】:

如果您设置contentOffset 而不设置动​​画,则不会有可见的滚动动画。因此,如果您的新视图高 200 点,您可以将新视图的原点设置为 (10,10),将旧视图的原点设置为 (10,210),并将滚动视图的 contentOffset 设置为 (10,210),您应该实现你想要的效果。您还需要将滚动视图的contentSize 增大到足以容纳它包含的所有内容。

【讨论】:

以上是关于将 UIView 附加到 UIScrollView 的顶部的主要内容,如果未能解决你的问题,请参考以下文章

Swift:通过 UIView 识别滚动

将 UIScrollView 适配到 UIView

将 UIView(来自情节提要)修复到 UITableView 的顶部

将图像从 UIScrollView 移动到 UIView - Swift 4 PanGesture

将捏合手势从自定义 UIView 传递到父 UIScrollView

将 UIView 从 xib 添加到 UIScrollView