iOS UIScrollView以编程方式从下到上添加元素

时间:2016-01-26 11:49:56

标签: ios objective-c uiscrollview chat

我正在尝试创建一个聊天视图,其中消息从底部添加到顶部(如facebook)。

视图有2个状态,第一个状态没有启用滚动(消息从底部添加到顶部但是当它们离开视口时消失)

第二个状态让用户滚动到顶部以查看之前的消息。

我不知道我是否清楚,这里有一些截图:

Chat message 1
Chat message 2

您能解释一下如何以编程方式执行此操作吗?实际上,它在没有UIScrollView的情况下工作,但是当我试图让它在其中工作时,它就是一团糟。

我尝试了很多不同的方法,但都没有正常工作......

我不明白为什么ScrollView如此难以使用,我从未在任何语言中看到过这样的本机组件......

[编辑]
我面临的最后一个问题是,当我尝试隐藏每条消息(单元格)并返回到TableView的底部时,显示新消息我无法隐藏视口之外的单元格。 / p>

以下是代码:

$query = DB::table("dbQuotes")
         ....
         ->first();
$passedvaluehere = $query->act_id;

我试图在- (void)disableScrollAndHideMessages { [self.chatTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:NO]; self.chatTableView.scrollEnabled = NO; self.chatTableView.bounces = NO; // hide messages for (ChatMessageViewCell *messageViewCell in visibleCells) { [messageViewCell hide]; } } 上使用循环隐藏每个单元格,但它会崩溃,因为视口外的单元格无法访问。

当显示键盘时我遇到了同样的问题,如果消息由于计时器而消失(消息在X秒后自动消失)显示,当我隐藏它时,消息从视口中出来了仍然可见。

提前致谢!

2 个答案:

答案 0 :(得分:2)

我在类似的应用程序中很容易做到这一点......

首先,使用UITableView。构建表视图以处理正在显示的大量项目。使用的内存仅足以显示屏幕上的所有内容。使用滚动视图,您必须将每个聊天内容加载到内存中并将其放在屏幕上。如果有数千条消息需要大量内存,并且可能是缓慢或崩溃的应用程序。

将其编码为从上到下工作,就像普通UITableView一样。行0位于顶部,包含最新聊天消息的内容。然后是第1行和第2行,依此类推......

然后这样做......

self.tableView.transform = CGAffineTransformMakeRotation(M_PI);

这会将tableview及其所有内容旋转180度,所以现在最新的聊天位于底部,但所有单元格都是颠倒的。

因此,在单元子类中,在init方法中执行此操作...

self.contentView.transform = CGAffineTransformMakeRotation(M_PI);

这也将细胞的内容旋转180度。这使得单元格的内容再次正确。

现在,在2行代码中,您可以找到您正在寻找的内容:)

答案 1 :(得分:0)

要完成这项工作,您应该通过新消息的高度加上间距来增加scrollView的contentView的大小,在scrollView的contentView中获取最后一条消息的位置并添加新消息相对于那个。你可以这样做:

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width ,scrollView.contentSize.height + newMessageView.frame.size.height + spacing);
newMessageView.frame = CGRectMake(x, lastMessageView.frame.origin.y + spacing, newMessageView.frame.size.width, newMessageView.frame.size.height);
[scrollView addSubView:newMessageView];