1

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

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

我该怎么做呢?

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

4

2 回答 2

0

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

于 2012-07-17T02:29:59.980 回答
0

将以这种方式重申这个问题:如何在不移动已经存在的内容的情况下将内容添加到 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);
}
于 2012-07-17T02:47:09.520 回答