如何解决AgoraKit Agora.io 在`UICollectionViewCell` 中的`videoView`,重新加载问题
我在我的应用程序中使用 agora kit v3.0.1 进行视频通话。由于我想改变视频通话视图的布局,我决定使用集合视图。
我在使用 collectionView 时遇到的问题是,每次使用 collectionView 的 reloadData() 方法时,agora 的 videoView 都会出现黑屏。我设法让它工作的唯一方法是调用 collectionView 的 deleteItems
和 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的master example,但似乎不能满足我的要求,而且太复杂了。 欢迎提供任何帮助/建议。
谢谢。
解决方法
我使用集合视图来显示该项目中没有问题的视频源: https://github.com/AgoraIO-Community/iOS-UIKit/blob/main/Sources/Agora-UIKit/AgoraCollectionViewer.swift
在此示例中,每个发言者只存在一个画布,并且使用 willDisplay cell
委托方法将 canvas.view 设置为单元格的子视图。
我认为您正在创建一个新画布并将其设置为与前一个画布相同的用户 ID,而不是保留记录。您不能让两个画布呈现来自同一用户的提要,所以这可能就是您获得空白屏幕的原因。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。