例如在Tweetbot的iPhone应用程序中。当你打开应用程序并且新的推文进来时,它将被附加到UIScrollView的顶部,你看到的当前推文没有得到刷新。我怎样才能达到同样的效果呢?假设我有一个UIScrollView,UIVc从View 10,10开始添加到UIScrollView。
然后我下载了一些项目,我想把它放在10,10 ..所以我基本上需要将这个旧项目在10,10向右移动?如果我这样做,那么在移动用户期间会看到它移动,这不是我想要的效果。在Tweetbot的应用程序中,似乎没有任何东西被转移,只是你将区域扩展到10,10以上并添加新东西。
我该怎么做?
基本上我想在UIScrollView中实现insertRowAtIndexPath。
答案 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);
}