将UIView附加到UIScrollView的顶部

时间:2012-07-17 02:21:35

标签: iphone objective-c ios ipad

例如在Tweetbot的iPhone应用程序中。当你打开应用程序并且新的推文进来时,它将被附加到UIScrollView的顶部,你看到的当前推文没有得到刷新。我怎样才能达到同样的效果呢?假设我有一个UIScrollView,UIVc从View 10,10开始添加到UIScrollView。

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

我该怎么做?

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

2 个答案:

答案 0 :(得分:0)

如果你设置contentOffset没有动画,那么就不会有可见的滚动动画。因此,如果您的新视图高度为200点,则可以将新视图的原点设置为(10,10),将旧视图设置为(10,210)并将滚动视图的contentOffset设置为(10,210)达到你想要的效果。您还需要将滚动视图的contentSize增加到足以包含其包含的所有内容。

答案 1 :(得分:0)

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

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

- (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);
}