在UICollectionView的最后一项上显示视图控制器

时间:2016-01-13 09:42:56

标签: ios swift uicollectionview message uiedgeinsets

我正在制作简单的聊天应用程序,因此当用户点击聊天列表中的特定聊天时,他必须转到此特定聊天室中的最后一条消息(如电报中)。 我试图创建自己的scrollToBottom函数:

func scrollToBottom(animated animated: Bool) {

    if self.collectionView.numberOfSections() == 0 {
        return
    }

    if self.collectionView.numberOfItemsInSection(0) == 0 {
        return
    }

    let collectionViewContentHeight = self.collectionView.collectionViewLayout.collectionViewContentSize().height
    let isContentTooSmall = collectionViewContentHeight < CGRectGetHeight(self.collectionView.bounds)

    if isContentTooSmall {

        self.collectionView.scrollRectToVisible(CGRectMake(0, collectionViewContentHeight - 1, 1, 1), animated: animated)
        return
    }

    let finalRow = max(0, self.collectionView.numberOfItemsInSection(0) - 1)
    let finalIndexPath = NSIndexPath(forRow: finalRow, inSection: 0)
    let finalCellSize = self.collectionView.messagesCollectionViewLayout.sizeForItem(finalIndexPath)

    let maxHeightForVisibleMessage = self.collectionView.bounds.height - self.collectionView.contentInset.top
    let scrollPosition: UICollectionViewScrollPosition = finalCellSize.height > maxHeightForVisibleMessage ? .Bottom : .Top

    self.collectionView.scrollToItemAtIndexPath(finalIndexPath, atScrollPosition: scrollPosition, animated: animated)
}

但是当我在viewWillAppear中调用它时,我会在跳转到聊天室的最后一行之前得到一点延迟,这是不好的。请帮忙!

3 个答案:

答案 0 :(得分:1)

viewWillAppear将在viewDidLoad之后调用。如果在启动viewcontroller后需要调用此方法,则可以在viewDidload方法中添加代码。 但是如果你仍然需要使用viewWillAppear,我建议将这个调用包装在主线程或mainqueue上。您可以使用GCD或NSOperationQueue。

我认为这可能有助于延迟问题

答案 1 :(得分:0)

如果聊天消息在UITableView上呈现,请使用功能

    self.tableView scrollToRowAtIndexPath:<#(nonnull NSIndexPath *)#> atScrollPosition:<#(UITableViewScrollPosition)#> animated:<#(BOOL)#>

此方法将以良好的动画移动内容。

答案 2 :(得分:0)

感谢@Sabby,我将此代码添加到viewWillAppear,并以某种方式工作

    let delayTime = dispatch_time(DISPATCH_TIME_NOW, 0)
    dispatch_after(delayTime,dispatch_get_main_queue()) {
        self.collectionView.contentInset.bottom = 40.0
        self.scrollToBottom(animated: false)
    }