我正在尝试创建一个聊天 View ,其中消息从底部添加到顶部(如 facebook)。
View 有两种状态,第一种状态是不启用滚动(消息从底部到顶部添加,但当它们离开视口(viewport)时消失)
第二种状态让用户滚动到顶部以查看之前的消息。
不知道我说的清楚没有,截图如下:
您能解释一下如何以编程方式执行此操作吗?实际上,它在没有 UIScrollView 的情况下也能正常工作,但是当我试图让它在其中工作时,它就一团糟。
我尝试了很多不同的方法,但没有一个能正常工作......
我不明白为什么 ScrollView 这么难用,我从来没有见过任何语言的原生组件能像这样工作......
[编辑]
我面临的最后一个问题是,当我尝试隐藏每条消息(单元格)并返回到 TableView 的底部以便显示新消息时,我无法隐藏视口(viewport)之外的单元格。
代码如下:
- (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];
}
}
我试图通过 [self.chatTableView cellForRowAtIndexPath:i];
上的循环隐藏每个单元格,但它崩溃了,因为无法访问视口(viewport)外的单元格。
当显示键盘时我遇到了同样的问题,如果消息因为定时器而消失(消息在 X 秒后自动消失),当我隐藏它时,视口(viewport)外的消息仍然可见。
提前致谢!
最佳答案
我在类似的应用程序中很容易做到这一点......
首先,使用UITableView
。构建 TableView 是为了处理大量显示的项目。使用的内存只够在屏幕上显示所有内容。使用 ScrollView ,您必须将每个聊天记录加载到内存中并将其显示在屏幕上。如果有数以千计的消息,那将占用大量内存并可能导致应用程序运行缓慢或崩溃。
将其编码为从上到下工作,就像普通的 UITableView
一样。第 0 行位于顶部,其中包含最新聊天消息的内容。然后第 1 行和第 2 行等等...
然后这样做...
self.tableView.transform = CGAffineTransformMakeRotation(M_PI);
这会将表格 View 及其所有内容旋转 180 度,因此现在最新聊天位于底部,但所有单元格都颠倒了。
因此,在 cell 子类中的 init 方法中执行此操作...
self.contentView.transform = CGAffineTransformMakeRotation(M_PI);
这也会将单元格的内容旋转 180 度。这会将单元格的内容再次以正确的方式向上放置。
所以现在,在 2 行代码中你就得到了你正在寻找的东西:)
关于iOS UIScrollView 以编程方式从下到上添加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35013205/