【发布时间】:2021-01-20 19:58:42
【问题描述】:
我在我的应用程序中使用 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 的主示例,但似乎不能满足我的要求并且过于复杂。 欢迎任何帮助/建议。
谢谢。
【问题讨论】:
标签: ios uicollectionview agora.io