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

标签 ios objective-c uiscrollview chat

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

View 有两种状态,第一种状态是不启用滚动(消息从底部到顶部添加,但当它们离开视口(viewport)时消失)

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

不知道我说的清楚没有,截图如下:

Chat message 1
Chat message 2

您能解释一下如何以编程方式执行此操作吗?实际上,它在没有 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/

相关文章:

ios - Swift - 以编程方式从 Storyboard 添加自定义颜色

ios - 将 float 组写入音频文件

ios - 如何使我的表格 View 看起来更像 iOS 设置应用程序中的表格 View ?

objective-c - 将 NSTextView 的内容保存为纯文本文件

ios - UIScrollView性能问题

ios - 如何停止设备方向改变

ios - Restkit POST ManagedObjectRequestOperation 或 ObjectRequestOperation?

ios - 在 Objective C 中检查 Swift ViewController 的 isKindOfClass 方法

ios - UIScrollView scrollRectToVisible :animated: not taking rect into account on iOS7

ios - 在横向模式下,如何强制 UIAlertView 显示完整消息而不滚动?