将 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 的顶部的主要内容,如果未能解决你的问题,请参考以下文章
将 UIView(来自情节提要)修复到 UITableView 的顶部
将图像从 UIScrollView 移动到 UIView - Swift 4 PanGesture