我正在尝试创建一个聊天视图,其中消息从底部添加到顶部(如facebook)。
视图有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秒后自动消失)显示,当我隐藏它时,消息从视口中出来了仍然可见。
提前致谢!
答案 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];