在 UICollectionView 的最后一项上呈现视图控制器
Present view controller on last item of UICollectionView
我正在制作简单的聊天应用程序,因此当用户点击聊天列表中的特定聊天时,他必须转到该特定聊天室中的最后一条消息(例如在 Telegram 中)。
我尝试创建自己的 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 中调用它时,在它跳到聊天室的最后一行之前我有一点延迟,这不太好。请帮忙!
如果聊天消息在 UITableView
上呈现,请使用函数
self.tableView scrollToRowAtIndexPath:<#(nonnull NSIndexPath *)#> atScrollPosition:<#(UITableViewScrollPosition)#> animated:<#(BOOL)#>
此方法将以良好的动画移动内容。
viewWillAppear 将在 viewDidLoad 之后调用。如果您需要在 viewcontroller 启动后调用此方法,则可以在 viewDidload 方法中添加代码。
但如果你仍然需要使用 viewWillAppear,我建议将这个调用包装在主线程或 mainqueue 上。您可以为此使用 GCD 或 NSOperationQueue。
我认为这可能有助于解决延迟问题
感谢@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)
}
我正在制作简单的聊天应用程序,因此当用户点击聊天列表中的特定聊天时,他必须转到该特定聊天室中的最后一条消息(例如在 Telegram 中)。 我尝试创建自己的 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 中调用它时,在它跳到聊天室的最后一行之前我有一点延迟,这不太好。请帮忙!
如果聊天消息在 UITableView
上呈现,请使用函数
self.tableView scrollToRowAtIndexPath:<#(nonnull NSIndexPath *)#> atScrollPosition:<#(UITableViewScrollPosition)#> animated:<#(BOOL)#>
此方法将以良好的动画移动内容。
viewWillAppear 将在 viewDidLoad 之后调用。如果您需要在 viewcontroller 启动后调用此方法,则可以在 viewDidload 方法中添加代码。 但如果你仍然需要使用 viewWillAppear,我建议将这个调用包装在主线程或 mainqueue 上。您可以为此使用 GCD 或 NSOperationQueue。
我认为这可能有助于解决延迟问题
感谢@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)
}