像WhatsApp Chat一样滚动到顶部,滚动进一步显示“Archived Chats”

时间:2016-11-07 13:32:09

标签: swift uitableview

只是没有得到正确的搜索词,但我的问题是如何实现这个tableview功能,我可以滚动到顶部,但只有在进一步滚动到顶部时,第一行顶部会出现一行。

WhatsApp用于显示“存档聊天”的类似功能,此处滚动到您的聊天列表,进一步滚动显示存档聊天。

我正在使用swift 2.3

谢谢

3 个答案:

答案 0 :(得分:1)

也许有点晚了,但是在这里,您有一个变通方法(objective-c)来复制whatsapp归档的聊天滚动进一步的功能:

我使用两个布尔值来确定表视图是否位于顶部,以及是否可以看到已存档的聊天行。

var a = {
    "id": "ABCD",
    "description": "some info",
    "parents": [], //no parents
    "children": []
};
var b = {
    "id": "EFG",
    "description": "more info",
    "parents": [],
    "children": []
};
var c = {
    "id": "LMNOP",
    "description": "something",
    "parents": [],
    "children": []
};
var d = {
    "id": "XYZ",
    "description": "something",
    "parents": [],
    "children": [] //no child nodes
};

a.children.push(b);
b.parents.push(a); 
//and so on.

var network = [a,b,c,d];

然后使用这些布尔来使用滚动视图委托,插入或删除用于显示存档聊天单元的部分。

@property (assign, nonatomic) BOOL isArchivedChatsRowVisible;
@property (assign, nonatomic) BOOL isScrollAtTop;

我希望它会有用

答案 1 :(得分:0)

@cmacera 答案的 Swift 5 版本。我已选择使用 tableHeaderView 来实现相同的结果。

向他们致敬,一个很好的简单解决方案。现在在 Swift 中。

状态变量:

var isArchivedChatsRowVisible: Bool = false
var isScrollAtTop: Bool = true

滚动视图委托方法。

override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.y > 0 {
        isScrollAtTop = false
    }
}

override func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    isScrollAtTop = scrollView.contentOffset.y > 0 ? false : true
}

override func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.y > 0, isArchivedChatsRowVisible {
        isScrollAtTop = false
        isArchivedChatsRowVisible = false
        tableView.beginUpdates()
        tableView.tableHeaderView = nil
        tableView.endUpdates()
    }
    if isScrollAtTop, scrollView.contentOffset.y < 0, !isArchivedChatsRowVisible {
        isArchivedChatsRowVisible = true
        tableView.beginUpdates()
        tableView.tableHeaderView = archivedChatHeaderView
        tableView.endUpdates()
    }
}

答案 2 :(得分:-1)

您可以实现UIScrollview的委托方法scrollViewDidScroll。如果您将tableview的委托设置为self,或者您已实施或确认UITableViewDelegate,那么您将自动符合UIScrollViewDelegate protocall,因为UITableViewDelegate实施了UIScrollViewDelegate

scrollViewDidScroll

 -(void)scrollViewDidScroll:(UIScrollView *)scrollView{


    UITableView *tab = (UITableView *)scrollView;

    if (self.yourTableView == tab) {

            // Detect Scroll position and add button or do whatever you want
      }
 }