ios - AgoraKit Agora.io `UICollectionViewCell` 中的`videoView`,重新加载问题
问题描述
我在我的应用程序中使用 agora kit v3.0.1 进行视频通话。由于我想更改视频通话视图的布局,我决定使用集合视图。
我在使用 collectionView 时遇到的问题是每次使用 collectionView 的 reloadData() 方法时,agora 的 videoView 都会出现黑屏。我设法使它工作的唯一方法是调用collectionViewdeleteItems
的insertRows
方法。但由于数据源与集合视图更新后的数据源不匹配,此方法经常崩溃。有什么方法可以使用 reloadData() 方法而不会出现黑屏?
这是代码cellForRow
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "VideoCallCollectionViewCell", for: indexPath) as! VideoCallCollectionViewCell
cell.delegate = self.delegate
cell.videoCallLayout = videoCallLayout
if let quizChannel = quizChannel, let membersInfo = quizChannel.members_info {
// set channel to cell
cell.quizChannel = quizChannel
let memberInfo = membersInfo[indexPath.item]
// set memberInfo to cell
cell.memberInfo = memberInfo
if let remoteID = memberInfo.uid {
// set agora video view to cell
let videoCanvas = AgoraRtcVideoCanvas()
videoCanvas.uid = UInt(remoteID)
videoCanvas.view = cell.videoView
videoCanvas.renderMode = .hidden
if let user_channel_id = quizChannel.user_channel_id, remoteID == user_channel_id {
// if local video view
agoraKit?.setupLocalVideo(videoCanvas)
} else {
// if remote video view
agoraKit?.setupRemoteVideo(videoCanvas)
}
}
}
return cell
}
每当有任何人uid
加入或离开频道时,我都会调用此函数
func insertOrRemoveParticipantsWithNewQuizChannel(quizChannel: QuizChannel, uid: UInt?, action: String?) {
if let uid = uid {
// insert of remove new member
print("Agora uid != nil : \(uid)")
if let existingMemberInfo = self.quizChannel.members_info, existingMemberInfo.count != 0 {
print("Agora existingMemberInfo count != 0 : \(uid)")
if let action = action {
self.quizChannel = quizChannel
if action == "remove" {
if let index = existingMemberInfo.firstIndex(where: { (memberInfo) -> Bool in
return memberInfo.uid ?? 0 == uid
}) {
// member's video view index found
// remove member from the memberInfo
let newMemberInfo = quizChannel.members_info?.filter({ (memberInfo) -> Bool in
return memberInfo.uid ?? 0 != uid
})
// set new memberInfo
self.quizChannel.members_info = newMemberInfo
// remove member from the collectionview, FREQUENT CRASH
collectionView.deleteItems(at: [IndexPath(item: index, section: 0)])
}
} else if action == "add" {
if let memberInfos = quizChannel.members_info {
// for all members
for (index, memberInfo) in memberInfos.enumerated() {
// if cell corresponding to this member is nil
if collectionView.visibleCells.first(where: { (cell) -> Bool in
if let cell = cell as? VideoCallCollectionViewCell {
return cell.memberInfo?.uid == memberInfo.uid
}
return false
}) == nil {
// insert a new cell, FREQUENT CRASH
collectionView.insertItems(at: [IndexPath(item: index, section: 0)])
}
}
}
}
// update rest of the cell's UI based in quiz channel
updateAllCellsUIForQuizChannel(quizChannel: quizChannel)
}
} else {
print("Agora existingMemberInfo count == 0 : \(uid))")
// no members yet reload the collectionview
self.quizChannel = quizChannel
collectionView.reloadData()
}
} else {
print("Agora uid == nil)")
// update view of cells for admin flow change, WORKS FINE
updateAllCellsUIForQuizChannel(quizChannel: quizChannel)
}
}
上述方法在删除或插入新单元格时经常兑现。
或者
有没有其他方法来实现具有灵活布局的 Agora 套件?我已经在 github 上尝试过 Agora 的主示例,但似乎不能满足我的要求并且太复杂了。欢迎任何帮助/建议。
谢谢。
解决方案
我在这个项目中使用集合视图来显示视频源,没有问题: https ://github.com/AgoraIO-Community/iOS-UIKit/blob/main/Sources/Agora-UIKit/AgoraCollectionViewer.swift
在此示例中,每个发言者仅存在一个画布,并且使用willDisplay cell
委托方法将 canvas.view 设置为单元格的子视图。
我认为您正在创建一个新画布并将其设置为与前一个画布相同的用户 ID,而不是保留记录。您不能让两个画布呈现来自同一用户的提要,因此这可能就是您得到一个空白屏幕的原因。
推荐阅读
- javascript - 由于某种原因,掷骰子游戏变量未定义
- jenkins - 将“本地”Jenkins 的最新构建工件发布到 Azure DevOps Release Pipeline?
- c# - 如何查看另一个字符串列表中是否包含(不等于)字符串列表
- python - 对列中的每一行应用数据清洗日期函数
- python - 当我使用 MNIST 数据集时,它有一个错误
- little-man-computer - LMC:包括从十进制到基数 9 的基本转换
- kendo-ui - 剑道网格编辑弹出 mvvm 绑定似乎失败
- r - 如何为绘图上的每个因素添加回归线
- php - 如何修改不带附件发送消息的代码?
- php - Asgardcms - 未定义变量:创建新博客文章时的媒体